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

[01/32] cayenne git commit: cgen. create ui

Repository: cayenne
Updated Branches:
  refs/heads/master 1edb4ee4c -> b580bdad3


http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..c3fff72
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
@@ -0,0 +1,71 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.pref.PreferenceDetail;
+
+import java.awt.*;
+import java.util.Collection;
+
+/**
+ */
+public class GeneratorTabController extends CayenneController {
+
+    public static final String GENERATOR_PROPERTY = "generator";
+
+    protected GeneratorTabPanel view;
+    protected PreferenceDetail preferences;
+
+    protected CustomModeController customModeController;
+
+    public GeneratorTabController(CodeGeneratorControllerBase parent) {
+        super(parent);
+        customModeController = new CustomModeController(parent);
+        this.view = new GeneratorTabPanel(customModeController.getView());
+    }
+
+    public void startup(DataMap dataMap){
+        customModeController.startup(dataMap);
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    protected CodeGeneratorControllerBase getParentController() {
+        return (CodeGeneratorControllerBase) getParent();
+    }
+
+    public PreferenceDetail getPreferences() {
+        return preferences;
+    }
+
+    public GeneratorController getGeneratorController() {
+        return customModeController;
+    }
+
+    public Collection<ClassGenerationAction> getGenerator() {
+        GeneratorController modeController = getGeneratorController();
+        return (modeController != null) ? modeController.createGenerator() : null;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
new file mode 100644
index 0000000..40249f4
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -0,0 +1,33 @@
+/*****************************************************************
+ *   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 javax.swing.*;
+import java.awt.*;
+
+/**
+ */
+public class GeneratorTabPanel extends JPanel {
+
+    public GeneratorTabPanel(Component modePanels) {
+        setLayout(new BorderLayout());
+        add(modePanels, BorderLayout.CENTER);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..71d95e4
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
@@ -0,0 +1,79 @@
+/*****************************************************************
+ *   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;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
index 716c3ee..705b7e9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
@@ -25,6 +25,7 @@ import org.apache.cayenne.configuration.xml.XMLReaderProvider;
 import org.apache.cayenne.dbsync.xml.DbImportExtension;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
+import org.apache.cayenne.gen.xml.CgenExtension;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.DefaultActionManager;
@@ -56,6 +57,7 @@ public class CayenneModelerModule implements Module {
         ProjectModule.contributeExtensions(binder)
                 .add(InfoExtension.class)
                 .add(GraphExtension.class)
-                .add(DbImportExtension.class);
+                .add(DbImportExtension.class)
+                .add(CgenExtension.class);
     }
 }


[15/32] cayenne git commit: Cgen tab, cgen configuration, cgen in maven, ant, gradle.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
index 1d8d4f9..a9816e0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
@@ -1,209 +1,209 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-public class CustomPreferencesUpdater {
-
-    enum Property {
-        SUBCLASS_TEMPLATE,
-        SUPERCLASS_TEMPLATE,
-        OVERWRITE,
-        PAIRS,
-        USE_PACKAGE_PATH,
-        MODE,
-        OUTPUT_PATTERN,
-        CREATE_PROPERTY_NAMES,
-        CREATE_PK_PROPERTIES
-    }
-
-    private static final String OVERWRITE = "overwrite";
-    private static final String PAIRS = "pairs";
-    private static final String USE_PACKAGE_PATH = "usePackagePath";
-    private static final String MODE = "mode";
-    private static final String OUTPUT_PATTERN = "outputPattern";
-    private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
-    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
-
-    private Map<DataMap, DataMapDefaults> mapPreferences;
-
-
-    public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences) {
-        this.mapPreferences = mapPreferences;
-    }
-
-    public String getMode() {
-        return (String) getProperty(Property.MODE);
-    }
-
-    public void setMode(String mode) {
-        updatePreferences(Property.MODE, mode);
-    }
-
-    public String getSubclassTemplate() {
-        return (String) getProperty(Property.SUBCLASS_TEMPLATE);
-    }
-
-    public void setSubclassTemplate(String subclassTemplate) {
-        updatePreferences(Property.SUBCLASS_TEMPLATE, subclassTemplate);
-    }
-
-    public String getSuperclassTemplate() {
-        return (String) getProperty(Property.SUPERCLASS_TEMPLATE);
-    }
-
-    public void setSuperclassTemplate(String superclassTemplate) {
-        updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);
-    }
-
-    public Boolean getOverwrite() {
-        return (Boolean) getProperty(Property.OVERWRITE);
-    }
-
-    public void setOverwrite(Boolean overwrite) {
-        updatePreferences(Property.OVERWRITE, overwrite);
-    }
-
-    public Boolean getPairs() {
-        return (Boolean) getProperty(Property.PAIRS);
-    }
-
-    public void setPairs(Boolean pairs) {
-        updatePreferences(Property.PAIRS, pairs);
-    }
-
-    public Boolean getUsePackagePath() {
-        return (Boolean) getProperty(Property.USE_PACKAGE_PATH);
-    }
-
-    public void setUsePackagePath(Boolean usePackagePath) {
-        updatePreferences(Property.USE_PACKAGE_PATH, usePackagePath);
-    }
-
-    public String getOutputPattern() {
-        return (String) getProperty(Property.OUTPUT_PATTERN);
-    }
-
-    public void setOutputPattern(String outputPattern) {
-        updatePreferences(Property.OUTPUT_PATTERN, outputPattern);
-    }
-
-    public Boolean getCreatePropertyNames() {
-        return (Boolean) getProperty(Property.CREATE_PROPERTY_NAMES);
-    }
-
-    public void setCreatePropertyNames(Boolean createPropertyNames) {
-        updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
-    }
-
-    public Boolean getCreatePKProperties() {
-        return (Boolean) getProperty(Property.CREATE_PK_PROPERTIES);
-    }
-
-    public void setCreatePKProperties(Boolean createPKProperties) {
-        updatePreferences(Property.CREATE_PK_PROPERTIES, createPKProperties);
-    }
-
-    private Object getProperty(Property property) {
-        Object obj = null;
-
-        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-
-            switch (property) {
-                case MODE:
-                    obj = entry.getValue().getProperty(MODE);
-                    break;
-                case OUTPUT_PATTERN:
-                    obj = entry.getValue().getProperty(OUTPUT_PATTERN);
-                    break;
-                case SUBCLASS_TEMPLATE:
-                    obj = entry.getValue().getSubclassTemplate();
-                    break;
-                case SUPERCLASS_TEMPLATE:
-                    obj = entry.getValue().getSuperclassTemplate();
-                    break;
-                case OVERWRITE:
-                    obj = entry.getValue().getBooleanProperty(OVERWRITE);
-                    break;
-                case PAIRS:
-                    obj = entry.getValue().getBooleanProperty(PAIRS);
-                    break;
-                case USE_PACKAGE_PATH:
-                    obj = entry.getValue().getBooleanProperty(USE_PACKAGE_PATH);
-                    break;
-                case CREATE_PROPERTY_NAMES:
-                    obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
-                    break;
-                case CREATE_PK_PROPERTIES:
-                    obj = entry.getValue().getBooleanProperty(CREATE_PK_PROPERTIES);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Bad type property: " + property);
-            }
-
-        }
-        return obj;
-    }
-
-    private void updatePreferences(Property property, Object value) {
-        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-
-            switch (property) {
-                case MODE:
-                    entry.getValue().setProperty(MODE, (String) value);
-                    break;
-                case OUTPUT_PATTERN:
-                    entry.getValue().setProperty(OUTPUT_PATTERN, (String) value);
-                    break;
-                case SUBCLASS_TEMPLATE:
-                    entry.getValue().setSubclassTemplate((String) value);
-                    break;
-                case SUPERCLASS_TEMPLATE:
-                    entry.getValue().setSuperclassTemplate((String) value);
-                    break;
-                case OVERWRITE:
-                    entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);
-                    break;
-                case PAIRS:
-                    entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);
-                    break;
-                case USE_PACKAGE_PATH:
-                    entry.getValue().setBooleanProperty(USE_PACKAGE_PATH, (Boolean) value);
-                    break;
-                case CREATE_PROPERTY_NAMES:
-                    entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
-                    break;
-                case CREATE_PK_PROPERTIES:
-                    entry.getValue().setBooleanProperty(CREATE_PK_PROPERTIES, (Boolean) value);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Bad type property: " + property);
-            }
-        }
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.modeler.pref.DataMapDefaults;
+//
+//import java.util.Map;
+//import java.util.Map.Entry;
+//import java.util.Set;
+//
+//public class CustomPreferencesUpdater {
+//
+//    enum Property {
+//        SUBCLASS_TEMPLATE,
+//        SUPERCLASS_TEMPLATE,
+//        OVERWRITE,
+//        PAIRS,
+//        USE_PACKAGE_PATH,
+//        MODE,
+//        OUTPUT_PATTERN,
+//        CREATE_PROPERTY_NAMES,
+//        CREATE_PK_PROPERTIES
+//    }
+//
+//    private static final String OVERWRITE = "overwrite";
+//    private static final String PAIRS = "pairs";
+//    private static final String USE_PACKAGE_PATH = "usePackagePath";
+//    private static final String MODE = "mode";
+//    private static final String OUTPUT_PATTERN = "outputPattern";
+//    private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
+//    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
+//
+//    private Map<DataMap, DataMapDefaults> mapPreferences;
+//
+//
+//    public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences) {
+//        this.mapPreferences = mapPreferences;
+//    }
+//
+//    public String getMode() {
+//        return (String) getProperty(Property.MODE);
+//    }
+//
+//    public void setMode(String mode) {
+//        updatePreferences(Property.MODE, mode);
+//    }
+//
+//    public String getSubclassTemplate() {
+//        return (String) getProperty(Property.SUBCLASS_TEMPLATE);
+//    }
+//
+//    public void setSubclassTemplate(String subclassTemplate) {
+//        updatePreferences(Property.SUBCLASS_TEMPLATE, subclassTemplate);
+//    }
+//
+//    public String getSuperclassTemplate() {
+//        return (String) getProperty(Property.SUPERCLASS_TEMPLATE);
+//    }
+//
+//    public void setSuperclassTemplate(String superclassTemplate) {
+//        updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);
+//    }
+//
+//    public Boolean getOverwrite() {
+//        return (Boolean) getProperty(Property.OVERWRITE);
+//    }
+//
+//    public void setOverwrite(Boolean overwrite) {
+//        updatePreferences(Property.OVERWRITE, overwrite);
+//    }
+//
+//    public Boolean getPairs() {
+//        return (Boolean) getProperty(Property.PAIRS);
+//    }
+//
+//    public void setPairs(Boolean pairs) {
+//        updatePreferences(Property.PAIRS, pairs);
+//    }
+//
+//    public Boolean getUsePackagePath() {
+//        return (Boolean) getProperty(Property.USE_PACKAGE_PATH);
+//    }
+//
+//    public void setUsePackagePath(Boolean usePackagePath) {
+//        updatePreferences(Property.USE_PACKAGE_PATH, usePackagePath);
+//    }
+//
+//    public String getOutputPattern() {
+//        return (String) getProperty(Property.OUTPUT_PATTERN);
+//    }
+//
+//    public void setOutputPattern(String outputPattern) {
+//        updatePreferences(Property.OUTPUT_PATTERN, outputPattern);
+//    }
+//
+//    public Boolean getCreatePropertyNames() {
+//        return (Boolean) getProperty(Property.CREATE_PROPERTY_NAMES);
+//    }
+//
+//    public void setCreatePropertyNames(Boolean createPropertyNames) {
+//        updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
+//    }
+//
+//    public Boolean getCreatePKProperties() {
+//        return (Boolean) getProperty(Property.CREATE_PK_PROPERTIES);
+//    }
+//
+//    public void setCreatePKProperties(Boolean createPKProperties) {
+//        updatePreferences(Property.CREATE_PK_PROPERTIES, createPKProperties);
+//    }
+//
+//    private Object getProperty(Property property) {
+//        Object obj = null;
+//
+//        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
+//        for (Entry<DataMap, DataMapDefaults> entry : entities) {
+//
+//            switch (property) {
+//                case MODE:
+//                    obj = entry.getValue().getProperty(MODE);
+//                    break;
+//                case OUTPUT_PATTERN:
+//                    obj = entry.getValue().getProperty(OUTPUT_PATTERN);
+//                    break;
+//                case SUBCLASS_TEMPLATE:
+//                    obj = entry.getValue().getSubclassTemplate();
+//                    break;
+//                case SUPERCLASS_TEMPLATE:
+//                    obj = entry.getValue().getSuperclassTemplate();
+//                    break;
+//                case OVERWRITE:
+//                    obj = entry.getValue().getBooleanProperty(OVERWRITE);
+//                    break;
+//                case PAIRS:
+//                    obj = entry.getValue().getBooleanProperty(PAIRS);
+//                    break;
+//                case USE_PACKAGE_PATH:
+//                    obj = entry.getValue().getBooleanProperty(USE_PACKAGE_PATH);
+//                    break;
+//                case CREATE_PROPERTY_NAMES:
+//                    obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
+//                    break;
+//                case CREATE_PK_PROPERTIES:
+//                    obj = entry.getValue().getBooleanProperty(CREATE_PK_PROPERTIES);
+//                    break;
+//                default:
+//                    throw new IllegalArgumentException("Bad type property: " + property);
+//            }
+//
+//        }
+//        return obj;
+//    }
+//
+//    private void updatePreferences(Property property, Object value) {
+//        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
+//        for (Entry<DataMap, DataMapDefaults> entry : entities) {
+//
+//            switch (property) {
+//                case MODE:
+//                    entry.getValue().setProperty(MODE, (String) value);
+//                    break;
+//                case OUTPUT_PATTERN:
+//                    entry.getValue().setProperty(OUTPUT_PATTERN, (String) value);
+//                    break;
+//                case SUBCLASS_TEMPLATE:
+//                    entry.getValue().setSubclassTemplate((String) value);
+//                    break;
+//                case SUPERCLASS_TEMPLATE:
+//                    entry.getValue().setSuperclassTemplate((String) value);
+//                    break;
+//                case OVERWRITE:
+//                    entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);
+//                    break;
+//                case PAIRS:
+//                    entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);
+//                    break;
+//                case USE_PACKAGE_PATH:
+//                    entry.getValue().setBooleanProperty(USE_PACKAGE_PATH, (Boolean) value);
+//                    break;
+//                case CREATE_PROPERTY_NAMES:
+//                    entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
+//                    break;
+//                case CREATE_PK_PROPERTIES:
+//                    entry.getValue().setBooleanProperty(CREATE_PK_PROPERTIES, (Boolean) value);
+//                    break;
+//                default:
+//                    throw new IllegalArgumentException("Bad type property: " + property);
+//            }
+//        }
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
index db8c872..4a5b5f6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
@@ -1,562 +1,561 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.gen.ArtifactsGenerationMode;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-import org.apache.cayenne.modeler.pref.FSPath;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.CodeValidationUtil;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.util.Util;
-import org.apache.cayenne.validation.BeanValidationFailure;
-import org.apache.cayenne.validation.SimpleValidationFailure;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.JTextField;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.prefs.Preferences;
-
-/**
- * A mode-specific part of the code generation dialog.
- *
- */
-public abstract class GeneratorController extends CayenneController {
-
-    protected String mode = ArtifactsGenerationMode.ALL.getLabel();
-    protected Map<DataMap, DataMapDefaults> mapPreferences;
-    private String outputPath;
-
-    public GeneratorController(CodeGeneratorControllerBase parent) {
-        super(parent);
-
-        createDefaults();
-        createView();
-        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
-    }
-
-    public String getOutputPath() {
-        return outputPath;
-    }
-
-    public void setOutputPath(String path) {
-        String old = this.outputPath;
-        this.outputPath = path;
-        if (this.outputPath != null && !this.outputPath.equals(old)) {
-            updatePreferences(path);
-        }
-    }
-
-    public void updatePreferences(String path) {
-        if (mapPreferences == null)
-            return;
-        Set<DataMap> keys = mapPreferences.keySet();
-        for (DataMap key : keys) {
-            mapPreferences
-                    .get(key)
-                    .setOutputPath(path);
-        }
-    }
-
-    public void setMapPreferences(Map<DataMap, DataMapDefaults> mapPreferences) {
-        this.mapPreferences = mapPreferences;
-    }
-
-    public Map<DataMap, DataMapDefaults> getMapPreferences() {
-        return this.mapPreferences;
-    }
-
-    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
-     * {@link #createGenerator()} method.
-     */
-    protected abstract ClassGenerationAction newGenerator();
-
-    /**
-     * Creates a class generator for provided selections.
-     */
-    public Collection<ClassGenerationAction> createGenerator() {
-
-        File outputDir = getOutputDir();
-
-        // no destination folder
-        if (outputDir == null) {
-            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
-            return null;
-        }
-
-        // 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<>();
-        for (DataMap map : getParentController().getDataMaps()) {
-            try {
-                ClassGenerationAction generator = newGenerator();
-
-                if(getParentController().getSelectedDataMaps().contains(map)) {
-                    mode = ArtifactsGenerationMode.ALL.getLabel();
-                } else {
-                    mode = ArtifactsGenerationMode.ENTITY.getLabel();
-                }
-
-                generator.setArtifactsGenerationMode(mode);
-                generator.setDataMap(map);
-
-                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());
-
-                Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
-
-                if (preferences != null) {
-                    generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
-
-                }
-
-//                generator.setDestDir(outputDir);
-                generator.setMakePairs(true);
-                generator.setForce(true);
-
-                generators.add(generator);
-            } catch (CayenneRuntimeException exception) {
-                JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
-                return null;
-            }
-        }
-
-        return generators;
-    }
-
-    public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
-        ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
-        if (embeddableFailure != null) {
-            validationBuffer.addFailure(embeddableFailure);
-            return;
-        }
-
-        for (EmbeddableAttribute attribute : embeddable.getAttributes()) {
-            ValidationFailure failure = validateEmbeddableAttribute(attribute);
-            if (failure != null) {
-                validationBuffer.addFailure(failure);
-                return;
-            }
-        }
-    }
-
-    private ValidationFailure validateEmbeddableAttribute(EmbeddableAttribute attribute) {
-        String name = attribute.getEmbeddable().getClassName();
-
-        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-                attribute.getName());
-        if (emptyName != null) {
-            return emptyName;
-        }
-
-        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-                attribute.getName());
-        if (badName != null) {
-            return badName;
-        }
-
-        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-                attribute.getType());
-        if (emptyType != null) {
-            return emptyType;
-        }
-
-        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-                attribute.getType());
-        if (badType != null) {
-            return badType;
-        }
-
-        return null;
-    }
-
-    private ValidationFailure validateEmbeddable(Embeddable embeddable) {
-
-        String name = embeddable.getClassName();
-
-        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className",
-                embeddable.getClassName());
-        if (emptyClass != null) {
-            return emptyClass;
-        }
-
-        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
-                embeddable.getClassName());
-        if (badClass != null) {
-            return badClass;
-        }
-
-        return null;
-    }
-
-    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity, boolean clientValidation) {
-
-        ValidationFailure entityFailure = validateEntity(clientValidation ? entity.getClientEntity() : entity);
-        if (entityFailure != null) {
-            validationBuffer.addFailure(entityFailure);
-            return;
-        }
-
-        for (ObjAttribute attribute : entity.getAttributes()) {
-            if (attribute instanceof EmbeddedAttribute) {
-                EmbeddedAttribute embeddedAttribute = (EmbeddedAttribute) attribute;
-                for (ObjAttribute subAttribute : embeddedAttribute.getAttributes()) {
-                    ValidationFailure failure = validateEmbeddedAttribute(subAttribute);
-                    if (failure != null) {
-                        validationBuffer.addFailure(failure);
-                        return;
-                    }
-                }
-            } else {
-
-                ValidationFailure failure = validateAttribute(attribute);
-                if (failure != null) {
-                    validationBuffer.addFailure(failure);
-                    return;
-                }
-            }
-        }
-
-        for (ObjRelationship rel : entity.getRelationships()) {
-            ValidationFailure failure = validateRelationship(rel, clientValidation);
-            if (failure != null) {
-                validationBuffer.addFailure(failure);
-                return;
-            }
-        }
-    }
-
-    private ValidationFailure validateEntity(ObjEntity entity) {
-
-        String name = entity.getName();
-
-        if (entity.isGeneric()) {
-            return new SimpleValidationFailure(name, "Generic class");
-        }
-
-        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className", entity.getClassName());
-        if (emptyClass != null) {
-            return emptyClass;
-        }
-
-        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
-                entity.getClassName());
-        if (badClass != null) {
-            return badClass;
-        }
-
-        if (entity.getSuperClassName() != null) {
-            ValidationFailure badSuperClass = BeanValidationFailure.validateJavaClassName(name, "superClassName",
-                    entity.getSuperClassName());
-            if (badSuperClass != null) {
-                return badSuperClass;
-            }
-        }
-
-        return null;
-    }
-
-    private ValidationFailure validateAttribute(ObjAttribute attribute) {
-
-        String name = attribute.getEntity().getName();
-
-        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-                attribute.getName());
-        if (emptyName != null) {
-            return emptyName;
-        }
-
-        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-                attribute.getName());
-        if (badName != null) {
-            return badName;
-        }
-
-        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-                attribute.getType());
-        if (emptyType != null) {
-            return emptyType;
-        }
-
-        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-                attribute.getType());
-        if (badType != null) {
-            return badType;
-        }
-
-        return null;
-    }
-
-    private ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
-
-        String name = attribute.getEntity().getName();
-
-        // validate embeddedAttribute and attribute names
-        // embeddedAttribute returned attibute as
-        // [name_embeddedAttribute].[name_attribute]
-        String[] attributes = attribute.getName().split("\\.");
-        String nameEmbeddedAttribute = attributes[0];
-        int beginIndex = attributes[0].length();
-        String attr = attribute.getName().substring(beginIndex + 1);
-
-        ValidationFailure emptyEmbeddedName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-                nameEmbeddedAttribute);
-        if (emptyEmbeddedName != null) {
-            return emptyEmbeddedName;
-        }
-
-        ValidationFailure badEmbeddedName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-                nameEmbeddedAttribute);
-        if (badEmbeddedName != null) {
-            return badEmbeddedName;
-        }
-
-        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name", attr);
-        if (emptyName != null) {
-            return emptyName;
-        }
-
-        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name", attr);
-        if (badName != null) {
-            return badName;
-        }
-
-        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-                attribute.getType());
-        if (emptyType != null) {
-            return emptyType;
-        }
-
-        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-                attribute.getType());
-        if (badType != null) {
-            return badType;
-        }
-
-        return null;
-    }
-
-    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
-
-        String name = relationship.getSourceEntity().getName();
-
-        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "relationship.name",
-                relationship.getName());
-        if (emptyName != null) {
-            return emptyName;
-        }
-
-        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "relationship.name",
-                relationship.getName());
-        if (badName != null) {
-            return badName;
-        }
-
-        if (!relationship.isToMany()) {
-
-            ObjEntity targetEntity = relationship.getTargetEntity();
-
-            if (clientValidation && targetEntity != null) {
-                targetEntity = targetEntity.getClientEntity();
-            }
-
-            if (targetEntity == null) {
-
-                return new BeanValidationFailure(name, "relationship.targetEntity", "No target entity");
-            } else if (!targetEntity.isGeneric()) {
-                ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name,
-                        "relationship.targetEntity.className", targetEntity.getClassName());
-                if (emptyClass != null) {
-                    return emptyClass;
-                }
-
-                ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name,
-                        "relationship.targetEntity.className", targetEntity.getClassName());
-                if (badClass != null) {
-                    return badClass;
-                }
-            }
-        }
-
-        return null;
-    }
-
-    /**
-     * Returns a predicate for default entity selection in a given mode.
-     */
-    public Predicate getDefaultClassFilter() {
-        return object -> {
-            if (object instanceof ObjEntity) {
-                return getParentController().getProblem(((ObjEntity) object).getName()) == null;
-            }
-
-            if (object instanceof Embeddable) {
-                return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
-            }
-
-            return false;
-        };
-    }
-
-    private File getOutputDir() {
-        String dir = ((GeneratorControllerPanel) getView()).getOutputFolder().getText();
-        return dir != null ? new File(dir) : new File(System.getProperty("user.dir"));
-    }
-
-    /**
-     * An action method that pops up a file chooser dialog to pick the
-     * generation directory.
-     */
-    public void selectOutputFolderAction() {
-
-        JTextField outputFolder = ((GeneratorControllerPanel) getView()).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();
-            outputFolder.setText(path);
-            setOutputPath(path);
-        }
-    }
-
-    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);
-                }
-            }
-        }
-    }
-
-    private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
-        String path = lastPath.getPath();
-        String resourcePath = buildFilePath("src", dirType, "resources");
-        int idx = path.indexOf(resourcePath);
-        if (idx < 0) {
-            return null;
-        }
-        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
-    }
-
-    private static String buildFilePath(String... pathElements) {
-        if (pathElements.length == 0) {
-            return "";
-        }
-        StringBuilder path = new StringBuilder(pathElements[0]);
-        for (int i = 1; i < pathElements.length; i++) {
-            path.append(File.separator).append(pathElements[i]);
-        }
-        return path.toString();
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.CayenneRuntimeException;
+//import org.apache.cayenne.gen.ArtifactsGenerationMode;
+//import org.apache.cayenne.gen.ClassGenerationAction;
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.map.Embeddable;
+//import org.apache.cayenne.map.EmbeddableAttribute;
+//import org.apache.cayenne.map.EmbeddedAttribute;
+//import org.apache.cayenne.map.ObjAttribute;
+//import org.apache.cayenne.map.ObjEntity;
+//import org.apache.cayenne.map.ObjRelationship;
+//import org.apache.cayenne.modeler.Application;
+//import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
+//import org.apache.cayenne.modeler.pref.DataMapDefaults;
+//import org.apache.cayenne.modeler.pref.FSPath;
+//import org.apache.cayenne.modeler.util.CayenneController;
+//import org.apache.cayenne.modeler.util.CodeValidationUtil;
+//import org.apache.cayenne.swing.BindingBuilder;
+//import org.apache.cayenne.util.Util;
+//import org.apache.cayenne.validation.BeanValidationFailure;
+//import org.apache.cayenne.validation.SimpleValidationFailure;
+//import org.apache.cayenne.validation.ValidationFailure;
+//import org.apache.cayenne.validation.ValidationResult;
+//
+//import javax.swing.JButton;
+//import javax.swing.JFileChooser;
+//import javax.swing.JOptionPane;
+//import javax.swing.JTextField;
+//import java.io.File;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.LinkedList;
+//import java.util.Map;
+//import java.util.Set;
+//import java.util.function.Predicate;
+//import java.util.prefs.Preferences;
+//
+///**
+// * A mode-specific part of the code generation dialog.
+// *
+// */
+//public abstract class GeneratorController extends CayenneController {
+//
+//    protected String mode = ArtifactsGenerationMode.ALL.getLabel();
+//    protected Map<DataMap, DataMapDefaults> mapPreferences;
+//    private String outputPath;
+//
+//    public GeneratorController(CodeGeneratorControllerBase parent) {
+//        super(parent);
+//
+//        createDefaults();
+//        createView();
+//        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
+//    }
+//
+//    public String getOutputPath() {
+//        return outputPath;
+//    }
+//
+//    public void setOutputPath(String path) {
+//        String old = this.outputPath;
+//        this.outputPath = path;
+//        if (this.outputPath != null && !this.outputPath.equals(old)) {
+//            updatePreferences(path);
+//        }
+//    }
+//
+//    public void updatePreferences(String path) {
+//        if (mapPreferences == null)
+//            return;
+//        Set<DataMap> keys = mapPreferences.keySet();
+//        for (DataMap key : keys) {
+//            mapPreferences
+//                    .get(key)
+//                    .setOutputPath(path);
+//        }
+//    }
+//
+//    public void setMapPreferences(Map<DataMap, DataMapDefaults> mapPreferences) {
+//        this.mapPreferences = mapPreferences;
+//    }
+//
+//    public Map<DataMap, DataMapDefaults> getMapPreferences() {
+//        return this.mapPreferences;
+//    }
+//
+//    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
+//     * {@link #createConfiguration()} method.
+//     */
+//    protected abstract ClassGenerationAction newGenerator();
+//
+//    /**
+//     * Creates a class generator for provided selections.
+//     */
+//    public Collection<ClassGenerationAction> createConfiguration() {
+//
+//        File outputDir = getOutputDir();
+//
+//        // no destination folder
+//        if (outputDir == null) {
+//            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+//            return null;
+//        }
+//
+//        // 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<>();
+//        for (DataMap map : getParentController().getDataMaps()) {
+//            try {
+//                ClassGenerationAction generator = newGenerator();
+//
+//                if(getParentController().getSelectedDataMaps().contains(map)) {
+//                    mode = ArtifactsGenerationMode.ALL.getLabel();
+//                } else {
+//                    mode = ArtifactsGenerationMode.ENTITY.getLabel();
+//                }
+//
+//                generator.setArtifactsGenerationMode(mode);
+//                generator.setDataMap(map);
+//
+//                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());
+//
+//                Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
+//
+//                if (preferences != null) {
+//                    generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
+//
+//                }
+//
+//                generator.setMakePairs(true);
+//                generator.setForce(true);
+//
+//                generators.add(generator);
+//            } catch (CayenneRuntimeException exception) {
+//                JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
+//                return null;
+//            }
+//        }
+//
+//        return generators;
+//    }
+//
+//    public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
+//        ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
+//        if (embeddableFailure != null) {
+//            validationBuffer.addFailure(embeddableFailure);
+//            return;
+//        }
+//
+//        for (EmbeddableAttribute attribute : embeddable.getAttributes()) {
+//            ValidationFailure failure = validateEmbeddableAttribute(attribute);
+//            if (failure != null) {
+//                validationBuffer.addFailure(failure);
+//                return;
+//            }
+//        }
+//    }
+//
+//    private ValidationFailure validateEmbeddableAttribute(EmbeddableAttribute attribute) {
+//        String name = attribute.getEmbeddable().getClassName();
+//
+//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+//                attribute.getName());
+//        if (emptyName != null) {
+//            return emptyName;
+//        }
+//
+//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+//                attribute.getName());
+//        if (badName != null) {
+//            return badName;
+//        }
+//
+//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+//                attribute.getType());
+//        if (emptyType != null) {
+//            return emptyType;
+//        }
+//
+//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+//                attribute.getType());
+//        if (badType != null) {
+//            return badType;
+//        }
+//
+//        return null;
+//    }
+//
+//    private ValidationFailure validateEmbeddable(Embeddable embeddable) {
+//
+//        String name = embeddable.getClassName();
+//
+//        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className",
+//                embeddable.getClassName());
+//        if (emptyClass != null) {
+//            return emptyClass;
+//        }
+//
+//        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
+//                embeddable.getClassName());
+//        if (badClass != null) {
+//            return badClass;
+//        }
+//
+//        return null;
+//    }
+//
+//    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity, boolean clientValidation) {
+//
+//        ValidationFailure entityFailure = validateEntity(clientValidation ? entity.getClientEntity() : entity);
+//        if (entityFailure != null) {
+//            validationBuffer.addFailure(entityFailure);
+//            return;
+//        }
+//
+//        for (ObjAttribute attribute : entity.getAttributes()) {
+//            if (attribute instanceof EmbeddedAttribute) {
+//                EmbeddedAttribute embeddedAttribute = (EmbeddedAttribute) attribute;
+//                for (ObjAttribute subAttribute : embeddedAttribute.getAttributes()) {
+//                    ValidationFailure failure = validateEmbeddedAttribute(subAttribute);
+//                    if (failure != null) {
+//                        validationBuffer.addFailure(failure);
+//                        return;
+//                    }
+//                }
+//            } else {
+//
+//                ValidationFailure failure = validateAttribute(attribute);
+//                if (failure != null) {
+//                    validationBuffer.addFailure(failure);
+//                    return;
+//                }
+//            }
+//        }
+//
+//        for (ObjRelationship rel : entity.getRelationships()) {
+//            ValidationFailure failure = validateRelationship(rel, clientValidation);
+//            if (failure != null) {
+//                validationBuffer.addFailure(failure);
+//                return;
+//            }
+//        }
+//    }
+//
+//    private ValidationFailure validateEntity(ObjEntity entity) {
+//
+//        String name = entity.getName();
+//
+//        if (entity.isGeneric()) {
+//            return new SimpleValidationFailure(name, "Generic class");
+//        }
+//
+//        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className", entity.getClassName());
+//        if (emptyClass != null) {
+//            return emptyClass;
+//        }
+//
+//        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
+//                entity.getClassName());
+//        if (badClass != null) {
+//            return badClass;
+//        }
+//
+//        if (entity.getSuperClassName() != null) {
+//            ValidationFailure badSuperClass = BeanValidationFailure.validateJavaClassName(name, "superClassName",
+//                    entity.getSuperClassName());
+//            if (badSuperClass != null) {
+//                return badSuperClass;
+//            }
+//        }
+//
+//        return null;
+//    }
+//
+//    private ValidationFailure validateAttribute(ObjAttribute attribute) {
+//
+//        String name = attribute.getEntity().getName();
+//
+//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+//                attribute.getName());
+//        if (emptyName != null) {
+//            return emptyName;
+//        }
+//
+//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+//                attribute.getName());
+//        if (badName != null) {
+//            return badName;
+//        }
+//
+//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+//                attribute.getType());
+//        if (emptyType != null) {
+//            return emptyType;
+//        }
+//
+//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+//                attribute.getType());
+//        if (badType != null) {
+//            return badType;
+//        }
+//
+//        return null;
+//    }
+//
+//    private ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
+//
+//        String name = attribute.getEntity().getName();
+//
+//        // validate embeddedAttribute and attribute names
+//        // embeddedAttribute returned attibute as
+//        // [name_embeddedAttribute].[name_attribute]
+//        String[] attributes = attribute.getName().split("\\.");
+//        String nameEmbeddedAttribute = attributes[0];
+//        int beginIndex = attributes[0].length();
+//        String attr = attribute.getName().substring(beginIndex + 1);
+//
+//        ValidationFailure emptyEmbeddedName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+//                nameEmbeddedAttribute);
+//        if (emptyEmbeddedName != null) {
+//            return emptyEmbeddedName;
+//        }
+//
+//        ValidationFailure badEmbeddedName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+//                nameEmbeddedAttribute);
+//        if (badEmbeddedName != null) {
+//            return badEmbeddedName;
+//        }
+//
+//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name", attr);
+//        if (emptyName != null) {
+//            return emptyName;
+//        }
+//
+//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name", attr);
+//        if (badName != null) {
+//            return badName;
+//        }
+//
+//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+//                attribute.getType());
+//        if (emptyType != null) {
+//            return emptyType;
+//        }
+//
+//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+//                attribute.getType());
+//        if (badType != null) {
+//            return badType;
+//        }
+//
+//        return null;
+//    }
+//
+//    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
+//
+//        String name = relationship.getSourceEntity().getName();
+//
+//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "relationship.name",
+//                relationship.getName());
+//        if (emptyName != null) {
+//            return emptyName;
+//        }
+//
+//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "relationship.name",
+//                relationship.getName());
+//        if (badName != null) {
+//            return badName;
+//        }
+//
+//        if (!relationship.isToMany()) {
+//
+//            ObjEntity targetEntity = relationship.getTargetEntity();
+//
+//            if (clientValidation && targetEntity != null) {
+//                targetEntity = targetEntity.getClientEntity();
+//            }
+//
+//            if (targetEntity == null) {
+//
+//                return new BeanValidationFailure(name, "relationship.targetEntity", "No target entity");
+//            } else if (!targetEntity.isGeneric()) {
+//                ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name,
+//                        "relationship.targetEntity.className", targetEntity.getClassName());
+//                if (emptyClass != null) {
+//                    return emptyClass;
+//                }
+//
+//                ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name,
+//                        "relationship.targetEntity.className", targetEntity.getClassName());
+//                if (badClass != null) {
+//                    return badClass;
+//                }
+//            }
+//        }
+//
+//        return null;
+//    }
+//
+//    /**
+//     * Returns a predicate for default entity selection in a given mode.
+//     */
+//    public Predicate getDefaultClassFilter() {
+//        return object -> {
+//            if (object instanceof ObjEntity) {
+//                return getParentController().getProblem(((ObjEntity) object).getName()) == null;
+//            }
+//
+//            if (object instanceof Embeddable) {
+//                return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
+//            }
+//
+//            return false;
+//        };
+//    }
+//
+//    private File getOutputDir() {
+//        String dir = ((GeneratorControllerPanel) getView()).getOutputFolder().getText();
+//        return dir != null ? new File(dir) : new File(System.getProperty("user.dir"));
+//    }
+//
+//    /**
+//     * An action method that pops up a file chooser dialog to pick the
+//     * generation directory.
+//     */
+//    public void selectOutputFolderAction() {
+//
+//        JTextField outputFolder = ((GeneratorControllerPanel) getView()).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();
+//            outputFolder.setText(path);
+//            setOutputPath(path);
+//        }
+//    }
+//
+//    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);
+//                }
+//            }
+//        }
+//    }
+//
+//    private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
+//        String path = lastPath.getPath();
+//        String resourcePath = buildFilePath("src", dirType, "resources");
+//        int idx = path.indexOf(resourcePath);
+//        if (idx < 0) {
+//            return null;
+//        }
+//        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
+//    }
+//
+//    private static String buildFilePath(String... pathElements) {
+//        if (pathElements.length == 0) {
+//            return "";
+//        }
+//        StringBuilder path = new StringBuilder(pathElements[0]);
+//        for (int i = 1; i < pathElements.length; i++) {
+//            path.append(File.separator).append(pathElements[i]);
+//        }
+//        return path.toString();
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
index 49cbc4b..276284f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
@@ -1,55 +1,55 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * A generic panel that is a superclass of generator panels, defining common fields.
- *
- */
-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");
-    }
-
-    public JTextField getOutputFolder() {
-        return outputFolder;
-    }
-
-    public JButton getSelectOutputFolder() {
-        return selectOutputFolder;
-    }
-
-    public Collection<StandardPanelComponent> getDataMapLines() {
-        return dataMapLines;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import javax.swing.JButton;
+//import javax.swing.JPanel;
+//import javax.swing.JTextField;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//
+///**
+// * A generic panel that is a superclass of generator panels, defining common fields.
+// *
+// */
+//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");
+//    }
+//
+//    public JTextField getOutputFolder() {
+//        return outputFolder;
+//    }
+//
+//    public JButton getSelectOutputFolder() {
+//        return selectOutputFolder;
+//    }
+//
+//    public Collection<StandardPanelComponent> getDataMapLines() {
+//        return dataMapLines;
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
index 5d7594f..8b915fe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
@@ -1,115 +1,115 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.pref.CayenneProjectPreferences;
-import org.apache.cayenne.pref.PreferenceDetail;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.util.Util;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- */
-public class GeneratorTabController extends CayenneController {
-
-    private static final String STANDARD_OBJECTS_MODE = "Standard Persistent Objects";
-    private static final String CLIENT_OBJECTS_MODE = "Client Persistent Objects";
-    private static final String ADVANCED_MODE = "Advanced";
-
-    public static final String GENERATOR_PROPERTY = "generator";
-
-    private static final String[] GENERATION_MODES = new String[] {
-            STANDARD_OBJECTS_MODE, CLIENT_OBJECTS_MODE, ADVANCED_MODE
-    };
-
-    protected GeneratorTabPanel view;
-    protected Map controllers;
-    protected PreferenceDetail preferences;
-
-    public GeneratorTabController(CodeGeneratorControllerBase parent) {
-        super(parent);
-
-        this.controllers = new HashMap(5);
-        controllers.put(STANDARD_OBJECTS_MODE, new StandardModeController(parent));
-        controllers.put(CLIENT_OBJECTS_MODE, new ClientModeController(parent));
-        controllers.put(ADVANCED_MODE, new CustomModeController(parent));
-
-        Component[] modePanels = new Component[GENERATION_MODES.length];
-        for (int i = 0; i < GENERATION_MODES.length; i++) {
-            modePanels[i] = ((GeneratorController) controllers.get(GENERATION_MODES[i]))
-                    .getView();
-        }
-
-        this.view = new GeneratorTabPanel(GENERATION_MODES, modePanels);
-        initBindings();
-        view.setPreferredSize(new Dimension(600, 480));
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    protected CodeGeneratorControllerBase getParentController() {
-        return (CodeGeneratorControllerBase) getParent();
-    }
-
-    protected void initBindings() {
-
-        // bind actions
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        CayenneProjectPreferences cayPrPref = application.getCayenneProjectPreferences();
-
-        this.preferences = (PreferenceDetail) cayPrPref.getProjectDetailObject(
-                PreferenceDetail.class,
-                getViewPreferences().node("controller"));
-
-        if (Util.isEmptyString(preferences.getProperty("mode"))) {
-            preferences.setProperty("mode", STANDARD_OBJECTS_MODE);
-        }
-
-        builder.bindToComboSelection(
-                view.getGenerationMode(),
-                "preferences.property['mode']").updateView();
-    }
-
-    public PreferenceDetail getPreferences() {
-        return preferences;
-    }
-
-    public GeneratorController getGeneratorController() {
-        Object name = view.getGenerationMode().getSelectedItem();
-        return (GeneratorController) controllers.get(name);
-    }
-
-    public Collection<ClassGenerationAction> getGenerator() {
-        GeneratorController modeController = getGeneratorController();
-        return (modeController != null) ? modeController.createGenerator() : null;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.gen.ClassGenerationAction;
+//import org.apache.cayenne.modeler.util.CayenneController;
+//import org.apache.cayenne.pref.CayenneProjectPreferences;
+//import org.apache.cayenne.pref.PreferenceDetail;
+//import org.apache.cayenne.swing.BindingBuilder;
+//import org.apache.cayenne.util.Util;
+//
+//import java.awt.Component;
+//import java.awt.Dimension;
+//import java.util.Collection;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+///**
+// */
+//public class GeneratorTabController extends CayenneController {
+//
+//    private static final String STANDARD_OBJECTS_MODE = "Standard Persistent Objects";
+//    private static final String CLIENT_OBJECTS_MODE = "Client Persistent Objects";
+//    private static final String ADVANCED_MODE = "Advanced";
+//
+//    public static final String GENERATOR_PROPERTY = "generator";
+//
+//    private static final String[] GENERATION_MODES = new String[] {
+//            STANDARD_OBJECTS_MODE, CLIENT_OBJECTS_MODE, ADVANCED_MODE
+//    };
+//
+//    protected GeneratorTabPanel view;
+//    protected Map controllers;
+//    protected PreferenceDetail preferences;
+//
+//    public GeneratorTabController(CodeGeneratorControllerBase parent) {
+//        super(parent);
+//
+//        this.controllers = new HashMap(5);
+//        controllers.put(STANDARD_OBJECTS_MODE, new StandardModeController(parent));
+//        controllers.put(CLIENT_OBJECTS_MODE, new ClientModeController(parent));
+//        controllers.put(ADVANCED_MODE, new CustomModeController(parent));
+//
+//        Component[] modePanels = new Component[GENERATION_MODES.length];
+//        for (int i = 0; i < GENERATION_MODES.length; i++) {
+//            modePanels[i] = ((GeneratorController) controllers.get(GENERATION_MODES[i]))
+//                    .getView();
+//        }
+//
+//        this.view = new GeneratorTabPanel(GENERATION_MODES, modePanels);
+//        initBindings();
+//        view.setPreferredSize(new Dimension(600, 480));
+//    }
+//
+//    public Component getView() {
+//        return view;
+//    }
+//
+//    protected CodeGeneratorControllerBase getParentController() {
+//        return (CodeGeneratorControllerBase) getParent();
+//    }
+//
+//    protected void initBindings() {
+//
+//        // bind actions
+//        BindingBuilder builder = new BindingBuilder(
+//                getApplication().getBindingFactory(),
+//                this);
+//
+//        CayenneProjectPreferences cayPrPref = application.getCayenneProjectPreferences();
+//
+//        this.preferences = (PreferenceDetail) cayPrPref.getProjectDetailObject(
+//                PreferenceDetail.class,
+//                getViewPreferences().node("controller"));
+//
+//        if (Util.isEmptyString(preferences.getProperty("mode"))) {
+//            preferences.setProperty("mode", STANDARD_OBJECTS_MODE);
+//        }
+//
+//        builder.bindToComboSelection(
+//                view.getGenerationMode(),
+//                "preferences.property['mode']").updateView();
+//    }
+//
+//    public PreferenceDetail getPreferences() {
+//        return preferences;
+//    }
+//
+//    public GeneratorController getGeneratorController() {
+//        Object name = view.getGenerationMode().getSelectedItem();
+//        return (GeneratorController) controllers.get(name);
+//    }
+//
+//    public Collection<ClassGenerationAction> getConfiguration() {
+//        GeneratorController modeController = getGeneratorController();
+//        return (modeController != null) ? modeController.createConfiguration() : null;
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
index 854e2d6..c6095ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
@@ -1,65 +1,65 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import java.awt.BorderLayout;
-import java.awt.CardLayout;
-import java.awt.Component;
-
-/**
- */
-public class GeneratorTabPanel extends JPanel {
-
-    protected JComboBox generationMode;
-    protected CardLayout modeLayout;
-    protected JPanel modesPanel;
-
-    public GeneratorTabPanel(String[] modeNames, Component[] modePanels) {
-        this.generationMode = new JComboBox(modeNames);
-        this.modeLayout = new CardLayout();
-        this.modesPanel = new JPanel(modeLayout);
-
-        generationMode.addItemListener(e -> modeLayout.show(modesPanel, generationMode.getSelectedItem().toString()));
-
-        // assemble
-        FormLayout layout = new FormLayout("right:70dlu, 3dlu, fill:300, fill:100dlu:grow", "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-        builder.append("Type:", generationMode, 1);
-        builder.appendSeparator();
-
-        for (int i = 0; i < modeNames.length; i++) {
-            modesPanel.add(modePanels[i], modeNames[i]);
-        }
-
-        setLayout(new BorderLayout());
-        add(builder.getPanel(), BorderLayout.NORTH);
-        add(modesPanel, BorderLayout.CENTER);
-    }
-
-    public JComboBox getGenerationMode() {
-        return generationMode;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import com.jgoodies.forms.builder.DefaultFormBuilder;
+//import com.jgoodies.forms.layout.FormLayout;
+//
+//import javax.swing.JComboBox;
+//import javax.swing.JPanel;
+//import java.awt.BorderLayout;
+//import java.awt.CardLayout;
+//import java.awt.Component;
+//
+///**
+// */
+//public class GeneratorTabPanel extends JPanel {
+//
+//    protected JComboBox generationMode;
+//    protected CardLayout modeLayout;
+//    protected JPanel modesPanel;
+//
+//    public GeneratorTabPanel(String[] modeNames, Component[] modePanels) {
+//        this.generationMode = new JComboBox(modeNames);
+//        this.modeLayout = new CardLayout();
+//        this.modesPanel = new JPanel(modeLayout);
+//
+//        generationMode.addItemListener(e -> modeLayout.show(modesPanel, generationMode.getSelectedItem().toString()));
+//
+//        // assemble
+//        FormLayout layout = new FormLayout("right:70dlu, 3dlu, fill:300, fill:100dlu:grow", "");
+//        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+//        builder.setDefaultDialogBorder();
+//        builder.append("Type:", generationMode, 1);
+//        builder.appendSeparator();
+//
+//        for (int i = 0; i < modeNames.length; i++) {
+//            modesPanel.add(modePanels[i], modeNames[i]);
+//        }
+//
+//        setLayout(new BorderLayout());
+//        add(builder.getPanel(), BorderLayout.NORTH);
+//        add(modesPanel, BorderLayout.CENTER);
+//    }
+//
+//    public JComboBox getGenerationMode() {
+//        return generationMode;
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
index b0650d8..547f408 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
@@ -1,82 +1,82 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.TreeMap;
-
-public class StandardModeController extends GeneratorController {
-
-    protected StandardModePanel view;
-    protected DataMapDefaults preferences;
-
-    public StandardModeController(CodeGeneratorControllerBase parent) {
-        super(parent);
-    }
-
-    protected void createDefaults() {
-        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<>();
-        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
-
-        for (DataMap dataMap : dataMaps) {
-            DataMapDefaults preferences = getApplication()
-                    .getFrameController()
-                    .getProjectController()
-                    .getDataMapPreferences(dataMap);
-
-            preferences.setSuperclassPackage("");
-            preferences.updateSuperclassPackage(dataMap, false);
-
-            treeMap.put(dataMap, preferences);
-            if (getOutputPath() == null) {
-                setOutputPath(preferences.getOutputPath());
-            }
-        }
-
-        setMapPreferences(treeMap);
-    }
-
-    protected GeneratorControllerPanel createView() {
-        this.view = new StandardModePanel();
-        return view;
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    @Override
-    protected ClassGenerationAction newGenerator() {
-        ClassGenerationAction action = new ClassGenerationAction();
-        getApplication().getInjector().injectMembers(action);
-        return action;
-    }
-
-    @Override
-    public Collection<ClassGenerationAction> createGenerator() {
-        return super.createGenerator();
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.gen.ClassGenerationAction;
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.modeler.pref.DataMapDefaults;
+//
+//import java.awt.Component;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.TreeMap;
+//
+//public class StandardModeController extends GeneratorController {
+//
+//    protected StandardModePanel view;
+//    protected DataMapDefaults preferences;
+//
+//    public StandardModeController(CodeGeneratorControllerBase parent) {
+//        super(parent);
+//    }
+//
+//    protected void createDefaults() {
+//        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<>();
+//        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
+//
+//        for (DataMap dataMap : dataMaps) {
+//            DataMapDefaults preferences = getApplication()
+//                    .getFrameController()
+//                    .getProjectController()
+//                    .getDataMapPreferences(dataMap);
+//
+//            preferences.setSuperclassPackage("");
+//            preferences.updateSuperclassPackage(dataMap, false);
+//
+//            treeMap.put(dataMap, preferences);
+//            if (getOutputPath() == null) {
+//                setOutputPath(preferences.getOutputPath());
+//            }
+//        }
+//
+//        setMapPreferences(treeMap);
+//    }
+//
+//    protected GeneratorControllerPanel createView() {
+//        this.view = new StandardModePanel();
+//        return view;
+//    }
+//
+//    public Component getView() {
+//        return view;
+//    }
+//
+//    @Override
+//    protected ClassGenerationAction newGenerator() {
+//        ClassGenerationAction action = new ClassGenerationAction();
+//        getApplication().getInjector().injectMembers(action);
+//        return action;
+//    }
+//
+//    @Override
+//    public Collection<ClassGenerationAction> createConfiguration() {
+//        return super.createConfiguration();
+//    }
+//}
\ No newline at end of file


[07/32] cayenne git commit: Add merge pom config with dataMap config

Posted by nt...@apache.org.
Add merge pom config with dataMap config


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

Branch: refs/heads/master
Commit: b10cd803a005065ed55f07ba57eb9dce3b5addbf
Parents: e41f1e4
Author: Arseni Bulatski <an...@gmail.com>
Authored: Tue Jun 26 13:45:41 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:42:16 2018 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/gen/CgenModule.java | 13 ++++
 .../cayenne/gen/ClassGenerationAction.java      | 46 ++++++++-----
 .../cayenne/tools/CayenneGeneratorMojo.java     | 69 +++++++++++---------
 .../editor/cgen/CustomModeController.java       |  1 +
 4 files changed, 82 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/b10cd803/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
new file mode 100644
index 0000000..79e411e
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
@@ -0,0 +1,13 @@
+package org.apache.cayenne.gen;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.gen.xml.CgenExtension;
+import org.apache.cayenne.project.ProjectModule;
+
+public class CgenModule implements Module{
+    @Override
+    public void configure(Binder binder) {
+        ProjectModule.contributeExtensions(binder).add(CgenExtension.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b10cd803/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 5b10a07..afd58e0 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
@@ -91,29 +91,39 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	protected VelocityContext context;
 	protected Map<String, Template> templateCache;
 
+
 	public ClassGenerationAction() {
-		this.outputPattern = "*.java";
-		this.timestamp = 0L;
-		this.usePkgPath = true;
-		this.makePairs = true;
-		this.context = new VelocityContext();
-		this.templateCache = new HashMap<>(5);
+        this.outputPattern = "*.java";
+        this.timestamp = 0L;
+        this.usePkgPath = true;
+        this.makePairs = true;
+        this.context = new VelocityContext();
+        this.templateCache = new HashMap<>(5);
 
-		this.template = SUBCLASS_TEMPLATE;
-		this.superTemplate = SUPERCLASS_TEMPLATE;
+        this.artifacts = new ArrayList<>();
+        this.entityArtifacts = new ArrayList<>();
+        this.embeddableArtifacts = new ArrayList<>();
+	}
 
-		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
-		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
+	public void setDefaults() {
+        this.outputPattern = "*.java";
+        this.timestamp = 0L;
+        this.usePkgPath = true;
+        this.makePairs = true;
+        this.context = new VelocityContext();
+        this.templateCache = new HashMap<>(5);
 
-		this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
-		this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+        this.template = SUBCLASS_TEMPLATE;
+        this.superTemplate = SUPERCLASS_TEMPLATE;
 
-		this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+        this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
+        this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
 
-		this.artifacts = new ArrayList<>();
-		this.entityArtifacts = new ArrayList<>();
-		this.embeddableArtifacts = new ArrayList<>();
-	}
+        this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
+        this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+
+        this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+    }
 
 	protected String defaultTemplateName(TemplateType type) {
 		switch (type) {
@@ -704,6 +714,8 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return destDir.getAbsolutePath();
 	}
 
+	public File getDestDir() { return destDir; }
+
 	public String getTemplate() {
 		return template;
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b10cd803/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 d043c30..42a2e8d 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
@@ -19,10 +19,12 @@
 
 package org.apache.cayenne.tools;
 
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
@@ -96,8 +98,8 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * with all generated code included in superclass (default is
 	 * <code>true</code>).
 	 */
-	@Parameter(defaultValue = "true")
-	private boolean makePairs;
+	@Parameter
+	private String makePairs;
 
 	/**
 	 * DataMap XML file to use as a base for class generation.
@@ -117,15 +119,15 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	/**
 	 * Name of file for generated output. (Default is &quot;*.java&quot;)
 	 */
-	@Parameter(defaultValue = "*.java")
+	@Parameter
 	private String outputPattern;
 
 	/**
 	 * If set to <code>true</code>, will overwrite older versions of generated
 	 * classes. Ignored unless makepairs is set to <code>false</code>.
 	 */
-	@Parameter(defaultValue = "false")
-	private boolean overwrite;
+	@Parameter
+	private String overwrite;
 
 	/**
 	 * Java package name of generated superclasses. Ignored unless
@@ -174,15 +176,15 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * <code>false</code>, classes will be generated in &quot;destDir&quot;
 	 * ignoring their package.
 	 */
-	@Parameter(defaultValue = "true")
-	private boolean usePkgPath;
+	@Parameter
+	private String usePkgPath;
 
     /**
      * If set to <code>true</code>, will generate String Property names.
      * Default is <code>false</code>.
      */
-    @Parameter(defaultValue = "false")
-    private boolean createPropertyNames;
+    @Parameter
+    private String createPropertyNames;
 
 	/**
 	 * If set to <code>true</code>, will skip file modification time validation and regenerate all.
@@ -203,6 +205,8 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 	private transient Injector injector;
 
+    private static final Logger logger = LoggerFactory.getLogger(CayenneGeneratorMojo.class);
+
 	public void execute() throws MojoExecutionException, MojoFailureException {
 		// Create the destination directory if necessary.
 		// TODO: (KJM 11/2/06) The destDir really should be added as a
@@ -211,7 +215,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 			destDir.mkdirs();
 		}
 
-		injector = DIBootstrap.createInjector(new ToolsModule(LoggerFactory.getLogger(CayenneGeneratorMojo.class)));
+		injector = DIBootstrap.createInjector(new CgenModule(), new ToolsModule(LoggerFactory.getLogger(CayenneGeneratorMojo.class)));
 
 		Logger logger = new MavenLogger(this);
 		CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
@@ -226,7 +230,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 			DataMap dataMap = loaderAction.getMainDataMap();
 
-			ClassGenerationAction generator = createGenerator();
+			ClassGenerationAction generator = createGenerator(dataMap);
 			generator.setLogger(logger);
 			if(force) {
 				// will (re-)generate all files
@@ -234,9 +238,13 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 			}
 			generator.setTimestamp(map.lastModified());
 			generator.setDataMap(dataMap);
-			generator.addEntities(filterAction.getFilteredEntities(dataMap));
-			generator.addEmbeddables(dataMap.getEmbeddables());
-			generator.addQueries(dataMap.getQueryDescriptors());
+			if(!generator.getEntities().isEmpty() || !generator.getEmbeddables().isEmpty()){
+				generator.prepareArtifacts();
+			} else {
+				generator.addEntities(filterAction.getFilteredEntities(dataMap));
+				generator.addEmbeddables(dataMap.getEmbeddables());
+				generator.addQueries(dataMap.getQueryDescriptors());
+			}
 			generator.execute();
 		} catch (Exception e) {
 			throw new MojoExecutionException("Error generating classes: ", e);
@@ -265,32 +273,33 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * Factory method to create internal class generator. Called from
 	 * constructor.
 	 */
-	protected ClassGenerationAction createGenerator() {
+	protected ClassGenerationAction createGenerator(DataMap dataMap) {
+
+	    ClassGenerationAction action = injector.getInstance(DataChannelMetaData.class).get(dataMap, ClassGenerationAction.class);
 
-		ClassGenerationAction action;
 		if (client) {
 			action = new ClientClassGenerationAction();
 		} else {
-			action = new ClassGenerationAction();
+            if(action == null) {
+                action = new ClassGenerationAction();
+            }
 		}
 
 		injector.injectMembers(action);
 
 		action.setDestDir(destDir);
-		action.setEncoding(encoding);
-		action.setMakePairs(makePairs);
+		action.setEncoding(encoding != null ? encoding : action.getEncoding());
+		action.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : action.isMakePairs());
 		action.setArtifactsGenerationMode(mode);
-		action.setOutputPattern(outputPattern);
-		action.setOverwrite(overwrite);
-		action.setSuperPkg(superPkg);
-		action.setSuperTemplate(superTemplate);
-		action.setTemplate(template);
-		action.setEmbeddableSuperTemplate(embeddableSuperTemplate);
-		action.setEmbeddableTemplate(embeddableTemplate);
-		action.setUsePkgPath(usePkgPath);
-		action.setCreatePropertyNames(createPropertyNames);
-        action.setCreatePKProperties(createPKProperties);
-
+		action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
+		action.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : action.isOverwrite());
+		action.setSuperPkg(superPkg != null ? superPkg : action.getSuperPkg());
+		action.setSuperTemplate(superTemplate != null ? superTemplate : action.getSuperclassTemplate());
+		action.setTemplate(template != null ? template : action.getTemplate());
+		action.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : action.getEmbeddableSuperTemplate());
+		action.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : action.getEmbeddableTemplate());
+		action.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : action.isUsePkgPath());
+		action.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : action.isCreatePropertyNames());
 		return action;
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b10cd803/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 2559657..5666355 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
@@ -143,6 +143,7 @@ public class CustomModeController extends GeneratorController {
     @Override
     protected ClassGenerationAction newGenerator() {
         ClassGenerationAction action = new ClassGenerationAction();
+        action.setDefaults();
         getApplication().getInjector().injectMembers(action);
         return action;
     }


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

Posted by nt...@apache.org.
Add loading cgen config loading from datamap to maven, ant and gradle plugins


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

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

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


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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
index 79e411e..44b6cd7 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenModule.java
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.di.Binder;
@@ -5,6 +23,9 @@ import org.apache.cayenne.di.Module;
 import org.apache.cayenne.gen.xml.CgenExtension;
 import org.apache.cayenne.project.ProjectModule;
 
+/**
+ * @since 4.1
+ */
 public class CgenModule implements Module{
     @Override
     public void configure(Binder binder) {

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

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

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

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
index 0b12dcd..97772de 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -19,12 +19,64 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.modeler.action.*;
+import org.apache.cayenne.modeler.action.AboutAction;
+import org.apache.cayenne.modeler.action.ActionManager;
+import org.apache.cayenne.modeler.action.CgenAction;
+import org.apache.cayenne.modeler.action.ConfigurePreferencesAction;
+import org.apache.cayenne.modeler.action.CopyAction;
+import org.apache.cayenne.modeler.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.action.CreateNodeAction;
+import org.apache.cayenne.modeler.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.action.CreateQueryAction;
+import org.apache.cayenne.modeler.action.CutAction;
+import org.apache.cayenne.modeler.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.action.DocumentationAction;
+import org.apache.cayenne.modeler.action.ExitAction;
+import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.action.GenerateCodeAction;
+import org.apache.cayenne.modeler.action.GenerateDBAction;
+import org.apache.cayenne.modeler.action.ImportDataMapAction;
+import org.apache.cayenne.modeler.action.ImportEOModelAction;
+import org.apache.cayenne.modeler.action.InferRelationshipsAction;
+import org.apache.cayenne.modeler.action.MigrateAction;
+import org.apache.cayenne.modeler.action.NavigateBackwardAction;
+import org.apache.cayenne.modeler.action.NavigateForwardAction;
+import org.apache.cayenne.modeler.action.NewProjectAction;
+import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.action.PasteAction;
+import org.apache.cayenne.modeler.action.ProjectAction;
+import org.apache.cayenne.modeler.action.RedoAction;
+import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.action.RevertAction;
+import org.apache.cayenne.modeler.action.SaveAction;
+import org.apache.cayenne.modeler.action.SaveAsAction;
+import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
+import org.apache.cayenne.modeler.action.UndoAction;
+import org.apache.cayenne.modeler.action.ValidateAction;
 import org.apache.cayenne.modeler.action.dbimport.ReverseEngineeringToolMenuAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.*;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.event.DataMapDisplayListener;
+import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
+import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
+import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
+import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
+import org.apache.cayenne.modeler.event.QueryDisplayListener;
+import org.apache.cayenne.modeler.event.RecentFileListListener;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -32,8 +84,28 @@ import org.apache.cayenne.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.JTextField;
+import javax.swing.JToolBar;
+import java.awt.AWTEvent;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Toolkit;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
index 9db205b..b81cc73 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
@@ -1,17 +1,47 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.modeler.dialog.codegen.cgen;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
+/**
+ * @since 4.1
+ */
 public class CgenDialog extends JDialog {
 
     protected JPanel panel;
     protected JButton cancelButton;
 
-    public CgenDialog(Component generatorPanel) {
+    CgenDialog(Component generatorPanel) {
         super(Application.getFrame());
 
         this.panel = new JPanel();

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
index 3c9b68a..c234d70 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
@@ -1,25 +1,50 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.modeler.dialog.codegen.cgen;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.ProjectController;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
 
+/**
+ * @since 4.1
+ */
 public class CgenGlobalPanel extends JPanel {
 
     private JButton generateButton;
 
     private JTextField outputFolder;
     private JButton selectOutputFolder;
-    private JComboBox generationMode;
-    private JComboBox subclassTemplate;
-    private JComboBox superclassTemplate;
-    private JComboBox embeddableTemplate;
-    private JComboBox embeddableSuperTemplate;
-    private JComboBox dataMapTemplate;
-    private JComboBox dataMapSuperTemplate;
+    private JComboBox<String> generationMode;
+    private JComboBox<String> subclassTemplate;
+    private JComboBox<String> superclassTemplate;
+    private JComboBox<String> embeddableTemplate;
+    private JComboBox<String> embeddableSuperTemplate;
+    private JComboBox<String> dataMapTemplate;
+    private JComboBox<String> dataMapSuperTemplate;
     private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
@@ -44,21 +69,17 @@ public class CgenGlobalPanel extends JPanel {
     private JButton resetNames;
     private JButton resetPackage;
 
-    private ProjectController projectController;
-
     CgenGlobalPanel(ProjectController projectController) {
-        this.projectController = projectController;
-
         this.generateButton = new JButton("Generate All classes");
         this.outputFolder = new JTextField();
         this.selectOutputFolder = new JButton("Select");
-        this.generationMode = new JComboBox();
-        this.subclassTemplate = new JComboBox();
-        this.superclassTemplate = new JComboBox();
-        this.embeddableTemplate = new JComboBox();
-        this.embeddableSuperTemplate = new JComboBox();
-        this.dataMapTemplate = new JComboBox();
-        this.dataMapSuperTemplate = new JComboBox();
+        this.generationMode = new JComboBox<>();
+        this.subclassTemplate = new JComboBox<>();
+        this.superclassTemplate = new JComboBox<>();
+        this.embeddableTemplate = new JComboBox<>();
+        this.embeddableSuperTemplate = new JComboBox<>();
+        this.dataMapTemplate = new JComboBox<>();
+        this.dataMapSuperTemplate = new JComboBox<>();
         this.pairs = new JCheckBox();
         this.overwrite = new JCheckBox();
         this.usePackagePath = new JCheckBox();
@@ -156,31 +177,29 @@ public class CgenGlobalPanel extends JPanel {
         return selectOutputFolder;
     }
 
-    public JComboBox getGenerationMode() {
-        return generationMode;
-    }
+    public JComboBox<String> getGenerationMode() { return generationMode; }
 
-    public JComboBox getSubclassTemplate() {
+    public JComboBox<String> getSubclassTemplate() {
         return subclassTemplate;
     }
 
-    public JComboBox getSuperclassTemplate() {
+    public JComboBox<String> getSuperclassTemplate() {
         return superclassTemplate;
     }
 
-    public JComboBox getEmbeddableTemplate() {
+    public JComboBox<String> getEmbeddableTemplate() {
         return embeddableTemplate;
     }
 
-    public JComboBox getEmbeddableSuperTemplate() {
+    public JComboBox<String> getEmbeddableSuperTemplate() {
         return embeddableSuperTemplate;
     }
 
-    public JComboBox getDataMapTemplate() {
+    public JComboBox<String> getDataMapTemplate() {
         return dataMapTemplate;
     }
 
-    public JComboBox getDataMapSuperTemplate() {
+    public JComboBox<String> getDataMapSuperTemplate() {
         return dataMapSuperTemplate;
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
index b07bdd2..f694b73 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.modeler.dialog.codegen.cgen;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
@@ -21,10 +39,13 @@ import java.io.File;
 import java.util.*;
 import java.util.List;
 
+/**
+ * @since 4.1
+ */
 public class CgenGlobalPanelController extends CayenneController{
 
-    static final String ALL_MODE_LABEL = "Generate all";
-    static final Map<String, String> modesByLabel = new HashMap<>();
+    private static final String ALL_MODE_LABEL = "Generate all";
+    private static final Map<String, String> modesByLabel = new HashMap<>();
     // correspond to non-public constants on MapClassGenerator.
     private static final String MODE_DATAMAP = "datamap";
     private static final String MODE_ENTITY = "entity";
@@ -48,7 +69,7 @@ public class CgenGlobalPanelController extends CayenneController{
 
     private Collection<ClassGenerationAction> generators;
 
-    public CgenGlobalPanelController(CayenneController parent) {
+    CgenGlobalPanelController(CayenneController parent) {
         super(parent);
         this.projectController = Application.getInstance().getFrameController().getProjectController();
 
@@ -61,8 +82,8 @@ public class CgenGlobalPanelController extends CayenneController{
     }
 
     private void updateTemplates() {
-        Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
+        view.getGenerationMode().setModel(new DefaultComboBoxModel<>(modeChoices));
 
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
@@ -93,14 +114,14 @@ public class CgenGlobalPanelController extends CayenneController{
         Collections.sort(dataMapSuperTemplates);
         dataMapSuperTemplates.addAll(customTemplates);
 
-        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
-        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
+        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
+        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
 
-        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
-        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
+        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
+        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
 
-        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel(dataMapTemplates.toArray()));
-        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel(dataMapSuperTemplates.toArray()));
+        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
+        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
 
         this.view.getOutputPattern().setText("*.java");
         this.view.getPairs().setSelected(true);

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

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

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

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
index 334931a..cac063c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -21,8 +21,17 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
 /**
  */

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

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

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d9db6e31/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
index 7e8087f..7a8b5cb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
@@ -22,7 +22,13 @@ package org.apache.cayenne.modeler.editor.cgen;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
@@ -37,9 +43,12 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
 import java.io.File;
-import java.util.*;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 

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

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

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

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


[25/32] cayenne git commit: Add saver of advance mode. Relativize custom template's path

Posted by nt...@apache.org.
Add saver of advance mode. Relativize custom template's path


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

Branch: refs/heads/master
Commit: c813e7679de1b4d1f65758dee2faa2b52eaaf583
Parents: ac6819f
Author: Arseni Bulatski <an...@gmail.com>
Authored: Mon Nov 12 17:41:56 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Mon Nov 12 17:41:56 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/xml/CgenConfigHandler.java      |  2 +-
 .../cayenne/modeler/CodeTemplateManager.java    |  9 +++++++--
 .../editor/cgen/CodeGeneratorController.java    | 12 ++++++++++-
 .../editor/cgen/CustomModeController.java       | 16 +++++++++++----
 .../modeler/editor/cgen/CustomModePanel.java    | 21 ++++++++++++--------
 .../editor/cgen/GeneratorTabController.java     |  4 ++++
 6 files changed, 48 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 2384f10..c73e24b 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
@@ -40,7 +40,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String OUTPUT_DIRECTORY_TAG = "destDir";
     private static final String GENERATION_MODE_TAG = "mode";
     private static final String SUBCLASS_TEMPLATE_TAG = "template";
-    private static final String SUPERCLASS_TEMPLATE_TAG = "superclassTemplate";
+    private static final String SUPERCLASS_TEMPLATE_TAG = "superTemplate";
     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";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 98f0dc9..ccb4980 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
@@ -56,6 +56,7 @@ public class CodeTemplateManager {
 	private List<String> standardSubclassTemplates;
 	private List<String> standardSuperclassTemplates;
 	private Map<String, String> customTemplates;
+	private Map<String, String> reverseCustomTemplate;
 	private Map<String, String> standardTemplates;
 
 	private List<String> standartEmbeddableTemplates;
@@ -98,6 +99,10 @@ public class CodeTemplateManager {
 		standartDataMapSuperclassTemplates.add(STANDART_DATAMAP_SUPERCLASS);
 
 		updateCustomTemplates(getTemplatePreferences(application));
+		reverseCustomTemplate = new HashMap<>();
+		for(Map.Entry<String, String> entry : customTemplates.entrySet()){
+			reverseCustomTemplate.put(entry.getValue(), entry.getKey());
+		}
 
 		standardTemplates = new HashMap<>();
 		standardTemplates.put(STANDARD_SERVER_SUPERCLASS, ClassGenerationAction.SUPERCLASS_TEMPLATE);
@@ -161,8 +166,8 @@ public class CodeTemplateManager {
 	}
 
 	public String getNameByPath(String name) {
-		if(customTemplates.containsKey(name)){
-			return customTemplates.get(name).toString();
+		if(reverseCustomTemplate.containsKey(name)){
+			return reverseCustomTemplate.get(name);
 		} else {
 			Object value = reverseStandartTemplates.get(name);
 			return value != null ? value.toString() : null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 1244178..0785820 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
@@ -68,13 +68,23 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         classesSelectedAction();
         CgenConfiguration cgenConfiguration = createConfiguration();
         GeneratorController modeController = prevGeneratorController.get(dataMap) != null ? prevGeneratorController.get(dataMap) : cgenConfiguration.isClient() ?
-                generatorSelector.getClientGeneratorController() : generatorSelector.getStandartController();
+                generatorSelector.getClientGeneratorController() : isDefaultConfig(cgenConfiguration) ?
+                generatorSelector.getStandartController() : generatorSelector.getCustomModeController();
         prevGeneratorController.put(dataMap, modeController);
         generatorSelector.setSelectedController(modeController);
         classesSelector.startup();
         initFromModel = false;
     }
 
+    private boolean isDefaultConfig(CgenConfiguration cgenConfiguration) {
+        return cgenConfiguration.isMakePairs() && cgenConfiguration.isUsePkgPath() && !cgenConfiguration.isOverwrite() &&
+                !cgenConfiguration.isCreatePKProperties() && !cgenConfiguration.isCreatePropertyNames() &&
+                cgenConfiguration.getOutputPattern().equals("*.java") &&
+                cgenConfiguration.getTemplate().equals(ClassGenerationAction.SUBCLASS_TEMPLATE) &&
+                cgenConfiguration.getSuperTemplate().equals(ClassGenerationAction.SUPERCLASS_TEMPLATE);
+
+    }
+
     private void initListeners(){
         projectController.addObjEntityDisplayListener(e -> super.addToSelectedEntities(e.getEntity().getDataMap(), Collections.singleton(e.getEntity().getName())));
         projectController.addEmbeddableDisplayListener(e -> super.addToSelectedEmbeddables(e.getEmbeddable().getDataMap(), Collections.singleton(e.getEmbeddable().getClassName())));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 4a23e6b..c591584 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
@@ -25,8 +25,10 @@ import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.swing.BindingBuilder;
 
-import javax.swing.DefaultComboBoxModel;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -87,11 +89,17 @@ public class CustomModeController extends GeneratorController {
     }
 
     private void updateComboBoxes() {
-        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(cgenConfiguration.getTemplate()));
-        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(cgenConfiguration.getSuperTemplate()));
+        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(
+                getAbsoluteTemplatePath(cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath())));
+        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(
+                getAbsoluteTemplatePath(cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath())));
         view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
+    private String getAbsoluteTemplatePath(String relTemplatePath, Path rootPath) {
+        return rootPath.resolve(Paths.get(relTemplatePath)).toString();
+    }
+
     private void initListeners(){
         view.getPairs().addActionListener(val -> {
             cgenConfiguration.setMakePairs(view.getPairs().isSelected());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 8b1d2a3..16c8edf 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
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.ComboBoxAdapter;
@@ -29,12 +30,10 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 /**
  * @since 4.1
@@ -58,7 +57,8 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
             @Override
             protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                CgenConfiguration cgenConfiguration = getCgenByDataMap();
+                cgenConfiguration.setSuperTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }
@@ -69,7 +69,8 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.subclassTemplate = new ComboBoxAdapter<String>(subclassField) {
             @Override
             protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                CgenConfiguration cgenConfiguration = getCgenByDataMap();
+                cgenConfiguration.setTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }
@@ -143,6 +144,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
+    private String getTemplatePath(Path rootPath, String templatePath) {
+        return rootPath.relativize(Paths.get(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(templatePath)))).toString();
+    }
+
     public void setDisableSuperComboBoxes(boolean val){
         superclassTemplate.getComboBox().setEnabled(val);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/c813e767/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 77a71b8..0956cc3 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
@@ -103,6 +103,10 @@ public class GeneratorTabController extends CayenneController {
         return controllers.get(STANDARD_OBJECTS_MODE);
     }
 
+    GeneratorController getCustomModeController() {
+        return controllers.get(ADVANCED_MODE);
+    }
+
     GeneratorController getClientGeneratorController() {
         return controllers.get(CLIENT_OBJECTS_MODE);
     }


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

Posted by nt...@apache.org.
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;
-    }
-
-}


[19/32] cayenne git commit: Cgen

Posted by nt...@apache.org.
Cgen


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

Branch: refs/heads/master
Commit: a5c2ceb9a010c9376e81d7d13352127fcf301315
Parents: 8f6cfd7 52ea45b
Author: Arseni Bulatski <an...@gmail.com>
Authored: Thu Nov 8 17:26:08 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Thu Nov 8 17:26:08 2018 +0300

----------------------------------------------------------------------
 .../cayenne/tools/CayenneGeneratorTask.java     |  154 ++-
 .../cayenne/tools/CgenWithConfigTest.java       |  124 ++
 cayenne-ant/src/test/resources/cgenTest.map.xml |   22 +
 .../cayenne/gen/ArtifactsGenerationMode.java    |    2 +-
 .../apache/cayenne/gen/CgenConfiguration.java   |  363 ++++++
 .../java/org/apache/cayenne/gen/CgenModule.java |   34 +
 .../cayenne/gen/ClassGenerationAction.java      |  490 +++-----
 .../gen/ClientClassGenerationAction.java        |   44 +-
 .../apache/cayenne/gen/EmbeddableArtifact.java  |   12 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |   11 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      |  279 +++++
 .../apache/cayenne/gen/xml/CgenExtension.java   |   54 +
 .../cayenne/gen/xml/CgenLoaderDelegate.java     |   49 +
 .../cayenne/gen/xml/CgenSaverDelegate.java      |   70 ++
 .../CayenneGeneratorEmbeddableFilterAction.java |   29 +
 .../CayenneGeneratorEntityFilterAction.java     |   22 +-
 .../cayenne/gen/ClassGenerationActionTest.java  |   37 +-
 .../java/org/apache/cayenne/tools/CgenTask.java |  182 ++-
 .../org/apache/cayenne/tools/CgenTaskIT.java    |   60 +-
 .../org/apache/cayenne/tools/CgenTaskTest.java  |   50 +-
 .../org/apache/cayenne/tools/cgenConfig.map.xml |   22 +
 .../org/apache/cayenne/tools/cgenMap.map.xml    |   22 +
 .../cayenne/tools/cgen_with_config.gradle       |   27 +
 .../cayenne/tools/cgen_with_configs.gradle      |   32 +
 .../cayenne/project/CompoundSaverDelegate.java  |   28 +-
 .../cayenne/project/FileProjectSaver.java       |    2 +
 .../project/extension/BaseSaverDelegate.java    |   13 +
 .../project/extension/SaverDelegate.java        |    4 +
 .../main/java/org/apache/cayenne/util/Util.java |   33 +-
 .../cayenne/tools/CayenneGeneratorMojo.java     |  187 ++-
 .../cayenne/tools/CayenneGeneratorMojoTest.java |   48 +
 .../resources/cgen/project-to-test/cgen-pom.xml |   46 +
 .../cgen/project-to-test/datamap-and-pom.xml    |   54 +
 .../src/test/resources/cgen/testCgen.map.xml    |   22 +
 .../src/test/resources/cgen/testCgenMap.map.xml |   22 +
 .../cayenne/modeler/CayenneModelerFrame.java    |   95 +-
 .../cayenne/modeler/CodeTemplateManager.java    |   82 +-
 .../modeler/action/GenerateCodeAction.java      |   12 +-
 .../dialog/codegen/ClassesTabController.java    |  406 +++----
 .../modeler/dialog/codegen/ClassesTabPanel.java |  282 ++---
 .../dialog/codegen/ClientModeController.java    |  162 +--
 .../dialog/codegen/CodeGeneratorController.java |  338 +++---
 .../codegen/CodeGeneratorControllerBase.java    |  760 ++++++------
 .../dialog/codegen/CodeGeneratorDialog.java     |  198 +--
 .../dialog/codegen/CustomModeController.java    |  470 ++++----
 .../modeler/dialog/codegen/CustomModePanel.java |  274 ++---
 .../codegen/CustomPreferencesUpdater.java       |  418 +++----
 .../dialog/codegen/GeneratorController.java     | 1124 +++++++++---------
 .../codegen/GeneratorControllerPanel.java       |  110 +-
 .../dialog/codegen/GeneratorTabController.java  |  230 ++--
 .../dialog/codegen/GeneratorTabPanel.java       |  130 +-
 .../dialog/codegen/StandardModeController.java  |  164 +--
 .../dialog/codegen/StandardModePanel.java       |   84 +-
 .../dialog/codegen/StandardPanelComponent.java  |  162 +--
 .../modeler/editor/DataDomainTabbedView.java    |  183 +--
 .../modeler/editor/DataMapTabbedView.java       |   38 +-
 .../cayenne/modeler/editor/EditorView.java      |    3 +-
 .../editor/cgen/ClassesTabController.java       |  123 ++
 .../modeler/editor/cgen/ClassesTabPanel.java    |   80 ++
 .../editor/cgen/ClientModeController.java       |   44 +
 .../editor/cgen/CodeGeneratorController.java    |  176 +++
 .../cgen/CodeGeneratorControllerBase.java       |  366 ++++++
 .../modeler/editor/cgen/CodeGeneratorPane.java  |   46 +
 .../editor/cgen/CustomModeController.java       |  155 +++
 .../modeler/editor/cgen/CustomModePanel.java    |  169 +++
 .../editor/cgen/GeneratorController.java        |  448 +++++++
 .../editor/cgen/GeneratorControllerPanel.java   |   68 ++
 .../editor/cgen/GeneratorTabController.java     |  112 ++
 .../modeler/editor/cgen/GeneratorTabPanel.java  |   95 ++
 .../editor/cgen/StandardModeController.java     |   60 +
 .../modeler/editor/cgen/StandardModePanel.java  |   42 +
 .../editor/cgen/StandardPanelComponent.java     |   63 +
 .../modeler/editor/cgen/domain/CgenPanel.java   |   59 +
 .../modeler/editor/cgen/domain/CgenTab.java     |   89 ++
 .../editor/cgen/domain/CgenTabController.java   |  197 +++
 .../modeler/init/CayenneModelerModule.java      |    4 +-
 .../cayenne/modeler/util/ComboBoxAdapter.java   |   72 ++
 .../cayenne/modeler/util/ModelerUtil.java       |   43 +
 78 files changed, 7454 insertions(+), 3432 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/a5c2ceb9/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index e137df5,76cf573..9c8fcab
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@@ -18,21 -18,25 +18,26 @@@
   ****************************************************************/
  package org.apache.cayenne.modeler.editor;
  
- import javax.swing.JScrollPane;
- import javax.swing.JTabbedPane;
- 
+ import org.apache.cayenne.modeler.Application;
  import org.apache.cayenne.modeler.ProjectController;
+ import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
+ import org.apache.cayenne.modeler.editor.cgen.domain.CgenTab;
  import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
  
+ import javax.swing.*;
+ 
 -
  /**
   * Data map editing tabs container
   *
   */
- public class DataMapTabbedView extends JTabbedPane {
+ public class DataMapTabbedView extends JTabbedPane{
      ProjectController mediator;
 +    private int lastSelectionIndex;
 +    private DbImportView dbImportView1;
 +
+     private CodeGeneratorController codeGeneratorController;
+     JScrollPane cgenView;
+ 
 -
      /**
       * constructor
       *
@@@ -54,23 -57,30 +58,47 @@@
          // add panels to tabs
          // note that those panels that have no internal scrollable tables
          // must be wrapped in a scroll pane
 +        JScrollPane dataMapScrollPane = new JScrollPane(new DataMapView(mediator));
 +        dbImportView1 = new DbImportView(mediator);
 +        JScrollPane dbImportScrollPane = new JScrollPane(dbImportView1);
 +        addTab("DataMap", dataMapScrollPane);
 +        addTab("DB Import", dbImportScrollPane);
 +        addChangeListener(e -> {
 +            lastSelectionIndex = getSelectedIndex();
 +            updateTabs();
 +        });
 +    }
 +
 +    private void updateTabs() {
 +        switch (lastSelectionIndex) {
 +            case 1:
 +                dbImportView1.initFromModel();
 +            break;
 +        }
+         JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
+         JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
+         this.codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
+         cgenView = new JScrollPane(codeGeneratorController.getView());
+         addTab("DataMap", dataMapView);
+         addTab("DbImport", dbImportView);
+         addTab("Class Generation", cgenView);
+ 
+         addChangeListener(tab -> {
+             if(isCgenTabActive()) {
+                 codeGeneratorController.startup(mediator.getCurrentDataMap());
+             }
+         });
+         mediator.addDataMapDisplayListener(e -> {
+             if(isCgenTabActive()) {
+                 fireStateChanged();
+             } else if(e.getSource() instanceof CgenTab){
+                 setSelectedComponent(cgenView);
+             }
+         });
+     }
+ 
+     private boolean isCgenTabActive() {
+         return getSelectedComponent() == cgenView;
      }
  }
  


[30/32] cayenne git commit: Rel path for template bug fix

Posted by nt...@apache.org.
Rel path for template bug fix


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

Branch: refs/heads/master
Commit: 51803e43be67029f97c47a0d03ae395795ed0d07
Parents: 5128e66
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Nov 14 16:52:10 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Nov 14 16:52:10 2018 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java   | 8 ++++++++
 .../java/org/apache/cayenne/modeler/CodeTemplateManager.java | 8 ++++++--
 .../apache/cayenne/modeler/editor/cgen/CustomModePanel.java  | 6 ++++--
 3 files changed, 18 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/51803e43/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 92453c7..5f381ea 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
@@ -64,6 +64,14 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
             if(prevPath != null) {
                 Path relPath = resourcePath.relativize(prevPath).normalize();
                 cgenConfiguration.setRelPath(relPath);
+                Path templatePath = Paths.get(cgenConfiguration.getTemplate());
+                if(templatePath.isAbsolute()) {
+                    cgenConfiguration.setTemplate(resourcePath.relativize(templatePath).normalize().toString());
+                }
+                Path superTemplatePath = Paths.get(cgenConfiguration.getSuperTemplate());
+                if(superTemplatePath.isAbsolute()) {
+                    cgenConfiguration.setSuperTemplate(resourcePath.relativize(superTemplatePath).normalize().toString());
+                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/51803e43/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 a5d2fb6..76dd2b2 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
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.modeler.pref.FSPath;
+import org.apache.cayenne.resource.Resource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -157,10 +158,13 @@ public class CodeTemplateManager {
 	// TODO: andrus, 12/5/2007 - this should also take a "pairs" parameter to
 	// correctly
 	// assign standard templates
-	public String getTemplatePath(String name, Path rootPath) {
+	public String getTemplatePath(String name, Resource rootPath) {
 		Object value = customTemplates.get(name);
 		if (value != null) {
-			value = rootPath.relativize(Paths.get((String)value));
+			if(rootPath != null) {
+				Path path = Paths.get(rootPath.getURL().getPath()).getParent();
+				value = path.relativize(Paths.get((String) value));
+			}
 			return value.toString();
 		}
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/51803e43/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 ea5f1ce..18a1929 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
@@ -55,7 +55,8 @@ public class CustomModePanel extends GeneratorControllerPanel {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenByDataMap();
-                cgenConfiguration.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath()));
+                cgenConfiguration.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item,
+                        cgenConfiguration.getDataMap().getConfigurationSource()));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }
@@ -67,7 +68,8 @@ public class CustomModePanel extends GeneratorControllerPanel {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenByDataMap();
-                cgenConfiguration.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath()));
+                cgenConfiguration.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item,
+                        cgenConfiguration.getDataMap().getConfigurationSource()));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }


[21/32] cayenne git commit: Cgen task refactoring

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
deleted file mode 100644
index a5ac549..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
+++ /dev/null
@@ -1,169 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.gen.ClassGenerationAction;
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
-//import org.apache.cayenne.modeler.util.CayenneController;
-//import org.apache.cayenne.swing.BindingBuilder;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//import javax.swing.JOptionPane;
-//import java.awt.Component;
-//import java.util.Collection;
-//import java.util.function.Predicate;
-//
-///**
-// * A controller for the class generator dialog.
-// */
-//public class CodeGeneratorController extends CodeGeneratorControllerBase {
-//    /**
-//     * Logger to print stack traces
-//     */
-//    private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);
-//
-//    protected CodeGeneratorDialog view;
-//
-//    protected ClassesTabController classesSelector;
-//    protected GeneratorTabController generatorSelector;
-//
-//    public CodeGeneratorController(CayenneController parent, Collection<DataMap> dataMaps) {
-//        super(parent, dataMaps);
-//
-//        this.classesSelector = new ClassesTabController(this, dataMaps);
-//        this.generatorSelector = new GeneratorTabController(this);
-//    }
-//
-//    @Override
-//    public Component getView() {
-//        return view;
-//    }
-//
-//    public void startup() {
-//        // show dialog even on empty DataMap, as custom generation may still take
-//        // advantage of it
-//
-//        view = new CodeGeneratorDialog(generatorSelector.getView(), classesSelector.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()");
-//        builder.bindToAction(view.getGenerateButton(), "generateAction()");
-//        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
-//        builder.bindToAction(generatorSelector, "generatorSelectedAction()",
-//                GeneratorTabController.GENERATOR_PROPERTY);
-//
-//        generatorSelectedAction();
-//    }
-//
-//    public void generatorSelectedAction() {
-//        GeneratorController controller = generatorSelector.getGeneratorController();
-//        validate(controller);
-//
-//        Predicate<Object> predicate = controller != null
-//                ? controller.getDefaultClassFilter()
-//                : o -> false;
-//
-//        updateSelection(predicate);
-//        classesSelector.classSelectedAction();
-//    }
-//
-//    public void classesSelectedAction() {
-//        int size = getSelectedEntitiesSize();
-//        String label;
-//
-//        if (size == 0) {
-//            label = "No entities selected";
-//        }
-//        else if (size == 1) {
-//            label = "One entity selected";
-//        }
-//        else {
-//            label = size + " entities selected";
-//        }
-//
-//        label = label.concat("; ");
-//
-//        int sizeEmb = getSelectedEmbeddablesSize();
-//
-//        if (sizeEmb == 0) {
-//            label = label + "No embeddables selected";
-//        }
-//        else if (sizeEmb == 1) {
-//            label = label + "One embeddable selected";
-//        }
-//        else {
-//            label = label + sizeEmb + " embeddables selected";
-//        }
-//
-//        label = label.concat("; ");
-//
-//        int sizeDataMap = getSelectedDataMapsSize();
-//
-//        if(sizeDataMap == 0) {
-//            label = label + "No datamaps selected";
-//        } else if(sizeDataMap == 1) {
-//            label = label + "One datamap selected";
-//        } else {
-//            label = label + sizeDataMap + " datamaps selected";
-//        }
-//
-//        view.getClassesCount().setText(label);
-//    }
-//
-//    public void cancelAction() {
-//        view.dispose();
-//    }
-//
-//    public void generateAction() {
-//        Collection<ClassGenerationAction> generators = generatorSelector.getConfiguration();
-//
-//        if (generators != null) {
-//            try {
-//                for (ClassGenerationAction generator : generators) {
-//                    generator.execute();
-//                }
-//                JOptionPane.showMessageDialog(
-//                        this.getView(),
-//                        "Class generation finished");
-//            } catch (Exception e) {
-//                logObj.error("Error generating classes", e);
-//                JOptionPane.showMessageDialog(
-//                        this.getView(),
-//                        "Error generating classes - " + e.getMessage());
-//            }
-//        }
-//
-//        view.dispose();
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
deleted file mode 100644
index 3848126..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ /dev/null
@@ -1,380 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.map.Embeddable;
-//import org.apache.cayenne.map.ObjEntity;
-//import org.apache.cayenne.modeler.util.CayenneController;
-//import org.apache.cayenne.modeler.util.CellRenderers;
-//import org.apache.cayenne.validation.ValidationFailure;
-//import org.apache.cayenne.validation.ValidationResult;
-//
-//import javax.swing.Icon;
-//import javax.swing.JLabel;
-//import java.awt.Component;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.HashSet;
-//import java.util.List;
-//import java.util.Set;
-//import java.util.function.Predicate;
-//
-///**
-// * A base superclass of a top controller for the code generator. Defines all common model
-// * parts used in class generation.
-// *
-// */
-//public abstract class CodeGeneratorControllerBase extends CayenneController {
-//
-//    public static final String SELECTED_PROPERTY = "selected";
-//
-//    protected Collection<DataMap> dataMaps;
-//
-//    protected ValidationResult validation;
-//
-//    protected List<Object> classes;
-//
-//    private Set<String> selectedEntities;
-//    private Set<String> selectedEmbeddables;
-//    private Set<String> selectedDataMaps;
-//
-//    private transient Object currentClass;
-//
-//    public CodeGeneratorControllerBase(CayenneController parent, Collection<DataMap> dataMaps) {
-//        super(parent);
-//
-//        this.dataMaps = dataMaps;
-//        this.classes = new ArrayList<>();
-//
-//        for(DataMap dataMap:dataMaps){
-//            this.classes.addAll(dataMap.getObjEntities());
-//            this.classes.addAll(dataMap.getEmbeddables());
-//            this.classes.add(dataMap);
-//        }
-//        this.selectedEntities = new HashSet<>();
-//        this.selectedEmbeddables = new HashSet<>();
-//        this.selectedDataMaps = new HashSet<>();
-//    }
-//
-//    public List<Object> getClasses() {
-//        return classes;
-//    }
-//
-//    public abstract Component getView();
-//
-//    public void validate(GeneratorController validator) {
-//
-//        ValidationResult validationBuffer = new ValidationResult();
-//
-//        if (validator != null) {
-//            for (Object classObj : classes) {
-//                if (classObj instanceof ObjEntity) {
-//                    validator.validateEntity(
-//                            validationBuffer,
-//                            (ObjEntity) classObj,
-//                            false);
-//                }
-//                else if (classObj instanceof Embeddable) {
-//                    validator.validateEmbeddable(validationBuffer, (Embeddable) classObj);
-//                }
-//            }
-//
-//        }
-//
-//        this.validation = validationBuffer;
-//    }
-//
-//    public boolean updateSelection(Predicate<Object> predicate) {
-//
-//        boolean modified = false;
-//
-//        for (Object classObj : classes) {
-//            boolean select = predicate.test(classObj);
-//            if (classObj instanceof ObjEntity) {
-//
-//                if (select) {
-//                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
-//                        modified = true;
-//                    }
-//                }
-//                else {
-//                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
-//                        modified = true;
-//                    }
-//                }
-//            }
-//            else if (classObj instanceof Embeddable) {
-//                if (select) {
-//                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
-//                        modified = true;
-//                    }
-//                }
-//                else {
-//                    if (selectedEmbeddables
-//                            .remove(((Embeddable) classObj).getClassName())) {
-//                        modified = true;
-//                    }
-//                }
-//            } else if(classObj instanceof DataMap) {
-//                if(select) {
-//                    if(selectedDataMaps.add(((DataMap) classObj).getName())) {
-//                        modified = true;
-//                    }
-//                } else {
-//                    if(selectedDataMaps.remove(((DataMap) classObj).getName())) {
-//                        modified = true;
-//                    }
-//                }
-//            }
-//
-//        }
-//
-//        if (modified) {
-//            firePropertyChange(SELECTED_PROPERTY, null, null);
-//        }
-//
-//        return modified;
-//    }
-//
-//    public boolean updateDataMapSelection(Predicate<Object> predicate, DataMap dataMap) {
-//
-//        boolean modified = false;
-//
-//        for (Object classObj : classes) {
-//            boolean select = predicate.test(classObj);
-//            if (classObj instanceof ObjEntity) {
-//                if(dataMap.getObjEntities().contains(classObj)) {
-//                    if (select) {
-//                        if (selectedEntities.add(((ObjEntity) classObj).getName())) {
-//                            modified = true;
-//                        }
-//                    } else {
-//                        if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
-//                            modified = true;
-//                        }
-//                    }
-//                }
-//            }
-//            else if (classObj instanceof Embeddable) {
-//                if(dataMap.getEmbeddables().contains(classObj)) {
-//                    if (select) {
-//                        if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
-//                            modified = true;
-//                        }
-//                    } else {
-//                        if (selectedEmbeddables
-//                                .remove(((Embeddable) classObj).getClassName())) {
-//                            modified = true;
-//                        }
-//                    }
-//                }
-//            } else {
-//                if(dataMap == classObj) {
-//                    if (select) {
-//                        if (selectedDataMaps.add(((DataMap) classObj).getName())) {
-//                            modified = true;
-//                        }
-//                    } else {
-//                        if (selectedDataMaps.remove(((DataMap) classObj).getName())) {
-//                            modified = true;
-//                        }
-//                    }
-//                }
-//            }
-//
-//        }
-//
-//        if (modified) {
-//            firePropertyChange(SELECTED_PROPERTY, null, null);
-//        }
-//
-//        return modified;
-//    }
-//
-//    public List<Embeddable> getSelectedEmbeddables() {
-//
-//        List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
-//
-//        for (Object classObj : classes) {
-//            if (classObj instanceof Embeddable
-//                    && selectedEmbeddables.contains(((Embeddable) classObj)
-//                    .getClassName())) {
-//                selected.add((Embeddable) classObj);
-//            }
-//        }
-//
-//        return selected;
-//    }
-//
-//    public List<ObjEntity> getSelectedEntities() {
-//        List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
-//        for (Object classObj : classes) {
-//            if (classObj instanceof ObjEntity
-//                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
-//                selected.add(((ObjEntity) classObj));
-//            }
-//        }
-//
-//        return selected;
-//    }
-//
-//    public List<DataMap> getSelectedDataMaps() {
-//        List<DataMap> selected = new ArrayList<>(selectedDataMaps.size());
-//        for(Object classObj : classes) {
-//            if(classObj instanceof DataMap
-//                    && selectedDataMaps.contains(((DataMap) classObj).getName())) {
-//                selected.add((DataMap) classObj);
-//            }
-//        }
-//        return selected;
-//    }
-//
-//    public int getSelectedEntitiesSize() {
-//        return selectedEntities.size();
-//    }
-//
-//    public int getSelectedEmbeddablesSize() {
-//        return selectedEmbeddables.size();
-//    }
-//
-//    public int getSelectedDataMapsSize() {
-//        return selectedDataMaps.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.
-//     */
-//    public String getProblem(Object obj) {
-//
-//        String name = null;
-//
-//        if (obj instanceof ObjEntity) {
-//            name = ((ObjEntity) obj).getName();
-//        }
-//        else if (obj instanceof Embeddable) {
-//            name = ((Embeddable) obj).getClassName();
-//        }
-//
-//        if (validation == null) {
-//            return null;
-//        }
-//
-//        List failures = validation.getFailures(name);
-//        if (failures.isEmpty()) {
-//            return null;
-//        }
-//
-//        return ((ValidationFailure) failures.get(0)).getDescription();
-//    }
-//
-//    public boolean isSelected() {
-//        if (currentClass instanceof ObjEntity) {
-//            return selectedEntities
-//                    .contains(((ObjEntity) currentClass).getName());
-//        }
-//        if (currentClass instanceof Embeddable) {
-//            return selectedEmbeddables
-//                    .contains(((Embeddable) currentClass).getClassName());
-//        }
-//        if(currentClass instanceof DataMap) {
-//            return selectedDataMaps
-//                    .contains(((DataMap) currentClass).getName());
-//        }
-//        return false;
-//
-//    }
-//
-//    public void setSelected(boolean selectedFlag) {
-//        if (currentClass == null) {
-//            return;
-//        }
-//        if (currentClass instanceof ObjEntity) {
-//            if (selectedFlag) {
-//                if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            }
-//            else {
-//                if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            }
-//        }
-//        if (currentClass instanceof Embeddable) {
-//            if (selectedFlag) {
-//                if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            }
-//            else {
-//                if (selectedEmbeddables
-//                        .remove(((Embeddable) currentClass).getClassName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            }
-//        }
-//        if(currentClass instanceof DataMap) {
-//            if(selectedFlag) {
-//                if(selectedDataMaps.add(((DataMap) currentClass).getName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            } else {
-//                if(selectedDataMaps.remove(((DataMap) currentClass).getName())) {
-//                    firePropertyChange(SELECTED_PROPERTY, null, null);
-//                }
-//            }
-//        }
-//    }
-//
-//    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;
-//        if (obj instanceof Embeddable) {
-//            className = ((Embeddable) obj).getClassName();
-//            icon = CellRenderers.iconForObject(new Embeddable());
-//        } else if(obj instanceof ObjEntity) {
-//            className = ((ObjEntity) obj).getName();
-//            icon = CellRenderers.iconForObject(new ObjEntity());
-//        } else {
-//            className = ((DataMap) obj).getName();
-//            icon = CellRenderers.iconForObject(new DataMap());
-//        }
-//        JLabel labelIcon = new JLabel();
-//        labelIcon.setIcon(icon);
-//        labelIcon.setVisible(true);
-//        labelIcon.setText(className);
-//        return labelIcon;
-//    }
-//
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
deleted file mode 100644
index c4f4bd1..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
+++ /dev/null
@@ -1,99 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.modeler.Application;
-//import org.apache.cayenne.swing.components.TopBorder;
-//
-//import javax.swing.Box;
-//import javax.swing.JButton;
-//import javax.swing.JDialog;
-//import javax.swing.JLabel;
-//import javax.swing.JPanel;
-//import javax.swing.JScrollPane;
-//import javax.swing.JSplitPane;
-//import javax.swing.ScrollPaneConstants;
-//import java.awt.BorderLayout;
-//import java.awt.Component;
-//import java.awt.Container;
-//import java.awt.Dimension;
-//import java.awt.FlowLayout;
-//
-///**
-// */
-//public class CodeGeneratorDialog extends JDialog {
-//
-//    private JButton generateButton;
-//    protected JButton cancelButton;
-//    private JLabel classesCount;
-//
-//    CodeGeneratorDialog(Component generatorPanel, Component entitySelectorPanel) {
-//        super(Application.getFrame());
-//
-//        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-//        splitPane.setFocusable(false);
-//
-//        this.generateButton = new JButton("Generate");
-//        getRootPane().setDefaultButton(generateButton);
-//
-//        this.cancelButton = new JButton("Cancel");
-//        this.classesCount = new JLabel("No classes selected");
-//        classesCount.setFont(classesCount.getFont().deriveFont(10f));
-//
-//
-//        JScrollPane scrollPane = new JScrollPane(
-//                generatorPanel,
-//                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-//                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-//        scrollPane.setPreferredSize(new Dimension(630, 500));
-//
-//        splitPane.setLeftComponent(entitySelectorPanel);
-//        splitPane.setRightComponent(scrollPane);
-//
-//        JPanel messages = new JPanel(new BorderLayout());
-//        messages.add(classesCount, BorderLayout.WEST);
-//
-//        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-//        buttons.setBorder(TopBorder.create());
-//        buttons.add(classesCount);
-//        buttons.add(Box.createHorizontalStrut(50));
-//        buttons.add(cancelButton);
-//        buttons.add(generateButton);
-//
-//        Container contentPane = getContentPane();
-//        contentPane.setLayout(new BorderLayout());
-//        contentPane.add(splitPane, BorderLayout.CENTER);
-//        contentPane.add(buttons, BorderLayout.SOUTH);
-//
-//        setTitle("Code Generation");
-//    }
-//
-//    public JButton getCancelButton() {
-//        return cancelButton;
-//    }
-//
-//    public JButton getGenerateButton() {
-//        return generateButton;
-//    }
-//
-//    public JLabel getClassesCount() {
-//        return classesCount;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
deleted file mode 100644
index 344bd72..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ /dev/null
@@ -1,235 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//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;
-//import org.apache.cayenne.util.Util;
-//
-//import javax.swing.DefaultComboBoxModel;
-//import javax.swing.JCheckBox;
-//import javax.swing.JComboBox;
-//import java.awt.Component;
-//import java.util.List;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.Collections;
-//import java.util.Map.Entry;
-//import java.util.Objects;
-//import java.util.Set;
-//import java.util.TreeMap;
-//
-//import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
-//import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
-//import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
-//import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
-//
-///**
-// * A controller for the custom generation mode.
-// */
-//public class CustomModeController extends GeneratorController {
-//
-//	// correspond to non-public constants on MapClassGenerator.
-//	private static final String MODE_ENTITY = "entity";
-//
-//	protected CustomModePanel view;
-//	private CodeTemplateManager templateManager;
-//
-//	private ObjectBinding superTemplate;
-//	private ObjectBinding subTemplate;
-//
-//	private CustomPreferencesUpdater preferencesUpdater;
-//
-//	public CustomPreferencesUpdater getCustomPreferencesUpdater() {
-//		return preferencesUpdater;
-//	}
-//
-//	public CustomModeController(CodeGeneratorControllerBase parent) {
-//		super(parent);
-//
-//		// bind preferences and init defaults...
-//
-//		Set<Entry<DataMap, DataMapDefaults>> entities = getMapPreferences().entrySet();
-//
-//		for (Entry<DataMap, DataMapDefaults> entry : entities) {
-//
-//			if (Util.isEmptyString(entry.getValue().getSuperclassTemplate())) {
-//				entry.getValue().setSuperclassTemplate(STANDARD_SERVER_SUPERCLASS);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getSubclassTemplate())) {
-//				entry.getValue().setSubclassTemplate(STANDARD_SERVER_SUBCLASS);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getProperty("mode"))) {
-//				entry.getValue().setProperty("mode", MODE_ENTITY);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getProperty("overwrite"))) {
-//				entry.getValue().setBooleanProperty("overwrite", false);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getProperty("pairs"))) {
-//				entry.getValue().setBooleanProperty("pairs", true);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getProperty("usePackagePath"))) {
-//				entry.getValue().setBooleanProperty("usePackagePath", true);
-//			}
-//
-//			if (Util.isEmptyString(entry.getValue().getProperty("outputPattern"))) {
-//				entry.getValue().setProperty("outputPattern", "*.java");
-//			}
-//		}
-//
-//		BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
-//
-//		builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
-//
-//		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();
-//
-//		builder.bindToStateChange(view.getCreatePKProperties(), "customPreferencesUpdater.createPKProperties")
-//				.updateView();
-//
-//		updateTemplates();
-//	}
-//
-//	protected void createDefaults() {
-//		TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
-//		Collection<DataMap> dataMaps = getParentController().getDataMaps();
-//		for (DataMap dataMap : dataMaps) {
-//			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 GeneratorControllerPanel createView() {
-//		this.view = new CustomModePanel();
-//		return view;
-//	}
-//
-//	private void updateTemplates() {
-//		this.templateManager = getApplication().getCodeTemplateManager();
-//
-//		List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
-//		Collections.sort(customTemplates);
-//
-//		List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
-//		Collections.sort(superTemplates);
-//		superTemplates.addAll(customTemplates);
-//
-//		List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
-//		Collections.sort(subTemplates);
-//		subTemplates.addAll(customTemplates);
-//
-//		this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
-//		this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-//
-//		JCheckBox pairs = this.view.getPairs();
-//		updateView();
-//		pairs.addItemListener(e -> updateView());
-//
-//		superTemplate.updateView();
-//		subTemplate.updateView();
-//	}
-//
-//	private void updateView() {
-//		boolean selected = view.getPairs().isSelected();
-//		JComboBox<String> subclassTemplate = view.getSubclassTemplate();
-//		subclassTemplate.setSelectedItem(selected ? STANDARD_SERVER_SUBCLASS : SINGLE_SERVER_CLASS);
-//		view.getSuperclassTemplate().setEnabled(selected);
-//		view.getOverwrite().setEnabled(!selected);
-//	}
-//
-//	public Component getView() {
-//		return view;
-//	}
-//
-//	public Collection<ClassGenerationAction> createConfiguration() {
-//
-//		Collection<ClassGenerationAction> generators = super.createConfiguration();
-//
-//		String superKey = Objects.requireNonNull(view.getSuperclassTemplate().getSelectedItem()).toString();
-//		String superTemplate = templateManager.getTemplatePath(superKey);
-//
-//		String subKey = Objects.requireNonNull(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());
-//			generator.setCreatePKProperties(view.getCreatePKProperties().isSelected());
-//
-//			if (!Util.isEmptyString(view.getOutputPattern().getText())) {
-//				generator.setOutputPattern(view.getOutputPattern().getText());
-//			}
-//		}
-//
-//		return generators;
-//	}
-//
-//	public void popPreferencesAction() {
-//		new PreferenceDialog(getApplication().getFrameController()).startupAction(TEMPLATES_KEY);
-//		updateTemplates();
-//	}
-//
-//	@Override
-//	protected ClassGenerationAction newGenerator() {
-//		ClassGenerationAction action = new ClassGenerationAction();
-//		getApplication().getInjector().injectMembers(action);
-//		return action;
-//	}
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
deleted file mode 100644
index 6396abd..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ /dev/null
@@ -1,137 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import com.jgoodies.forms.builder.DefaultFormBuilder;
-//import com.jgoodies.forms.layout.FormLayout;
-//import org.apache.cayenne.swing.control.ActionLink;
-//
-//import javax.swing.JCheckBox;
-//import javax.swing.JComboBox;
-//import javax.swing.JPanel;
-//import javax.swing.JTextField;
-//import java.awt.BorderLayout;
-//import java.awt.FlowLayout;
-//
-//public class CustomModePanel extends GeneratorControllerPanel {
-//
-//    private JComboBox<String> subclassTemplate;
-//    private JComboBox<String> superclassTemplate;
-//    protected JCheckBox pairs;
-//    private JCheckBox overwrite;
-//    private JCheckBox usePackagePath;
-//    private JTextField outputPattern;
-//    private JCheckBox createPropertyNames;
-//    private JCheckBox createPKProperties;
-//
-//    private ActionLink manageTemplatesLink;
-//
-//    CustomModePanel() {
-//
-//        this.superclassTemplate = new JComboBox<>();
-//        this.subclassTemplate = new JComboBox<>();
-//        this.pairs = new JCheckBox();
-//        this.overwrite = new JCheckBox();
-//        this.usePackagePath = new JCheckBox();
-//        this.outputPattern = new JTextField();
-//        this.createPropertyNames = new JCheckBox();
-//        this.createPKProperties = new JCheckBox();
-//        this.manageTemplatesLink = new ActionLink("Customize Templates...");
-//        manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
-//
-//        // assemble
-//        FormLayout layout = new FormLayout(
-//                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
-//        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-//        builder.setDefaultDialogBorder();
-//
-//        builder.append("Output Directory:", outputFolder, selectOutputFolder);
-//        builder.nextLine();
-//
-//        builder.append("Subclass Template:", subclassTemplate);
-//        builder.nextLine();
-//
-//        builder.append("Superclass Template:", superclassTemplate);
-//        builder.nextLine();
-//
-//        builder.append("Output Pattern:", outputPattern);
-//        builder.nextLine();
-//
-//        builder.append("Make Pairs:", pairs);
-//        builder.nextLine();
-//
-//        builder.append("Use Package Path:", usePackagePath);
-//        builder.nextLine();
-//
-//        builder.append("Overwrite Subclasses:", overwrite);
-//        builder.nextLine();
-//
-//        builder.append("Create Property Names:", createPropertyNames);
-//        builder.nextLine();
-//
-//        builder.append("Create PK Properties:", createPKProperties);
-//        builder.nextLine();
-//
-//        setLayout(new BorderLayout());
-//        add(builder.getPanel(), BorderLayout.CENTER);
-//
-//        JPanel links = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-//        links.add(manageTemplatesLink);
-//        add(links, BorderLayout.SOUTH);
-//
-//        add(builder.getPanel(), BorderLayout.CENTER);
-//    }
-//
-//    public ActionLink getManageTemplatesLink() {
-//        return manageTemplatesLink;
-//    }
-//
-//    public JComboBox<String> getSubclassTemplate() {
-//        return subclassTemplate;
-//    }
-//
-//    public JComboBox<String> getSuperclassTemplate() {
-//        return superclassTemplate;
-//    }
-//
-//    public JCheckBox getOverwrite() {
-//        return overwrite;
-//    }
-//
-//    public JCheckBox getPairs() {
-//        return pairs;
-//    }
-//
-//    public JCheckBox getUsePackagePath() {
-//        return usePackagePath;
-//    }
-//
-//    public JTextField getOutputPattern() {
-//        return outputPattern;
-//    }
-//
-//    public JCheckBox getCreatePropertyNames() {
-//        return createPropertyNames;
-//    }
-//
-//    public JCheckBox getCreatePKProperties() {
-//        return createPKProperties;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
deleted file mode 100644
index a9816e0..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomPreferencesUpdater.java
+++ /dev/null
@@ -1,209 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.modeler.pref.DataMapDefaults;
-//
-//import java.util.Map;
-//import java.util.Map.Entry;
-//import java.util.Set;
-//
-//public class CustomPreferencesUpdater {
-//
-//    enum Property {
-//        SUBCLASS_TEMPLATE,
-//        SUPERCLASS_TEMPLATE,
-//        OVERWRITE,
-//        PAIRS,
-//        USE_PACKAGE_PATH,
-//        MODE,
-//        OUTPUT_PATTERN,
-//        CREATE_PROPERTY_NAMES,
-//        CREATE_PK_PROPERTIES
-//    }
-//
-//    private static final String OVERWRITE = "overwrite";
-//    private static final String PAIRS = "pairs";
-//    private static final String USE_PACKAGE_PATH = "usePackagePath";
-//    private static final String MODE = "mode";
-//    private static final String OUTPUT_PATTERN = "outputPattern";
-//    private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
-//    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
-//
-//    private Map<DataMap, DataMapDefaults> mapPreferences;
-//
-//
-//    public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences) {
-//        this.mapPreferences = mapPreferences;
-//    }
-//
-//    public String getMode() {
-//        return (String) getProperty(Property.MODE);
-//    }
-//
-//    public void setMode(String mode) {
-//        updatePreferences(Property.MODE, mode);
-//    }
-//
-//    public String getSubclassTemplate() {
-//        return (String) getProperty(Property.SUBCLASS_TEMPLATE);
-//    }
-//
-//    public void setSubclassTemplate(String subclassTemplate) {
-//        updatePreferences(Property.SUBCLASS_TEMPLATE, subclassTemplate);
-//    }
-//
-//    public String getSuperclassTemplate() {
-//        return (String) getProperty(Property.SUPERCLASS_TEMPLATE);
-//    }
-//
-//    public void setSuperclassTemplate(String superclassTemplate) {
-//        updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);
-//    }
-//
-//    public Boolean getOverwrite() {
-//        return (Boolean) getProperty(Property.OVERWRITE);
-//    }
-//
-//    public void setOverwrite(Boolean overwrite) {
-//        updatePreferences(Property.OVERWRITE, overwrite);
-//    }
-//
-//    public Boolean getPairs() {
-//        return (Boolean) getProperty(Property.PAIRS);
-//    }
-//
-//    public void setPairs(Boolean pairs) {
-//        updatePreferences(Property.PAIRS, pairs);
-//    }
-//
-//    public Boolean getUsePackagePath() {
-//        return (Boolean) getProperty(Property.USE_PACKAGE_PATH);
-//    }
-//
-//    public void setUsePackagePath(Boolean usePackagePath) {
-//        updatePreferences(Property.USE_PACKAGE_PATH, usePackagePath);
-//    }
-//
-//    public String getOutputPattern() {
-//        return (String) getProperty(Property.OUTPUT_PATTERN);
-//    }
-//
-//    public void setOutputPattern(String outputPattern) {
-//        updatePreferences(Property.OUTPUT_PATTERN, outputPattern);
-//    }
-//
-//    public Boolean getCreatePropertyNames() {
-//        return (Boolean) getProperty(Property.CREATE_PROPERTY_NAMES);
-//    }
-//
-//    public void setCreatePropertyNames(Boolean createPropertyNames) {
-//        updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
-//    }
-//
-//    public Boolean getCreatePKProperties() {
-//        return (Boolean) getProperty(Property.CREATE_PK_PROPERTIES);
-//    }
-//
-//    public void setCreatePKProperties(Boolean createPKProperties) {
-//        updatePreferences(Property.CREATE_PK_PROPERTIES, createPKProperties);
-//    }
-//
-//    private Object getProperty(Property property) {
-//        Object obj = null;
-//
-//        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-//        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-//
-//            switch (property) {
-//                case MODE:
-//                    obj = entry.getValue().getProperty(MODE);
-//                    break;
-//                case OUTPUT_PATTERN:
-//                    obj = entry.getValue().getProperty(OUTPUT_PATTERN);
-//                    break;
-//                case SUBCLASS_TEMPLATE:
-//                    obj = entry.getValue().getSubclassTemplate();
-//                    break;
-//                case SUPERCLASS_TEMPLATE:
-//                    obj = entry.getValue().getSuperclassTemplate();
-//                    break;
-//                case OVERWRITE:
-//                    obj = entry.getValue().getBooleanProperty(OVERWRITE);
-//                    break;
-//                case PAIRS:
-//                    obj = entry.getValue().getBooleanProperty(PAIRS);
-//                    break;
-//                case USE_PACKAGE_PATH:
-//                    obj = entry.getValue().getBooleanProperty(USE_PACKAGE_PATH);
-//                    break;
-//                case CREATE_PROPERTY_NAMES:
-//                    obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
-//                    break;
-//                case CREATE_PK_PROPERTIES:
-//                    obj = entry.getValue().getBooleanProperty(CREATE_PK_PROPERTIES);
-//                    break;
-//                default:
-//                    throw new IllegalArgumentException("Bad type property: " + property);
-//            }
-//
-//        }
-//        return obj;
-//    }
-//
-//    private void updatePreferences(Property property, Object value) {
-//        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-//        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-//
-//            switch (property) {
-//                case MODE:
-//                    entry.getValue().setProperty(MODE, (String) value);
-//                    break;
-//                case OUTPUT_PATTERN:
-//                    entry.getValue().setProperty(OUTPUT_PATTERN, (String) value);
-//                    break;
-//                case SUBCLASS_TEMPLATE:
-//                    entry.getValue().setSubclassTemplate((String) value);
-//                    break;
-//                case SUPERCLASS_TEMPLATE:
-//                    entry.getValue().setSuperclassTemplate((String) value);
-//                    break;
-//                case OVERWRITE:
-//                    entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);
-//                    break;
-//                case PAIRS:
-//                    entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);
-//                    break;
-//                case USE_PACKAGE_PATH:
-//                    entry.getValue().setBooleanProperty(USE_PACKAGE_PATH, (Boolean) value);
-//                    break;
-//                case CREATE_PROPERTY_NAMES:
-//                    entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
-//                    break;
-//                case CREATE_PK_PROPERTIES:
-//                    entry.getValue().setBooleanProperty(CREATE_PK_PROPERTIES, (Boolean) value);
-//                    break;
-//                default:
-//                    throw new IllegalArgumentException("Bad type property: " + property);
-//            }
-//        }
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
deleted file mode 100644
index 4a5b5f6..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ /dev/null
@@ -1,561 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.CayenneRuntimeException;
-//import org.apache.cayenne.gen.ArtifactsGenerationMode;
-//import org.apache.cayenne.gen.ClassGenerationAction;
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.map.Embeddable;
-//import org.apache.cayenne.map.EmbeddableAttribute;
-//import org.apache.cayenne.map.EmbeddedAttribute;
-//import org.apache.cayenne.map.ObjAttribute;
-//import org.apache.cayenne.map.ObjEntity;
-//import org.apache.cayenne.map.ObjRelationship;
-//import org.apache.cayenne.modeler.Application;
-//import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
-//import org.apache.cayenne.modeler.pref.DataMapDefaults;
-//import org.apache.cayenne.modeler.pref.FSPath;
-//import org.apache.cayenne.modeler.util.CayenneController;
-//import org.apache.cayenne.modeler.util.CodeValidationUtil;
-//import org.apache.cayenne.swing.BindingBuilder;
-//import org.apache.cayenne.util.Util;
-//import org.apache.cayenne.validation.BeanValidationFailure;
-//import org.apache.cayenne.validation.SimpleValidationFailure;
-//import org.apache.cayenne.validation.ValidationFailure;
-//import org.apache.cayenne.validation.ValidationResult;
-//
-//import javax.swing.JButton;
-//import javax.swing.JFileChooser;
-//import javax.swing.JOptionPane;
-//import javax.swing.JTextField;
-//import java.io.File;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.LinkedList;
-//import java.util.Map;
-//import java.util.Set;
-//import java.util.function.Predicate;
-//import java.util.prefs.Preferences;
-//
-///**
-// * A mode-specific part of the code generation dialog.
-// *
-// */
-//public abstract class GeneratorController extends CayenneController {
-//
-//    protected String mode = ArtifactsGenerationMode.ALL.getLabel();
-//    protected Map<DataMap, DataMapDefaults> mapPreferences;
-//    private String outputPath;
-//
-//    public GeneratorController(CodeGeneratorControllerBase parent) {
-//        super(parent);
-//
-//        createDefaults();
-//        createView();
-//        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
-//    }
-//
-//    public String getOutputPath() {
-//        return outputPath;
-//    }
-//
-//    public void setOutputPath(String path) {
-//        String old = this.outputPath;
-//        this.outputPath = path;
-//        if (this.outputPath != null && !this.outputPath.equals(old)) {
-//            updatePreferences(path);
-//        }
-//    }
-//
-//    public void updatePreferences(String path) {
-//        if (mapPreferences == null)
-//            return;
-//        Set<DataMap> keys = mapPreferences.keySet();
-//        for (DataMap key : keys) {
-//            mapPreferences
-//                    .get(key)
-//                    .setOutputPath(path);
-//        }
-//    }
-//
-//    public void setMapPreferences(Map<DataMap, DataMapDefaults> mapPreferences) {
-//        this.mapPreferences = mapPreferences;
-//    }
-//
-//    public Map<DataMap, DataMapDefaults> getMapPreferences() {
-//        return this.mapPreferences;
-//    }
-//
-//    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
-//     * {@link #createConfiguration()} method.
-//     */
-//    protected abstract ClassGenerationAction newGenerator();
-//
-//    /**
-//     * Creates a class generator for provided selections.
-//     */
-//    public Collection<ClassGenerationAction> createConfiguration() {
-//
-//        File outputDir = getOutputDir();
-//
-//        // no destination folder
-//        if (outputDir == null) {
-//            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
-//            return null;
-//        }
-//
-//        // 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<>();
-//        for (DataMap map : getParentController().getDataMaps()) {
-//            try {
-//                ClassGenerationAction generator = newGenerator();
-//
-//                if(getParentController().getSelectedDataMaps().contains(map)) {
-//                    mode = ArtifactsGenerationMode.ALL.getLabel();
-//                } else {
-//                    mode = ArtifactsGenerationMode.ENTITY.getLabel();
-//                }
-//
-//                generator.setArtifactsGenerationMode(mode);
-//                generator.setDataMap(map);
-//
-//                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());
-//
-//                Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
-//
-//                if (preferences != null) {
-//                    generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
-//
-//                }
-//
-//                generator.setMakePairs(true);
-//                generator.setForce(true);
-//
-//                generators.add(generator);
-//            } catch (CayenneRuntimeException exception) {
-//                JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
-//                return null;
-//            }
-//        }
-//
-//        return generators;
-//    }
-//
-//    public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
-//        ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
-//        if (embeddableFailure != null) {
-//            validationBuffer.addFailure(embeddableFailure);
-//            return;
-//        }
-//
-//        for (EmbeddableAttribute attribute : embeddable.getAttributes()) {
-//            ValidationFailure failure = validateEmbeddableAttribute(attribute);
-//            if (failure != null) {
-//                validationBuffer.addFailure(failure);
-//                return;
-//            }
-//        }
-//    }
-//
-//    private ValidationFailure validateEmbeddableAttribute(EmbeddableAttribute attribute) {
-//        String name = attribute.getEmbeddable().getClassName();
-//
-//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-//                attribute.getName());
-//        if (emptyName != null) {
-//            return emptyName;
-//        }
-//
-//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-//                attribute.getName());
-//        if (badName != null) {
-//            return badName;
-//        }
-//
-//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-//                attribute.getType());
-//        if (emptyType != null) {
-//            return emptyType;
-//        }
-//
-//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-//                attribute.getType());
-//        if (badType != null) {
-//            return badType;
-//        }
-//
-//        return null;
-//    }
-//
-//    private ValidationFailure validateEmbeddable(Embeddable embeddable) {
-//
-//        String name = embeddable.getClassName();
-//
-//        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className",
-//                embeddable.getClassName());
-//        if (emptyClass != null) {
-//            return emptyClass;
-//        }
-//
-//        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
-//                embeddable.getClassName());
-//        if (badClass != null) {
-//            return badClass;
-//        }
-//
-//        return null;
-//    }
-//
-//    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity, boolean clientValidation) {
-//
-//        ValidationFailure entityFailure = validateEntity(clientValidation ? entity.getClientEntity() : entity);
-//        if (entityFailure != null) {
-//            validationBuffer.addFailure(entityFailure);
-//            return;
-//        }
-//
-//        for (ObjAttribute attribute : entity.getAttributes()) {
-//            if (attribute instanceof EmbeddedAttribute) {
-//                EmbeddedAttribute embeddedAttribute = (EmbeddedAttribute) attribute;
-//                for (ObjAttribute subAttribute : embeddedAttribute.getAttributes()) {
-//                    ValidationFailure failure = validateEmbeddedAttribute(subAttribute);
-//                    if (failure != null) {
-//                        validationBuffer.addFailure(failure);
-//                        return;
-//                    }
-//                }
-//            } else {
-//
-//                ValidationFailure failure = validateAttribute(attribute);
-//                if (failure != null) {
-//                    validationBuffer.addFailure(failure);
-//                    return;
-//                }
-//            }
-//        }
-//
-//        for (ObjRelationship rel : entity.getRelationships()) {
-//            ValidationFailure failure = validateRelationship(rel, clientValidation);
-//            if (failure != null) {
-//                validationBuffer.addFailure(failure);
-//                return;
-//            }
-//        }
-//    }
-//
-//    private ValidationFailure validateEntity(ObjEntity entity) {
-//
-//        String name = entity.getName();
-//
-//        if (entity.isGeneric()) {
-//            return new SimpleValidationFailure(name, "Generic class");
-//        }
-//
-//        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className", entity.getClassName());
-//        if (emptyClass != null) {
-//            return emptyClass;
-//        }
-//
-//        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
-//                entity.getClassName());
-//        if (badClass != null) {
-//            return badClass;
-//        }
-//
-//        if (entity.getSuperClassName() != null) {
-//            ValidationFailure badSuperClass = BeanValidationFailure.validateJavaClassName(name, "superClassName",
-//                    entity.getSuperClassName());
-//            if (badSuperClass != null) {
-//                return badSuperClass;
-//            }
-//        }
-//
-//        return null;
-//    }
-//
-//    private ValidationFailure validateAttribute(ObjAttribute attribute) {
-//
-//        String name = attribute.getEntity().getName();
-//
-//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-//                attribute.getName());
-//        if (emptyName != null) {
-//            return emptyName;
-//        }
-//
-//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-//                attribute.getName());
-//        if (badName != null) {
-//            return badName;
-//        }
-//
-//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-//                attribute.getType());
-//        if (emptyType != null) {
-//            return emptyType;
-//        }
-//
-//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-//                attribute.getType());
-//        if (badType != null) {
-//            return badType;
-//        }
-//
-//        return null;
-//    }
-//
-//    private ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
-//
-//        String name = attribute.getEntity().getName();
-//
-//        // validate embeddedAttribute and attribute names
-//        // embeddedAttribute returned attibute as
-//        // [name_embeddedAttribute].[name_attribute]
-//        String[] attributes = attribute.getName().split("\\.");
-//        String nameEmbeddedAttribute = attributes[0];
-//        int beginIndex = attributes[0].length();
-//        String attr = attribute.getName().substring(beginIndex + 1);
-//
-//        ValidationFailure emptyEmbeddedName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
-//                nameEmbeddedAttribute);
-//        if (emptyEmbeddedName != null) {
-//            return emptyEmbeddedName;
-//        }
-//
-//        ValidationFailure badEmbeddedName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
-//                nameEmbeddedAttribute);
-//        if (badEmbeddedName != null) {
-//            return badEmbeddedName;
-//        }
-//
-//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name", attr);
-//        if (emptyName != null) {
-//            return emptyName;
-//        }
-//
-//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name", attr);
-//        if (badName != null) {
-//            return badName;
-//        }
-//
-//        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
-//                attribute.getType());
-//        if (emptyType != null) {
-//            return emptyType;
-//        }
-//
-//        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
-//                attribute.getType());
-//        if (badType != null) {
-//            return badType;
-//        }
-//
-//        return null;
-//    }
-//
-//    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
-//
-//        String name = relationship.getSourceEntity().getName();
-//
-//        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "relationship.name",
-//                relationship.getName());
-//        if (emptyName != null) {
-//            return emptyName;
-//        }
-//
-//        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "relationship.name",
-//                relationship.getName());
-//        if (badName != null) {
-//            return badName;
-//        }
-//
-//        if (!relationship.isToMany()) {
-//
-//            ObjEntity targetEntity = relationship.getTargetEntity();
-//
-//            if (clientValidation && targetEntity != null) {
-//                targetEntity = targetEntity.getClientEntity();
-//            }
-//
-//            if (targetEntity == null) {
-//
-//                return new BeanValidationFailure(name, "relationship.targetEntity", "No target entity");
-//            } else if (!targetEntity.isGeneric()) {
-//                ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name,
-//                        "relationship.targetEntity.className", targetEntity.getClassName());
-//                if (emptyClass != null) {
-//                    return emptyClass;
-//                }
-//
-//                ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name,
-//                        "relationship.targetEntity.className", targetEntity.getClassName());
-//                if (badClass != null) {
-//                    return badClass;
-//                }
-//            }
-//        }
-//
-//        return null;
-//    }
-//
-//    /**
-//     * Returns a predicate for default entity selection in a given mode.
-//     */
-//    public Predicate getDefaultClassFilter() {
-//        return object -> {
-//            if (object instanceof ObjEntity) {
-//                return getParentController().getProblem(((ObjEntity) object).getName()) == null;
-//            }
-//
-//            if (object instanceof Embeddable) {
-//                return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
-//            }
-//
-//            return false;
-//        };
-//    }
-//
-//    private File getOutputDir() {
-//        String dir = ((GeneratorControllerPanel) getView()).getOutputFolder().getText();
-//        return dir != null ? new File(dir) : new File(System.getProperty("user.dir"));
-//    }
-//
-//    /**
-//     * An action method that pops up a file chooser dialog to pick the
-//     * generation directory.
-//     */
-//    public void selectOutputFolderAction() {
-//
-//        JTextField outputFolder = ((GeneratorControllerPanel) getView()).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();
-//            outputFolder.setText(path);
-//            setOutputPath(path);
-//        }
-//    }
-//
-//    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);
-//                }
-//            }
-//        }
-//    }
-//
-//    private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
-//        String path = lastPath.getPath();
-//        String resourcePath = buildFilePath("src", dirType, "resources");
-//        int idx = path.indexOf(resourcePath);
-//        if (idx < 0) {
-//            return null;
-//        }
-//        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
-//    }
-//
-//    private static String buildFilePath(String... pathElements) {
-//        if (pathElements.length == 0) {
-//            return "";
-//        }
-//        StringBuilder path = new StringBuilder(pathElements[0]);
-//        for (int i = 1; i < pathElements.length; i++) {
-//            path.append(File.separator).append(pathElements[i]);
-//        }
-//        return path.toString();
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
deleted file mode 100644
index 276284f..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import javax.swing.JButton;
-//import javax.swing.JPanel;
-//import javax.swing.JTextField;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//
-///**
-// * A generic panel that is a superclass of generator panels, defining common fields.
-// *
-// */
-//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");
-//    }
-//
-//    public JTextField getOutputFolder() {
-//        return outputFolder;
-//    }
-//
-//    public JButton getSelectOutputFolder() {
-//        return selectOutputFolder;
-//    }
-//
-//    public Collection<StandardPanelComponent> getDataMapLines() {
-//        return dataMapLines;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
deleted file mode 100644
index 8b915fe..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
+++ /dev/null
@@ -1,115 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.gen.ClassGenerationAction;
-//import org.apache.cayenne.modeler.util.CayenneController;
-//import org.apache.cayenne.pref.CayenneProjectPreferences;
-//import org.apache.cayenne.pref.PreferenceDetail;
-//import org.apache.cayenne.swing.BindingBuilder;
-//import org.apache.cayenne.util.Util;
-//
-//import java.awt.Component;
-//import java.awt.Dimension;
-//import java.util.Collection;
-//import java.util.HashMap;
-//import java.util.Map;
-//
-///**
-// */
-//public class GeneratorTabController extends CayenneController {
-//
-//    private static final String STANDARD_OBJECTS_MODE = "Standard Persistent Objects";
-//    private static final String CLIENT_OBJECTS_MODE = "Client Persistent Objects";
-//    private static final String ADVANCED_MODE = "Advanced";
-//
-//    public static final String GENERATOR_PROPERTY = "generator";
-//
-//    private static final String[] GENERATION_MODES = new String[] {
-//            STANDARD_OBJECTS_MODE, CLIENT_OBJECTS_MODE, ADVANCED_MODE
-//    };
-//
-//    protected GeneratorTabPanel view;
-//    protected Map controllers;
-//    protected PreferenceDetail preferences;
-//
-//    public GeneratorTabController(CodeGeneratorControllerBase parent) {
-//        super(parent);
-//
-//        this.controllers = new HashMap(5);
-//        controllers.put(STANDARD_OBJECTS_MODE, new StandardModeController(parent));
-//        controllers.put(CLIENT_OBJECTS_MODE, new ClientModeController(parent));
-//        controllers.put(ADVANCED_MODE, new CustomModeController(parent));
-//
-//        Component[] modePanels = new Component[GENERATION_MODES.length];
-//        for (int i = 0; i < GENERATION_MODES.length; i++) {
-//            modePanels[i] = ((GeneratorController) controllers.get(GENERATION_MODES[i]))
-//                    .getView();
-//        }
-//
-//        this.view = new GeneratorTabPanel(GENERATION_MODES, modePanels);
-//        initBindings();
-//        view.setPreferredSize(new Dimension(600, 480));
-//    }
-//
-//    public Component getView() {
-//        return view;
-//    }
-//
-//    protected CodeGeneratorControllerBase getParentController() {
-//        return (CodeGeneratorControllerBase) getParent();
-//    }
-//
-//    protected void initBindings() {
-//
-//        // bind actions
-//        BindingBuilder builder = new BindingBuilder(
-//                getApplication().getBindingFactory(),
-//                this);
-//
-//        CayenneProjectPreferences cayPrPref = application.getCayenneProjectPreferences();
-//
-//        this.preferences = (PreferenceDetail) cayPrPref.getProjectDetailObject(
-//                PreferenceDetail.class,
-//                getViewPreferences().node("controller"));
-//
-//        if (Util.isEmptyString(preferences.getProperty("mode"))) {
-//            preferences.setProperty("mode", STANDARD_OBJECTS_MODE);
-//        }
-//
-//        builder.bindToComboSelection(
-//                view.getGenerationMode(),
-//                "preferences.property['mode']").updateView();
-//    }
-//
-//    public PreferenceDetail getPreferences() {
-//        return preferences;
-//    }
-//
-//    public GeneratorController getGeneratorController() {
-//        Object name = view.getGenerationMode().getSelectedItem();
-//        return (GeneratorController) controllers.get(name);
-//    }
-//
-//    public Collection<ClassGenerationAction> getConfiguration() {
-//        GeneratorController modeController = getGeneratorController();
-//        return (modeController != null) ? modeController.createConfiguration() : null;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
deleted file mode 100644
index c6095ad..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
+++ /dev/null
@@ -1,65 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import com.jgoodies.forms.builder.DefaultFormBuilder;
-//import com.jgoodies.forms.layout.FormLayout;
-//
-//import javax.swing.JComboBox;
-//import javax.swing.JPanel;
-//import java.awt.BorderLayout;
-//import java.awt.CardLayout;
-//import java.awt.Component;
-//
-///**
-// */
-//public class GeneratorTabPanel extends JPanel {
-//
-//    protected JComboBox generationMode;
-//    protected CardLayout modeLayout;
-//    protected JPanel modesPanel;
-//
-//    public GeneratorTabPanel(String[] modeNames, Component[] modePanels) {
-//        this.generationMode = new JComboBox(modeNames);
-//        this.modeLayout = new CardLayout();
-//        this.modesPanel = new JPanel(modeLayout);
-//
-//        generationMode.addItemListener(e -> modeLayout.show(modesPanel, generationMode.getSelectedItem().toString()));
-//
-//        // assemble
-//        FormLayout layout = new FormLayout("right:70dlu, 3dlu, fill:300, fill:100dlu:grow", "");
-//        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-//        builder.setDefaultDialogBorder();
-//        builder.append("Type:", generationMode, 1);
-//        builder.appendSeparator();
-//
-//        for (int i = 0; i < modeNames.length; i++) {
-//            modesPanel.add(modePanels[i], modeNames[i]);
-//        }
-//
-//        setLayout(new BorderLayout());
-//        add(builder.getPanel(), BorderLayout.NORTH);
-//        add(modesPanel, BorderLayout.CENTER);
-//    }
-//
-//    public JComboBox getGenerationMode() {
-//        return generationMode;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
deleted file mode 100644
index 547f408..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
+++ /dev/null
@@ -1,82 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.gen.ClassGenerationAction;
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.modeler.pref.DataMapDefaults;
-//
-//import java.awt.Component;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.TreeMap;
-//
-//public class StandardModeController extends GeneratorController {
-//
-//    protected StandardModePanel view;
-//    protected DataMapDefaults preferences;
-//
-//    public StandardModeController(CodeGeneratorControllerBase parent) {
-//        super(parent);
-//    }
-//
-//    protected void createDefaults() {
-//        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<>();
-//        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
-//
-//        for (DataMap dataMap : dataMaps) {
-//            DataMapDefaults preferences = getApplication()
-//                    .getFrameController()
-//                    .getProjectController()
-//                    .getDataMapPreferences(dataMap);
-//
-//            preferences.setSuperclassPackage("");
-//            preferences.updateSuperclassPackage(dataMap, false);
-//
-//            treeMap.put(dataMap, preferences);
-//            if (getOutputPath() == null) {
-//                setOutputPath(preferences.getOutputPath());
-//            }
-//        }
-//
-//        setMapPreferences(treeMap);
-//    }
-//
-//    protected GeneratorControllerPanel createView() {
-//        this.view = new StandardModePanel();
-//        return view;
-//    }
-//
-//    public Component getView() {
-//        return view;
-//    }
-//
-//    @Override
-//    protected ClassGenerationAction newGenerator() {
-//        ClassGenerationAction action = new ClassGenerationAction();
-//        getApplication().getInjector().injectMembers(action);
-//        return action;
-//    }
-//
-//    @Override
-//    public Collection<ClassGenerationAction> createConfiguration() {
-//        return super.createConfiguration();
-//    }
-//}
\ No newline at end of file


[28/32] cayenne git commit: Relativize problem fix

Posted by nt...@apache.org.
Relativize problem fix


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

Branch: refs/heads/master
Commit: c19f235874d345f440e254e789c53cf0cd6aaed1
Parents: 3225c39
Author: Arseni Bulatski <an...@gmail.com>
Authored: Tue Nov 13 17:57:32 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Tue Nov 13 17:57:32 2018 +0300

----------------------------------------------------------------------
 .../main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java  | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/c19f2358/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 b31a8b0..92453c7 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
@@ -61,8 +61,8 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
                 resourcePath = resourcePath.getParent();
             }
             cgenConfiguration.setRootPath(resourcePath);
-            if(prevPath != null && resourcePath.compareTo(prevPath) != 0) {
-                Path relPath = resourcePath.relativize(prevPath);
+            if(prevPath != null) {
+                Path relPath = resourcePath.relativize(prevPath).normalize();
                 cgenConfiguration.setRelPath(relPath);
             }
         }


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

Posted by nt...@apache.org.
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() {


[32/32] cayenne git commit: Merge PR #342

Posted by nt...@apache.org.
Merge PR #342


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

Branch: refs/heads/master
Commit: b580bdad32875bec793b6d46bed3a75ac661641f
Parents: 1edb4ee d20a03f
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Nov 14 17:12:29 2018 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Nov 14 17:12:29 2018 +0300

----------------------------------------------------------------------
 RELEASE-NOTES.txt                               |   1 +
 UPGRADE.txt                                     |   1 +
 .../cayenne/tools/CayenneGeneratorTask.java     | 174 ++++--
 .../cayenne/tools/CgenWithConfigTest.java       | 158 ++++++
 cayenne-ant/src/test/resources/cgenTest.map.xml |  22 +
 .../cayenne/gen/ArtifactsGenerationMode.java    |   2 +-
 .../apache/cayenne/gen/CgenConfiguration.java   | 392 +++++++++++++
 .../java/org/apache/cayenne/gen/CgenModule.java |  34 ++
 .../cayenne/gen/ClassGenerationAction.java      | 480 ++++++----------
 .../gen/ClientClassGenerationAction.java        |  44 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |   1 -
 .../cayenne/gen/xml/CgenConfigHandler.java      | 257 +++++++++
 .../apache/cayenne/gen/xml/CgenExtension.java   |  54 ++
 .../cayenne/gen/xml/CgenLoaderDelegate.java     |  49 ++
 .../cayenne/gen/xml/CgenSaverDelegate.java      |  78 +++
 .../CayenneGeneratorEmbeddableFilterAction.java |  34 ++
 .../CayenneGeneratorEntityFilterAction.java     |  29 +-
 .../cayenne/gen/ClassGenerationActionTest.java  |  37 +-
 .../java/org/apache/cayenne/tools/CgenTask.java | 207 +++++--
 .../org/apache/cayenne/tools/BaseTaskIT.java    |  15 +
 .../org/apache/cayenne/tools/CgenTaskIT.java    |  99 +++-
 .../org/apache/cayenne/tools/CgenTaskTest.java  |  50 +-
 .../apache/cayenne/tools/DbGenerateTaskIT.java  |   4 +-
 .../apache/cayenne/tools/GradlePluginIT.java    |   2 +-
 .../org/apache/cayenne/tools/cgenMap.map.xml    |  22 +
 .../tools/cgen_replaceDatamapMode.gradle        |  31 +
 .../cayenne/tools/cgen_with_config.gradle       |  27 +
 .../cayenne/tools/cgen_with_config.map.xml      |  22 +
 .../cayenne/tools/cgen_with_configs.gradle      |  32 ++
 .../cayenne/project/CompoundSaverDelegate.java  |  15 +-
 .../cayenne/project/FileProjectSaver.java       |   2 +
 .../project/extension/BaseSaverDelegate.java    |  13 +
 .../project/extension/SaverDelegate.java        |   4 +
 .../org/apache/cayenne/schema/10/cgen.xsd       |  47 ++
 .../cayenne/tools/CayenneGeneratorMojo.java     | 201 +++++--
 .../cayenne/tools/CayenneGeneratorMojoTest.java |  70 +++
 .../resources/cgen/project-to-test/cgen-pom.xml |  46 ++
 .../cgen/project-to-test/datamap-and-pom.xml    |  53 ++
 .../project-to-test/replaceDatamapMode-pom.xml  |  53 ++
 .../src/test/resources/cgen/testCgen.map.xml    |  22 +
 .../src/test/resources/cgen/testCgenMap.map.xml |  22 +
 .../cayenne/modeler/CayenneModelerFrame.java    |  60 +-
 .../cayenne/modeler/CodeTemplateManager.java    |  97 +++-
 .../modeler/action/GenerateCodeAction.java      |  12 +-
 .../modeler/dialog/cgen/TemplateDialog.java     |  87 +++
 .../modeler/dialog/cgen/TemplateDialogView.java | 136 +++++
 .../dialog/codegen/ClassesTabController.java    | 203 -------
 .../modeler/dialog/codegen/ClassesTabPanel.java | 141 -----
 .../dialog/codegen/ClientModeController.java    |  81 ---
 .../dialog/codegen/CodeGeneratorController.java | 169 ------
 .../codegen/CodeGeneratorControllerBase.java    | 380 -------------
 .../dialog/codegen/CodeGeneratorDialog.java     |  99 ----
 .../dialog/codegen/CustomModeController.java    | 235 --------
 .../modeler/dialog/codegen/CustomModePanel.java | 137 -----
 .../codegen/CustomPreferencesUpdater.java       | 209 -------
 .../dialog/codegen/GeneratorController.java     | 563 -------------------
 .../codegen/GeneratorControllerPanel.java       |  55 --
 .../dialog/codegen/GeneratorTabController.java  | 115 ----
 .../dialog/codegen/GeneratorTabPanel.java       |  65 ---
 .../dialog/codegen/StandardModeController.java  |  82 ---
 .../dialog/codegen/StandardModePanel.java       |  42 --
 .../dialog/codegen/StandardPanelComponent.java  |  81 ---
 .../dialog/db/load/ModelerDbImportAction.java   |   3 +
 .../modeler/dialog/pref/PreferenceDialog.java   |  18 +-
 .../dialog/pref/TemplatePreferences.java        |  37 +-
 .../modeler/editor/DataDomainTabbedView.java    | 183 +++---
 .../modeler/editor/DataMapTabbedView.java       |  55 +-
 .../cayenne/modeler/editor/EditorView.java      |   3 +-
 .../editor/cgen/ClassesTabController.java       | 135 +++++
 .../modeler/editor/cgen/ClassesTabPanel.java    |  85 +++
 .../editor/cgen/ClientModeController.java       |  42 ++
 .../editor/cgen/CodeGeneratorController.java    | 255 +++++++++
 .../cgen/CodeGeneratorControllerBase.java       | 492 ++++++++++++++++
 .../modeler/editor/cgen/CodeGeneratorPane.java  |  51 ++
 .../editor/cgen/CustomModeController.java       | 188 +++++++
 .../modeler/editor/cgen/CustomModePanel.java    | 183 ++++++
 .../editor/cgen/GeneratorController.java        | 391 +++++++++++++
 .../editor/cgen/GeneratorControllerPanel.java   |  68 +++
 .../editor/cgen/GeneratorTabController.java     | 113 ++++
 .../modeler/editor/cgen/GeneratorTabPanel.java  | 104 ++++
 .../editor/cgen/StandardModeController.java     |  59 ++
 .../modeler/editor/cgen/StandardModePanel.java  |  45 ++
 .../modeler/editor/cgen/domain/CgenPanel.java   |  84 +++
 .../modeler/editor/cgen/domain/CgenTab.java     | 117 ++++
 .../editor/cgen/domain/CgenTabController.java   | 210 +++++++
 .../modeler/init/CayenneModelerModule.java      |   4 +-
 .../cayenne/modeler/util/ComboBoxAdapter.java   |  72 +++
 .../cayenne/modeler/util/ModelerUtil.java       |  46 ++
 88 files changed, 5616 insertions(+), 3382 deletions(-)
----------------------------------------------------------------------



[23/32] cayenne git commit: Cleanup

Posted by nt...@apache.org.
Cleanup


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

Branch: refs/heads/master
Commit: 3ae49734b044f611912a0bea5c69b0dd4d2705d4
Parents: b30e5eb
Author: Arseni Bulatski <an...@gmail.com>
Authored: Mon Nov 12 13:28:09 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Mon Nov 12 13:31:13 2018 +0300

----------------------------------------------------------------------
 UPGRADE.txt                                     |   5 +
 .../apache/cayenne/gen/CgenConfiguration.java   |   6 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      | 100 ++++++-------------
 .../java/org/apache/cayenne/tools/CgenTask.java |  68 ++++++-------
 .../modeler/editor/DataMapTabbedView.java       |   3 +-
 .../editor/cgen/ClassesTabController.java       |  11 +-
 .../modeler/editor/cgen/ClassesTabPanel.java    |  15 ++-
 .../editor/cgen/ClientModeController.java       |   3 +
 .../editor/cgen/CodeGeneratorController.java    |   5 +-
 .../cgen/CodeGeneratorControllerBase.java       |  37 +++++--
 .../modeler/editor/cgen/CodeGeneratorPane.java  |   9 +-
 .../editor/cgen/CustomModeController.java       |   5 +-
 .../modeler/editor/cgen/CustomModePanel.java    |  13 ++-
 .../editor/cgen/GeneratorController.java        |  12 ++-
 .../editor/cgen/GeneratorControllerPanel.java   |   6 +-
 .../editor/cgen/GeneratorTabController.java     |   4 +-
 .../modeler/editor/cgen/GeneratorTabPanel.java  |  12 ++-
 .../editor/cgen/StandardModeController.java     |   5 +-
 .../modeler/editor/cgen/StandardModePanel.java  |   5 +-
 .../modeler/editor/cgen/domain/CgenPanel.java   |  10 +-
 .../modeler/editor/cgen/domain/CgenTab.java     |  13 ++-
 .../editor/cgen/domain/CgenTabController.java   |   5 +-
 22 files changed, 205 insertions(+), 147 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 2dfbd9b..83bcc5a 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -4,6 +4,11 @@ Apache Cayenne Upgrade Information
 IMPORTANT: be sure to read all notes for the intermediate releases between your
            current release and the release you are upgrading to.
 -------------------------------------------------------------------------------
+UPGRADING TO 4.1.M3
+
+* Per CAY-2493 'datamap' generation mode in cgen replaced with 'all' generation mode with
+      <excludeEntities>*</excludeEntities> and <excludeEmbeddables>*</excludeEmbeddables> patterns.
+
 UPGRADING TO 4.1.M2
 
 * Per CAY-2438 DataChannelFilter filter was deprecated and two new independent filters are introduced:

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
index 15bc435..1277baa 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
@@ -328,7 +328,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
                 .filter(entity -> !entityArtifacts.contains(entity.getName()))
                 .map(ObjEntity::getName)
                 .collect(Collectors.toList());
-        return org.apache.commons.lang3.StringUtils.join(excludeEntities, ",");
+        return String.join(",", excludeEntities);
     }
 
     public void loadEmbeddables(String embeddables) {
@@ -341,7 +341,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
                 .filter(embeddable -> !embeddableArtifacts.contains(embeddable.getClassName()))
                 .map(Embeddable::getClassName)
                 .collect(Collectors.toList());
-        return org.apache.commons.lang3.StringUtils.join(excludeEmbeddable, ",");
+        return String.join(",", excludeEmbeddable);
     }
 
 	public void resolveExcludeEntities() {
@@ -365,7 +365,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         encoder.start("cgen")
                 .attribute("xmlns", CgenExtension.NAMESPACE)
                 .simpleTag("excludeEntities", getExcludeEntites())
-                .simpleTag("excludeEmbeddables",getExcludeEmbeddables())
+                .simpleTag("excludeEmbeddables", getExcludeEmbeddables())
                 .simpleTag("destDir", buildRelPath())
                 .simpleTag("mode", this.artifactsGenerationMode.getLabel())
                 .simpleTag("template", this.template)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 754aac6..2384f10 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
@@ -60,6 +60,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         super(parentHandler);
         this.metaData = metaData;
         this.targetNamespace = CgenExtension.NAMESPACE;
+        this.configuration = new CgenConfiguration();
     }
 
     @Override
@@ -121,70 +122,49 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         if(path.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.setRelPath(Paths.get(path));
-        }
+        configuration.setRelPath(Paths.get(path));
     }
 
     private void createGenerationMode(String mode) {
         if(mode.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.setArtifactsGenerationMode(mode);
-        }
+        configuration.setArtifactsGenerationMode(mode);
     }
 
     private void createExcludeEntities(String entities) {
         if(entities.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.loadEntities(entities);
-        }
+        configuration.loadEntities(entities);
     }
 
     private void createExcludeEmbeddables(String embeddables) {
         if(embeddables.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.loadEmbeddables(embeddables);
-        }
+        configuration.loadEmbeddables(embeddables);
     }
 
     private void createSubclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.setTemplate(template);
-        }
+        configuration.setTemplate(template);
     }
 
     private void createSuperclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.setSuperTemplate(template);
-        }
+        configuration.setSuperTemplate(template);
     }
 
     private void createOutputPattern(String pattern) {
         if(pattern.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            configuration.setOutputPattern(pattern);
-        }
+        configuration.setOutputPattern(pattern);
     }
 
     private void createMakePairs(String makePairs) {
@@ -192,12 +172,10 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             return;
         }
 
-        if (configuration != null) {
-            if (makePairs.equals(TRUE)) {
-                configuration.setMakePairs(true);
-            } else {
-                configuration.setMakePairs(false);
-            }
+        if (makePairs.equals(TRUE)) {
+            configuration.setMakePairs(true);
+        } else {
+            configuration.setMakePairs(false);
         }
     }
 
@@ -205,13 +183,10 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         if(data.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            if(data.equals(TRUE)) {
-                configuration.setUsePkgPath(true);
-            } else {
-                configuration.setUsePkgPath(false);
-            }
+        if(data.equals(TRUE)) {
+            configuration.setUsePkgPath(true);
+        } else {
+            configuration.setUsePkgPath(false);
         }
     }
 
@@ -220,12 +195,10 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             return;
         }
 
-        if(configuration != null) {
-            if(data.equals(TRUE)) {
-                configuration.setOverwrite(true);
-            } else {
-                configuration.setOverwrite(false);
-            }
+        if(data.equals(TRUE)) {
+            configuration.setOverwrite(true);
+        } else {
+            configuration.setOverwrite(false);
         }
     }
 
@@ -233,13 +206,10 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         if(data.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            if(data.equals(TRUE)) {
-                configuration.setCreatePropertyNames(true);
-            } else {
-                configuration.setCreatePropertyNames(false);
-            }
+        if(data.equals(TRUE)) {
+            configuration.setCreatePropertyNames(true);
+        } else {
+            configuration.setCreatePropertyNames(false);
         }
     }
 
@@ -248,12 +218,10 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             return;
         }
 
-        if(configuration != null) {
-            if(data.equals(TRUE)) {
-                configuration.setCreatePKProperties(true);
-            } else {
-                configuration.setCreatePKProperties(false);
-            }
+        if(data.equals(TRUE)) {
+            configuration.setCreatePKProperties(true);
+        } else {
+            configuration.setCreatePKProperties(false);
         }
     }
 
@@ -261,18 +229,14 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         if(data.trim().length() == 0) {
             return;
         }
-
-        if(configuration != null) {
-            if(data.equals(TRUE)) {
-                configuration.setClient(true);
-            } else {
-                configuration.setClient(false);
-            }
+        if(data.equals(TRUE)) {
+            configuration.setClient(true);
+        } else {
+            configuration.setClient(false);
         }
     }
 
     private void createConfig() {
-        configuration = new CgenConfiguration();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
             configuration.setRootPath(buildRootPath(dataMap));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index bfafc1f..0e63c53 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -60,7 +60,7 @@ public class CgenTask extends BaseCayenneTask {
 
     @Input
     @Optional
-    private String client;
+    private Boolean client;
 
     private File destDir;
 
@@ -85,7 +85,7 @@ public class CgenTask extends BaseCayenneTask {
 
     @Input
     @Optional
-    private String makePairs;
+    private Boolean makePairs;
 
     @Input
     @Optional
@@ -97,7 +97,7 @@ public class CgenTask extends BaseCayenneTask {
 
     @Input
     @Optional
-    private String overwrite;
+    private Boolean overwrite;
 
     @Input
     @Optional
@@ -121,11 +121,11 @@ public class CgenTask extends BaseCayenneTask {
 
     @Input
     @Optional
-    private String usePkgPath;
+    private Boolean usePkgPath;
 
     @Input
     @Optional
-    private String createPropertyNames;
+    private Boolean createPropertyNames;
 
     /**
      * Force run (skip check for files modification time)
@@ -149,7 +149,7 @@ public class CgenTask extends BaseCayenneTask {
      */
     @Input
     @Optional
-    private String createPKProperties;
+    private Boolean createPKProperties;
 
     private String destDirName;
 
@@ -240,21 +240,21 @@ public class CgenTask extends BaseCayenneTask {
         cgenConfiguration.setDataMap(dataMap);
         cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
-        cgenConfiguration.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : cgenConfiguration.isMakePairs());
+        cgenConfiguration.setMakePairs(makePairs != null ? makePairs : cgenConfiguration.isMakePairs());
         cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
         cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
-        cgenConfiguration.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : cgenConfiguration.isOverwrite());
+        cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
         cgenConfiguration.setSuperPkg(superPkg != null ? superPkg : cgenConfiguration.getSuperPkg());
         cgenConfiguration.setSuperTemplate(superTemplate != null ? superTemplate : cgenConfiguration.getSuperTemplate());
         cgenConfiguration.setTemplate(template != null ? template :  cgenConfiguration.getTemplate());
         cgenConfiguration.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : cgenConfiguration.getEmbeddableSuperTemplate());
         cgenConfiguration.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : cgenConfiguration.getEmbeddableTemplate());
-        cgenConfiguration.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : cgenConfiguration.isUsePkgPath());
-        cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : cgenConfiguration.isCreatePropertyNames());
+        cgenConfiguration.setUsePkgPath(usePkgPath != null ? usePkgPath : cgenConfiguration.isUsePkgPath());
+        cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : cgenConfiguration.isCreatePropertyNames());
         cgenConfiguration.setQueryTemplate(queryTemplate != null ? queryTemplate : cgenConfiguration.getQueryTemplate());
         cgenConfiguration.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : cgenConfiguration.getQuerySuperTemplate());
-        cgenConfiguration.setCreatePKProperties(createPKProperties != null ? Boolean.valueOf(createPKProperties) : cgenConfiguration.isCreatePKProperties());
-        cgenConfiguration.setClient(client != null ? Boolean.valueOf(client) : cgenConfiguration.isClient());
+        cgenConfiguration.setCreatePKProperties(createPKProperties != null ? createPKProperties : cgenConfiguration.isCreatePKProperties());
+        cgenConfiguration.setClient(client != null ? client : cgenConfiguration.isClient());
         if(!cgenConfiguration.isMakePairs()) {
             if(template == null) {
                 cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
@@ -361,12 +361,12 @@ public class CgenTask extends BaseCayenneTask {
         setAdditionalMaps(additionalMaps);
     }
 
-    public boolean isClient() {
-        return Boolean.valueOf(client);
+    public Boolean isClient() {
+        return client;
     }
 
-    public void setClient(boolean client) {
-        this.client = String.valueOf(client);
+    public void setClient(Boolean client) {
+        this.client = client;
     }
 
     public void client(boolean client) {
@@ -425,12 +425,12 @@ public class CgenTask extends BaseCayenneTask {
         setExcludeEmbeddables(excludeEmbeddables);
     }
 
-    public boolean isMakePairs() {
-        return Boolean.valueOf(makePairs);
+    public Boolean isMakePairs() {
+        return makePairs;
     }
 
-    public void setMakePairs(boolean makePairs) {
-        this.makePairs = String.valueOf(makePairs);
+    public void setMakePairs(Boolean makePairs) {
+        this.makePairs = makePairs;
     }
 
     public void makePairs(boolean makePairs) {
@@ -461,12 +461,12 @@ public class CgenTask extends BaseCayenneTask {
         setOutputPattern(outputPattern);
     }
 
-    public boolean isOverwrite() {
-        return Boolean.valueOf(overwrite);
+    public Boolean isOverwrite() {
+        return overwrite;
     }
 
-    public void setOverwrite(boolean overwrite) {
-        this.overwrite = String.valueOf(overwrite);
+    public void setOverwrite(Boolean overwrite) {
+        this.overwrite = overwrite;
     }
 
     public void overwrite(boolean overwrite) {
@@ -533,24 +533,24 @@ public class CgenTask extends BaseCayenneTask {
         setEmbeddableTemplate(embeddableTemplate);
     }
 
-    public boolean isUsePkgPath() {
-        return Boolean.valueOf(usePkgPath);
+    public Boolean isUsePkgPath() {
+        return usePkgPath;
     }
 
-    public void setUsePkgPath(boolean usePkgPath) {
-        this.usePkgPath = String.valueOf(usePkgPath);
+    public void setUsePkgPath(Boolean usePkgPath) {
+        this.usePkgPath = usePkgPath;
     }
 
     public void usePkgPath(boolean usePkgPath) {
         setUsePkgPath(usePkgPath);
     }
 
-    public boolean isCreatePropertyNames() {
-        return Boolean.valueOf(createPropertyNames);
+    public Boolean isCreatePropertyNames() {
+        return createPropertyNames;
     }
 
-    public void setCreatePropertyNames(boolean createPropertyNames) {
-        this.createPropertyNames = String.valueOf(createPropertyNames);
+    public void setCreatePropertyNames(Boolean createPropertyNames) {
+        this.createPropertyNames = createPropertyNames;
     }
 
     public void createPropertyNames(boolean createPropertyNames) {
@@ -569,8 +569,8 @@ public class CgenTask extends BaseCayenneTask {
         setForce(force);
     }
 
-    public void setCreatePKProperties(boolean createPKProperties) {
-        this.createPKProperties = String.valueOf(createPKProperties);
+    public void setCreatePKProperties(Boolean createPKProperties) {
+        this.createPKProperties = createPKProperties;
     }
 
     public void createPKProperties(boolean createPKProperties) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index ddd6893..9297481 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -24,7 +24,8 @@ import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
 import org.apache.cayenne.modeler.editor.cgen.domain.CgenTab;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
-import javax.swing.*;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
 
 /**
  * Data map editing tabs container

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 7b98f4c..9032071 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -25,9 +25,12 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JLabel;
+import java.awt.Component;
 
+/**
+ * @since 4.1
+ */
 public class ClassesTabController extends CayenneController {
 
     protected ClassesTabPanel view;
@@ -111,7 +114,7 @@ public class ClassesTabController extends CayenneController {
         else if (selectedCount == getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(true);
         }
-        getParentController().updateEntities();
+        getParentController().updateSelectedEntities();
     }
 
     /**
@@ -121,7 +124,7 @@ public class ClassesTabController extends CayenneController {
     public void checkAllAction() {
         if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
-            getParentController().updateEntities();
+            getParentController().updateSelectedEntities();
             if(view.getCheckAll().isSelected()) {
                 getParentController().enableGenerateButton(true);
             } else {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
index 403058f..3f5c49c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -19,8 +19,16 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.UIManager;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
 /**
  * @since 4.1
@@ -35,9 +43,6 @@ public class ClassesTabPanel extends JPanel {
 
         this.table = new JTable();
         this.table.setRowHeight(22);
-
-        // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
-        // table header????
         this.checkAll = new JCheckBox();
         this.checkAllLabel = new JLabel("Check All Classes");
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
index 7485d25..b55c24b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
@@ -21,6 +21,9 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.CgenConfiguration;
 
+/**
+ * @since 4.1
+ */
 public class ClientModeController extends StandardModeController {
 
     public ClientModeController(CodeGeneratorControllerBase parent) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 1274ecb..1244178 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
@@ -30,14 +30,15 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JOptionPane;
+import java.awt.Component;
 import java.util.Collections;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Predicate;
 
 /**
+ * @since 4.1
  * A controller for the class generator dialog.
  */
 public class CodeGeneratorController extends CodeGeneratorControllerBase {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 211384d..21a3736 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
@@ -32,19 +32,27 @@ import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import java.awt.Component;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 import java.util.stream.Collectors;
 
 /**
+ * @since 4.1
  * A base superclass of a top controller for the code generator. Defines all common model
  * parts used in class generation.
  *
@@ -108,11 +116,13 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         if(cgenConfiguration != null){
             addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities());
             addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables());
+            cgenConfiguration.setForce(true);
             return cgenConfiguration;
         }
 
         try {
             cgenConfiguration = new CgenConfiguration();
+            cgenConfiguration.setForce(true);
             cgenConfiguration.setDataMap(map);
 
             Path basePath = Paths.get(ModelerUtil.initOutputFolder());
@@ -238,9 +248,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     }
 
     public List<Embeddable> getSelectedEmbeddables() {
-
         List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
-
         for (Object classObj : classes) {
             if (classObj instanceof Embeddable
                     && selectedEmbeddables.contains(((Embeddable) classObj)
@@ -379,16 +387,29 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return labelIcon;
     }
 
-    public void updateEntities(){
+    public void updateSelectedEntities(){
+        updateEntities();
+        updateEmbeddables();
+    }
+
+    public void updateEntities() {
         DataMap map = getProjectController().getCurrentDataMap();
         CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
         if(cgenConfiguration != null) {
-            cgenConfiguration.resetCollections();
+            cgenConfiguration.getEntities().clear();
             for(ObjEntity entity: getSelectedEntities()) {
                 if(!entity.isGeneric()) {
                     cgenConfiguration.loadEntity(entity.getName());
                 }
             }
+        }
+    }
+
+    public void updateEmbeddables() {
+        DataMap map = getProjectController().getCurrentDataMap();
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null) {
+            cgenConfiguration.getEmbeddables().clear();
             for(Embeddable embeddable : getSelectedEmbeddables()) {
                 cgenConfiguration.loadEmbeddable(embeddable.getClassName());
             }
@@ -404,7 +425,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
         prepareClasses(dataMap);
         selectedEmbeddables.addAll(embeddables);
-        updateEntities();
+        updateEmbeddables();
     }
 
     public int getSelectedEntitiesSize() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
index 859cb2d..003d850 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -19,10 +19,15 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
 
 /**
+ * @since 4.1
  */
 public class CodeGeneratorPane extends JSplitPane {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 247d747..4a23e6b 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
@@ -25,13 +25,14 @@ import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.swing.BindingBuilder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.DefaultComboBoxModel;
+import java.awt.Component;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 /**
+ * @since 4.1
  * A controller for the custom generation mode.
  */
 public class CustomModeController extends GeneratorController {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 468eec7..8b1d2a3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -29,9 +29,16 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.*;
-import java.awt.*;
-
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+
+/**
+ * @since 4.1
+ */
 public class CustomModePanel extends GeneratorControllerPanel {
 
     private ComboBoxAdapter<String> subclassTemplate;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 22187f5..1b49a46 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
@@ -21,7 +21,12 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
@@ -34,13 +39,14 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
 import java.io.File;
 import java.util.function.Predicate;
 
 /**
+ * @since 4.1
  * A mode-specific part of the code generation dialog.
- * 
  */
 public abstract class GeneratorController extends CayenneController {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 5771b89..3275726 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
@@ -25,11 +25,13 @@ import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
 
 /**
+ * @since 4.1
  * A generic panel that is a superclass of generator panels, defining common fields.
- * 
  */
 public class GeneratorControllerPanel extends JPanel {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/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 6af5436..77a71b8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java
@@ -23,11 +23,13 @@ import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.pref.PreferenceDetail;
 
-import java.awt.*;
+import java.awt.Component;
+import java.awt.Dimension;
 import java.util.HashMap;
 import java.util.Map;
 
 /**
+ * @since 4.1
  */
 public class GeneratorTabController extends CayenneController {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
index 08f1dee..a10fe21 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -24,8 +24,16 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.util.Objects;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
index 5b34efc..ba4344e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -22,8 +22,11 @@ package org.apache.cayenne.modeler.editor.cgen;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import java.awt.*;
+import java.awt.Component;
 
+/**
+ * @since 4.1
+ */
 public class StandardModeController extends GeneratorController {
 
     protected StandardModePanel view;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
index 2b755e7..85c2d5f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
@@ -23,8 +23,11 @@ import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
 
-import java.awt.*;
+import java.awt.BorderLayout;
 
+/**
+ * @since 4.1
+ */
 public class StandardModePanel extends GeneratorControllerPanel {
 
     public StandardModePanel(CodeGeneratorControllerBase codeGeneratorControllerBase) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
index 637cc12..e8e6596 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
@@ -27,9 +27,15 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
 
+/**
+ * @since 4.1
+ */
 public class CgenPanel extends JPanel {
 
     private JCheckBox checkConfig;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
index 0c5288e..5d7c88a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
@@ -25,12 +25,21 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentMap;
 
+/**
+ * @since 4.1
+ */
 public class CgenTab extends JPanel {
 
     protected ProjectController projectController;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3ae49734/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
index 0f82abf..f9549ec 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
@@ -35,7 +35,7 @@ import org.apache.cayenne.project.Project;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
+import javax.swing.JOptionPane;
 import java.awt.event.ItemEvent;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -48,6 +48,9 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.prefs.Preferences;
 
+/**
+ * @since 4.1
+ */
 public class CgenTabController {
 
     private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);


[02/32] cayenne git commit: cgen. create ui

Posted by nt...@apache.org.
cgen. create ui


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

Branch: refs/heads/master
Commit: 8119ffaa88f70787590df6b23bc86c031337b921
Parents: 831442c
Author: Arseni Bulatski <an...@gmail.com>
Authored: Thu Jun 14 16:57:22 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:39:05 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/xml/CgenConfigHandler.java      |  23 +
 .../apache/cayenne/gen/xml/CgenExtension.java   |  32 ++
 .../cayenne/gen/xml/CgenLoaderDelegate.java     |  28 +
 .../cayenne/gen/xml/CgenSaverDelegate.java      |  20 +
 .../modeler/editor/DataMapTabbedView.java       |  10 +-
 .../cayenne/modeler/editor/EditorView.java      |   3 +-
 .../editor/cgen/ClassesTabController.java       | 123 ++++
 .../modeler/editor/cgen/ClassesTabPanel.java    |  84 +++
 .../editor/cgen/CodeGeneratorController.java    | 146 +++++
 .../cgen/CodeGeneratorControllerBase.java       | 289 ++++++++++
 .../modeler/editor/cgen/CodeGeneratorPane.java  |  76 +++
 .../editor/cgen/CustomModeController.java       | 238 ++++++++
 .../modeler/editor/cgen/CustomModePanel.java    | 189 ++++++
 .../editor/cgen/CustomPreferencesUpdater.java   | 193 +++++++
 .../editor/cgen/GeneratorController.java        | 568 +++++++++++++++++++
 .../editor/cgen/GeneratorControllerPanel.java   |  53 ++
 .../editor/cgen/GeneratorTabController.java     |  71 +++
 .../modeler/editor/cgen/GeneratorTabPanel.java  |  33 ++
 .../editor/cgen/StandardPanelComponent.java     |  79 +++
 .../modeler/init/CayenneModelerModule.java      |   4 +-
 20 files changed, 2256 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..23f0ff3
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
@@ -0,0 +1,23 @@
+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.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
+
+    private DataChannelMetaData metaData;
+
+    CgenConfigHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) {
+        super(parentHandler);
+        this.metaData = metaData;
+        this.targetNamespace = DbImportExtension.NAMESPACE;
+    }
+
+    @Override
+    protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..619bffc
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java
@@ -0,0 +1,32 @@
+package org.apache.cayenne.gen.xml;
+
+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.LoaderDelegate;
+import org.apache.cayenne.project.extension.ProjectExtension;
+import org.apache.cayenne.project.extension.SaverDelegate;
+
+public class CgenExtension implements ProjectExtension {
+
+    public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/cgen";
+
+    @Inject
+    private DataChannelMetaData metaData;
+
+    @Override
+    public LoaderDelegate createLoaderDelegate() {
+        return null;
+    }
+
+    @Override
+    public SaverDelegate createSaverDelegate() {
+        return new CgenSaverDelegate(metaData);
+    }
+
+    @Override
+    public ConfigurationNodeVisitor<String> createNamingDelegate() {
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..44438e3
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java
@@ -0,0 +1,28 @@
+package org.apache.cayenne.gen.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+
+import org.apache.cayenne.project.extension.LoaderDelegate;
+
+public class CgenLoaderDelegate implements LoaderDelegate {
+
+    private DataChannelMetaData metaData;
+
+    CgenLoaderDelegate(DataChannelMetaData metaData){
+        this.metaData = metaData;
+    }
+
+    @Override
+    public String getTargetNamespace() {
+        return CgenExtension.NAMESPACE;
+    }
+
+    @Override
+    public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent, String tag) {
+//        if(CgenConfigHandler.CONFIG_TAG.equals(tag)) {
+//            return new CgenConfigHandler(parent, metaData);
+//        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..f9c7173
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
@@ -0,0 +1,20 @@
+package org.apache.cayenne.gen.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.project.extension.BaseSaverDelegate;
+
+public class CgenSaverDelegate extends BaseSaverDelegate{
+
+    private DataChannelMetaData metaData;
+
+    CgenSaverDelegate(DataChannelMetaData metaData){
+        this.metaData = metaData;
+    }
+
+    @Override
+    public Void visitDataMap(DataMap dataMap) {
+
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index ed1b6f1..bd9afc5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -18,12 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.editor;
 
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-
+import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
+import javax.swing.*;
+
 
 /**
  * Data map editing tabs container
@@ -55,8 +56,11 @@ public class DataMapTabbedView extends JTabbedPane {
         // must be wrapped in a scroll pane
         JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
         JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
+        CodeGeneratorController codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
+        JScrollPane cgenView = new JScrollPane(codeGeneratorController.getView());
         addTab("DataMap", dataMapView);
         addTab("DbImport", dbImportView);
+        addTab("Cgen", cgenView);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
index e9b3290..5b4675a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EditorView.java
@@ -103,7 +103,6 @@ public class EditorView extends JPanel implements ObjEntityDisplayListener,
     private SQLTemplateTabbedView sqlTemplateView;
     private EjbqlTabbedView ejbqlQueryView;
     private JTabbedPane dataNodeView;
-    
 
     protected ActionManager actionManager;
 	private FilterController filterController;
@@ -162,7 +161,7 @@ public class EditorView extends JPanel implements ObjEntityDisplayListener,
 
     public EditorView(ProjectController eventController) {
         this.eventController = eventController;
-        this.actionManager= eventController.getApplication().getActionManager();
+        this.actionManager = eventController.getApplication().getActionManager();
         initView();
         initController();
        

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..2b478ac
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -0,0 +1,123 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ImageRendererColumn;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.swing.TableBindingBuilder;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class ClassesTabController extends CayenneController {
+
+    public static final String GENERATE_PROPERTY = "generate";
+
+    protected ClassesTabPanel view;
+    protected ObjectBinding tableBinding;
+
+    public ClassesTabController(CodeGeneratorControllerBase parent) {
+        super(parent);
+
+        this.view = new ClassesTabPanel();
+    }
+
+    public void startup(DataMap dataMap){
+        initBindings();
+    }
+
+    protected CodeGeneratorControllerBase getParentController() {
+        return (CodeGeneratorControllerBase) getParent();
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    protected void initBindings() {
+
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+
+        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
+
+        tableBuilder.addColumn(
+                "",
+                "parent.setCurrentClass(#item), selected",
+                Boolean.class,
+                true,
+                Boolean.TRUE);
+        tableBuilder.addColumn(
+                "Class",
+                "parent.getItemName(#item)",
+                JLabel.class,
+                false,
+                "XXXXXXXXXXXXXX");
+
+        tableBuilder.addColumn(
+                "Comments, Warnings",
+                "parent.getProblem(#item)",
+                String.class,
+                false,
+                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+
+        this.tableBinding = tableBuilder.bindToTable(view.getTable(), "parent.classes");
+        view.getTable().getColumnModel().getColumn(1).setCellRenderer(new ImageRendererColumn());
+    }
+
+    public boolean isSelected() {
+        return getParentController().isSelected();
+    }
+
+    public void setSelected(boolean selected) {
+        getParentController().setSelected(selected);
+        classSelectedAction();
+    }
+
+    /**
+     * A callback action that updates the state of Select All checkbox.
+     */
+    public void classSelectedAction() {
+        int selectedCount = getParentController().getSelectedEntitiesSize() + getParentController().getSelectedEmbeddablesSize() ;
+
+        if (selectedCount == 0) {
+            view.getCheckAll().setSelected(false);
+        }
+        else if (selectedCount == getParentController().getClasses().size()) {
+            view.getCheckAll().setSelected(true);
+        }
+    }
+
+    /**
+     * An action that updates entity check boxes in response to the Select All state
+     * change.
+     */
+    public void checkAllAction() {
+        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
+            tableBinding.updateView();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
new file mode 100644
index 0000000..e4fc20c
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -0,0 +1,84 @@
+/*****************************************************************
+ *   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 javax.swing.*;
+import java.awt.*;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+/**
+ */
+public class ClassesTabPanel extends JPanel {
+
+    protected JTable table;
+    protected JCheckBox checkAll;
+    protected JLabel checkAllLabel;
+
+    public ClassesTabPanel() {
+
+        this.table = new JTable();
+        this.table.setRowHeight(22);
+
+        // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
+        // table header????
+        this.checkAll = new JCheckBox();
+        this.checkAllLabel = new JLabel("Check All Classes");
+
+        checkAll.addItemListener(new ItemListener() {
+
+            public void itemStateChanged(ItemEvent event) {
+                if (checkAll.isSelected()) {
+                    checkAllLabel.setText("Uncheck All Classess");
+                }
+                else {
+                    checkAllLabel.setText("Check All Classes");
+                }
+            }
+        });
+
+        // assemble
+        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
+        topPanel.setBorder(UIManager.getBorder("ToolBar.border"));
+        topPanel.add(checkAll);
+        topPanel.add(checkAllLabel);
+
+        JScrollPane tablePanel = new JScrollPane(
+                table,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+
+        // set some minimal preferred size, so that it is smaller than other forms used in
+        // the dialog... this way we get the right automated overall size
+        tablePanel.setPreferredSize(new Dimension(300, 200));
+
+        setLayout(new BorderLayout());
+        add(topPanel, BorderLayout.NORTH);
+        add(tablePanel, BorderLayout.CENTER);
+    }
+
+    public JTable getTable() {
+        return table;
+    }
+
+    public JCheckBox getCheckAll() {
+        return checkAll;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..8163acb
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java
@@ -0,0 +1,146 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collection;
+import java.util.function.Predicate;
+
+/**
+ * A controller for the class generator dialog.
+ */
+public class CodeGeneratorController extends CodeGeneratorControllerBase {
+    /**
+     * Logger to print stack traces
+     */
+    private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);
+
+    protected CodeGeneratorPane view;
+
+    protected ClassesTabController classesSelector;
+    protected GeneratorTabController generatorSelector;
+
+    public CodeGeneratorController(CayenneController parent, ProjectController projectController) {
+        super(parent, projectController);
+        initListeners();
+        this.classesSelector = new ClassesTabController(this);
+        this.generatorSelector = new GeneratorTabController(this);
+        view = new CodeGeneratorPane(generatorSelector.getView(), classesSelector.getView());
+        initBindings();
+    }
+
+    private void initListeners(){
+        projectController.addDataMapDisplayListener(e -> {
+            super.startup(e.getDataMap());
+            classesSelector.startup(e.getDataMap());
+            generatorSelector.startup(e.getDataMap());
+        });
+    }
+
+    @Override
+    public Component getView() {
+        return view;
+    }
+
+    protected void initBindings() {
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        builder.bindToAction(view.getGenerateButton(), "generateAction()");
+        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
+        builder.bindToAction(generatorSelector, "generatorSelectedAction()",
+                GeneratorTabController.GENERATOR_PROPERTY);
+
+        generatorSelectedAction();
+    }
+
+    public void generatorSelectedAction() {
+        GeneratorController controller = generatorSelector.getGeneratorController();
+        validate(controller);
+
+        Predicate<Object> predicate = controller != null
+                ? controller.getDefaultClassFilter()
+                : o -> false;
+
+        updateSelection(predicate);
+        classesSelector.classSelectedAction();
+    }
+
+    public void classesSelectedAction() {
+        int size = getSelectedEntitiesSize();
+        String label;
+
+        if (size == 0) {
+            label = "No entities selected";
+        }
+        else if (size == 1) {
+            label = "One entity selected";
+        }
+        else {
+            label = size + " entities selected";
+        }
+
+        label = label.concat("; ");
+        
+        int sizeEmb = getSelectedEmbeddablesSize();
+
+        if (sizeEmb == 0) {
+            label = label + "No embeddables selected";
+        }
+        else if (sizeEmb == 1) {
+            label = label + "One embeddable selected";
+        }
+        else {
+            label =label + sizeEmb + " embeddables selected";
+        }
+        
+        view.getClassesCount().setText(label);
+    }
+
+    public void generateAction() {
+        Collection<ClassGenerationAction> generators = generatorSelector.getGenerator();
+
+        if (generators != null) {
+            try {
+                for (ClassGenerationAction generator : generators) {
+                    generator.execute();
+                }
+                JOptionPane.showMessageDialog(
+                        getView(),
+                        "Class generation finished");
+            } catch (Exception e) {
+                logObj.error("Error generating classes", e);
+                JOptionPane.showMessageDialog(
+                        getView(),
+                        "Error generating classes - " + e.getMessage());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..17196fa
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java
@@ -0,0 +1,289 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.CellRenderers;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * A base superclass of a top controller for the code generator. Defines all common model
+ * parts used in class generation.
+ *
+ */
+public abstract class CodeGeneratorControllerBase extends CayenneController {
+
+    public static final String SELECTED_PROPERTY = "selected";
+
+    protected Collection<DataMap> dataMaps;
+
+    protected DataMap dataMap;
+
+    protected ValidationResult validation;
+
+    protected List<Object> classes;
+
+    protected Set<String> selectedEntities;
+    protected Set<String> selectedEmbeddables;
+
+    protected transient Object currentClass;
+
+    protected ProjectController projectController;
+
+    public CodeGeneratorControllerBase(CayenneController parent, ProjectController projectController) {
+        super(parent);
+        this.projectController = projectController;
+        this.classes = new ArrayList<>();
+
+        this.selectedEntities = new HashSet<>();
+        this.selectedEmbeddables = new HashSet<>();
+    }
+
+    public void startup(DataMap dataMap){
+        this.dataMap = dataMap;
+        classes.clear();
+        this.classes.addAll(dataMap.getObjEntities());
+        this.classes.addAll(dataMap.getEmbeddables());
+    }
+
+    public List<Object> getClasses() {
+        return classes;
+    }
+
+    public abstract Component getView();
+
+    public void validate(GeneratorController validator) {
+
+        ValidationResult validationBuffer = new ValidationResult();
+
+        if (validator != null) {
+            for (Object classObj : classes) {
+                if (classObj instanceof ObjEntity) {
+                    validator.validateEntity(
+                            validationBuffer,
+                            (ObjEntity) classObj,
+                            false);
+                }
+                else if (classObj instanceof Embeddable) {
+                    validator.validateEmbeddable(validationBuffer, (Embeddable) classObj);
+                }
+            }
+
+        }
+
+        this.validation = validationBuffer;
+    }
+
+    public boolean updateSelection(Predicate<Object> predicate) {
+
+        boolean modified = false;
+
+        for (Object classObj : classes) {
+            boolean select = predicate.test(classObj);
+            if (classObj instanceof ObjEntity) {
+
+                if (select) {
+                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+                        modified = true;
+                    }
+                }
+                else {
+                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+                        modified = true;
+                    }
+                }
+            }
+            else if (classObj instanceof Embeddable) {
+                if (select) {
+                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+                else {
+                    if (selectedEmbeddables
+                            .remove(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+            }
+
+        }
+
+        if (modified) {
+            firePropertyChange(SELECTED_PROPERTY, null, null);
+        }
+
+        return modified;
+    }
+
+    public List<Embeddable> getSelectedEmbeddables() {
+
+        List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
+
+        for (Object classObj : classes) {
+            if (classObj instanceof Embeddable
+                    && selectedEmbeddables.contains(((Embeddable) classObj)
+                            .getClassName())) {
+                selected.add((Embeddable) classObj);
+            }
+        }
+
+        return selected;
+    }
+
+    public List<ObjEntity> getSelectedEntities() {
+        List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
+        for (Object classObj : classes) {
+            if (classObj instanceof ObjEntity
+                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
+                selected.add(((ObjEntity) classObj));
+            }
+        }
+
+        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.
+     */
+    public String getProblem(Object obj) {
+
+        String name = null;
+        
+        if (obj instanceof ObjEntity) {
+            name = ((ObjEntity) obj).getName();
+        }
+        else if (obj instanceof Embeddable) {
+            name = ((Embeddable) obj).getClassName();
+        }
+        
+        if (validation == null) {
+            return null;
+        }
+
+        List failures = validation.getFailures(name);
+        if (failures.isEmpty()) {
+            return null;
+        }
+
+        return ((ValidationFailure) failures.get(0)).getDescription();
+    }
+
+    public boolean isSelected() {
+        if (currentClass instanceof ObjEntity) {
+            return selectedEntities
+                    .contains(((ObjEntity) currentClass).getName());
+        }
+        if (currentClass instanceof Embeddable) {
+            return selectedEmbeddables
+                    .contains(((Embeddable) currentClass).getClassName());
+        }
+        return false;
+
+    }
+
+    public void setSelected(boolean selectedFlag) {
+        if (currentClass == null) {
+            return;
+        }
+        if (currentClass instanceof ObjEntity) {
+            if (selectedFlag) {
+                if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+            else {
+                if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+        }
+        if (currentClass instanceof Embeddable) {
+            if (selectedFlag) {
+                if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+            else {
+                if (selectedEmbeddables
+                        .remove(((Embeddable) currentClass).getClassName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+        }
+    }
+
+    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;
+        if (obj instanceof Embeddable) {
+            className = ((Embeddable) obj).getClassName();
+            icon = CellRenderers.iconForObject(new Embeddable());
+        } else {
+            className = ((ObjEntity) obj).getName();
+            icon = CellRenderers.iconForObject(new ObjEntity());
+        }
+        JLabel labelIcon = new JLabel();
+        labelIcon.setIcon(icon);
+        labelIcon.setVisible(true);
+        labelIcon.setText(className);
+        return labelIcon;
+    }
+
+    public DataMap getDataMap() {
+        return dataMap;
+    }
+
+    public ProjectController getProjectController() {
+        return projectController;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
new file mode 100644
index 0000000..334931a
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -0,0 +1,76 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.swing.components.TopBorder;
+
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ */
+public class CodeGeneratorPane extends JSplitPane {
+
+    protected JSplitPane splitPane;
+
+    protected JButton generateButton;
+    protected JLabel classesCount;
+
+    public CodeGeneratorPane(Component generatorPanel, Component entitySelectorPanel) {
+        super();
+
+        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
+
+        this.generateButton = new JButton("Generate");
+        this.classesCount = new JLabel("No classes selected");
+        classesCount.setFont(classesCount.getFont().deriveFont(10f));
+
+        JScrollPane scrollPane = new JScrollPane(
+                generatorPanel,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+        scrollPane.setPreferredSize(new Dimension(800, 400));
+
+        // assemble
+        splitPane.setRightComponent(scrollPane);
+        splitPane.setLeftComponent(entitySelectorPanel);
+
+        JPanel messages = new JPanel(new BorderLayout());
+        messages.add(classesCount, BorderLayout.WEST);
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.setBorder(TopBorder.create());
+        buttons.add(classesCount);
+        buttons.add(Box.createHorizontalStrut(50));
+        buttons.add(generateButton);
+
+        setLayout(new BorderLayout());
+        add(splitPane, BorderLayout.CENTER);
+        add(buttons, BorderLayout.SOUTH);
+    }
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JLabel getClassesCount() {
+        return classesCount;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..8f4dac9
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java
@@ -0,0 +1,238 @@
+/*****************************************************************
+ *   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 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;
+import org.apache.cayenne.util.Util;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+
+/**
+ * A controller for the custom generation mode.
+ */
+public class CustomModeController extends GeneratorController {
+
+    // correspond to non-public constants on MapClassGenerator.
+    static final String MODE_DATAMAP = "datamap";
+    static final String MODE_ENTITY = "entity";
+    static final String MODE_ALL = "all";
+
+    static final String DATA_MAP_MODE_LABEL = "DataMap generation";
+    static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
+    static final String ALL_MODE_LABEL = "Generate all";
+
+    static final Map<String, String> modesByLabel = 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);
+    }
+
+    protected CustomModePanel view;
+    protected CodeTemplateManager templateManager;
+
+    protected ObjectBinding superTemplate;
+    protected ObjectBinding subTemplate;
+
+    private BindingBuilder builder;
+
+    private CustomPreferencesUpdater preferencesUpdater;
+
+    public CustomPreferencesUpdater getCustomPreferencesUpdater() {
+        return preferencesUpdater;
+    }
+
+    public CustomModeController(CodeGeneratorControllerBase parent) {
+        super(parent);
+        this.view = new CustomModePanel();
+        bind();
+    }
+
+    private void bind() {
+        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
+        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));
+    }
+
+    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();
+    }
+
+    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);
+    }
+
+    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() {
+        this.templateManager = getApplication().getCodeTemplateManager();
+
+        List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
+        Collections.sort(customTemplates);
+
+        List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
+        Collections.sort(superTemplates);
+        superTemplates.addAll(customTemplates);
+
+        List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
+        Collections.sort(subTemplates);
+        subTemplates.addAll(customTemplates);
+
+        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();
+    }
+
+    @Override
+    protected ClassGenerationAction newGenerator() {
+        ClassGenerationAction action = new ClassGenerationAction();
+        getApplication().getInjector().injectMembers(action);
+        return action;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..538ff64
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -0,0 +1,189 @@
+/*****************************************************************
+ *   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.swing.control.ActionLink;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class CustomModePanel extends GeneratorControllerPanel {
+
+    protected JComboBox generationMode;
+    protected JComboBox subclassTemplate;
+    protected JComboBox superclassTemplate;
+    protected JCheckBox pairs;
+    protected JCheckBox overwrite;
+    protected JCheckBox usePackagePath;
+    protected JTextField outputPattern;
+    protected JCheckBox createPropertyNames;
+
+    private JTextField additionalMaps;
+    private JButton selectAdditionalMaps;
+    private JCheckBox client;
+    private JTextField encoding;
+    private JComboBox embeddableTemplate;
+    private JComboBox embeddableSuperTemplate;
+    private JLabel dataMapName;
+
+    private DefaultFormBuilder builder;
+
+    protected ActionLink manageTemplatesLink;
+
+    private StandardPanelComponent standardPanelComponent;
+
+    public CustomModePanel() {
+
+        this.generationMode = new JComboBox();
+        this.superclassTemplate = new JComboBox();
+        this.subclassTemplate = new JComboBox();
+        this.pairs = new JCheckBox();
+        this.overwrite = new JCheckBox();
+        this.usePackagePath = new JCheckBox();
+        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.additionalMaps = new JTextField();
+        this.selectAdditionalMaps = new JButton("Select");
+        this.client = new JCheckBox();
+        this.encoding = new JTextField();
+        this.embeddableTemplate = new JComboBox();
+        this.embeddableSuperTemplate = new JComboBox();
+        this.dataMapName = new JLabel();
+        this.dataMapName.setFont(dataMapName.getFont().deriveFont(1));
+
+        pairs.addChangeListener(e -> {
+            superclassTemplate.setEnabled(pairs.isSelected());
+            overwrite.setEnabled(!pairs.isSelected());
+        });
+
+        // assemble
+
+        FormLayout layout = new FormLayout(
+                "right:77dlu, 3dlu, fill:200:grow, 6dlu, fill:50dlu, 3dlu", "");
+        builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        builder.append("Output Directory:", outputFolder, selectOutputFolder);
+        builder.nextLine();
+
+        builder.append("Additional DataMaps", additionalMaps, selectAdditionalMaps);
+        builder.nextLine();
+
+        builder.append("Generation Mode:", generationMode);
+        builder.nextLine();
+
+        builder.append("Subclass Template:", subclassTemplate);
+        builder.nextLine();
+
+        builder.append("Superclass Template:", superclassTemplate);
+        builder.nextLine();
+
+        builder.append("Embeddable Template", embeddableTemplate);
+        builder.nextLine();
+
+        builder.append("Embeddable Super Template", embeddableSuperTemplate);
+        builder.nextLine();
+
+        builder.append("Output Pattern:", outputPattern);
+        builder.nextLine();
+
+        builder.append("Encoding", encoding);
+        builder.nextLine();
+
+        builder.append("Make Pairs:", pairs);
+        builder.nextLine();
+
+        builder.append("Use Package Path:", usePackagePath);
+        builder.nextLine();
+
+        builder.append("Overwrite Subclasses:", overwrite);
+        builder.nextLine();
+
+        builder.append("Create Property Names:", createPropertyNames);
+        builder.nextLine();
+
+        builder.append("Client", client);
+        builder.nextLine();
+
+        builder.append(standardPanelComponent, 4);
+
+        setLayout(new BorderLayout());
+        add(builder.getPanel(), BorderLayout.CENTER);
+
+        JPanel links = new JPanel(new FlowLayout(FlowLayout.TRAILING));
+        links.add(manageTemplatesLink);
+        add(links, BorderLayout.SOUTH);
+
+        add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    public void addDataMapLine(StandardPanelComponent dataMapLine) {
+        dataMapLines.add(dataMapLine);
+        builder.append(dataMapLine, 4);
+        builder.nextLine();
+    }
+
+    public JComboBox getGenerationMode() {
+        return generationMode;
+    }
+
+    public ActionLink getManageTemplatesLink() {
+        return manageTemplatesLink;
+    }
+
+    public JComboBox getSubclassTemplate() {
+        return subclassTemplate;
+    }
+
+    public JComboBox getSuperclassTemplate() {
+        return superclassTemplate;
+    }
+
+    public JCheckBox getOverwrite() {
+        return overwrite;
+    }
+
+    public JCheckBox getPairs() {
+        return pairs;
+    }
+
+    public JCheckBox getUsePackagePath() {
+        return usePackagePath;
+    }
+
+    public JTextField getOutputPattern() {
+        return outputPattern;
+    }
+
+    public JCheckBox getCreatePropertyNames() {
+        return createPropertyNames;
+    }
+
+    public StandardPanelComponent getStandardPanelComponent() {
+        return standardPanelComponent;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
new file mode 100644
index 0000000..469e594
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
@@ -0,0 +1,193 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.pref.DataMapDefaults;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+public class CustomPreferencesUpdater {
+
+    enum Property {
+        SUBCLASS_TEMPLATE,
+        SUPERCLASS_TEMPLATE,
+        OVERWRITE,
+        PAIRS,
+        USE_PACKAGE_PATH,
+        MODE,
+        OUTPUT_PATTERN,
+        CREATE_PROPERTY_NAMES
+    }
+
+    private static final String OVERWRITE = "overwrite";
+    private static final String PAIRS = "pairs";
+    private static final String USE_PACKAGE_PATH = "usePackagePath";
+    private static final String MODE = "mode";
+    private static final String OUTPUT_PATTERN = "outputPattern";
+    private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
+
+    private Map<DataMap, DataMapDefaults> mapPreferences;
+
+
+    public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences) {
+        this.mapPreferences = mapPreferences;
+    }
+
+    public String getMode() {
+        return (String) getProperty(Property.MODE);
+    }
+
+    public void setMode(String mode) {
+        updatePreferences(Property.MODE, mode);
+    }
+
+    public String getSubclassTemplate() {
+        return (String) getProperty(Property.SUBCLASS_TEMPLATE);
+    }
+
+    public void setSubclassTemplate(String subclassTemplate) {
+        updatePreferences(Property.SUBCLASS_TEMPLATE, subclassTemplate);
+    }
+
+    public String getSuperclassTemplate() {
+        return (String) getProperty(Property.SUPERCLASS_TEMPLATE);
+    }
+
+    public void setSuperclassTemplate(String superclassTemplate) {
+        updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);
+    }
+
+    public Boolean getOverwrite() {
+        return (Boolean) getProperty(Property.OVERWRITE);
+    }
+
+    public void setOverwrite(Boolean overwrite) {
+        updatePreferences(Property.OVERWRITE, overwrite);
+    }
+
+    public Boolean getPairs() {
+        return (Boolean) getProperty(Property.PAIRS);
+    }
+
+    public void setPairs(Boolean pairs) {
+        updatePreferences(Property.PAIRS, pairs);
+    }
+
+    public Boolean getUsePackagePath() {
+        return (Boolean) getProperty(Property.USE_PACKAGE_PATH);
+    }
+
+    public void setUsePackagePath(Boolean usePackagePath) {
+        updatePreferences(Property.USE_PACKAGE_PATH, usePackagePath);
+    }
+
+    public String getOutputPattern() {
+        return (String) getProperty(Property.OUTPUT_PATTERN);
+    }
+
+    public void setOutputPattern(String outputPattern) {
+        updatePreferences(Property.OUTPUT_PATTERN, outputPattern);
+    }
+
+    public Boolean getCreatePropertyNames() {
+        return (Boolean) getProperty(Property.CREATE_PROPERTY_NAMES);
+    }
+
+    public void setCreatePropertyNames(Boolean createPropertyNames) {
+        updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
+    }
+
+    private Object getProperty(Property property) {
+        Object obj = null;
+
+        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
+        for (Entry<DataMap, DataMapDefaults> entry : entities) {
+
+            switch (property) {
+                case MODE:
+                    obj = entry.getValue().getProperty(MODE);
+                    break;
+                case OUTPUT_PATTERN:
+                    obj = entry.getValue().getProperty(OUTPUT_PATTERN);
+                    break;
+                case SUBCLASS_TEMPLATE:
+                    obj = entry.getValue().getSubclassTemplate();
+                    break;
+                case SUPERCLASS_TEMPLATE:
+                    obj = entry.getValue().getSuperclassTemplate();
+                    break;
+                case OVERWRITE:
+                    obj = entry.getValue().getBooleanProperty(OVERWRITE);
+                    break;
+                case PAIRS:
+                    obj = entry.getValue().getBooleanProperty(PAIRS);
+                    break;
+                case USE_PACKAGE_PATH:
+                    obj = entry.getValue().getBooleanProperty(USE_PACKAGE_PATH);
+                    break;
+                case CREATE_PROPERTY_NAMES:
+                    obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Bad type property: " + property);
+            }
+
+        }
+        return obj;
+    }
+
+    private void updatePreferences(Property property, Object value) {
+        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
+        for (Entry<DataMap, DataMapDefaults> entry : entities) {
+
+            switch (property) {
+                case MODE:
+                    entry.getValue().setProperty(MODE, (String) value);
+                    break;
+                case OUTPUT_PATTERN:
+                    entry.getValue().setProperty(OUTPUT_PATTERN, (String) value);
+                    break;
+                case SUBCLASS_TEMPLATE:
+                    entry.getValue().setSubclassTemplate((String) value);
+                    break;
+                case SUPERCLASS_TEMPLATE:
+                    entry.getValue().setSuperclassTemplate((String) value);
+                    break;
+                case OVERWRITE:
+                    entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);
+                    break;
+                case PAIRS:
+                    entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);
+                    break;
+                case USE_PACKAGE_PATH:
+                    entry.getValue().setBooleanProperty(USE_PACKAGE_PATH, (Boolean) value);
+                    break;
+                case CREATE_PROPERTY_NAMES:
+                    entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Bad type property: " + property);
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..9370e3b
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java
@@ -0,0 +1,568 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.gen.ArtifactsGenerationMode;
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.*;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
+import org.apache.cayenne.modeler.pref.DataMapDefaults;
+import org.apache.cayenne.modeler.pref.FSPath;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.CodeValidationUtil;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.util.Util;
+import org.apache.cayenne.validation.BeanValidationFailure;
+import org.apache.cayenne.validation.SimpleValidationFailure;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+import javax.swing.*;
+import java.io.File;
+import java.util.*;
+import java.util.function.Predicate;
+import java.util.prefs.Preferences;
+
+/**
+ * A mode-specific part of the code generation dialog.
+ * 
+ */
+public abstract class GeneratorController extends CayenneController {
+
+    protected String mode = ArtifactsGenerationMode.ALL.getLabel();
+    protected Map<DataMap, DataMapDefaults> mapPreferences;
+    private String outputPath;
+
+    public GeneratorController(CodeGeneratorControllerBase parent) {
+        super(parent);
+    }
+
+    public void startup(DataMap dataMap){
+        createDefaults();
+        createView();
+//        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
+    }
+
+    public String getOutputPath() {
+        return outputPath;
+    }
+
+    public void setOutputPath(String path) {
+        String old = this.outputPath;
+        this.outputPath = path;
+        if (this.outputPath != null && !this.outputPath.equals(old)) {
+            updatePreferences(path);
+        }
+    }
+
+    public void updatePreferences(String path) {
+        if (mapPreferences == null)
+            return;
+        Set<DataMap> keys = mapPreferences.keySet();
+        for (DataMap key : keys) {
+            mapPreferences
+                    .get(key)
+                    .setOutputPath(path);
+        }
+    }
+
+    public void setMapPreferences(Map<DataMap, DataMapDefaults> mapPreferences) {
+        this.mapPreferences = mapPreferences;
+    }
+
+    public Map<DataMap, DataMapDefaults> getMapPreferences() {
+        return this.mapPreferences;
+    }
+
+    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
+     * {@link #createGenerator()} method.
+     */
+    protected abstract ClassGenerationAction newGenerator();
+
+    /**
+     * Creates a class generator for provided selections.
+     */
+    public Collection<ClassGenerationAction> createGenerator() {
+
+        File outputDir = getOutputDir();
+
+        // no destination folder
+        if (outputDir == null) {
+            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+            return null;
+        }
+
+        // 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.setDataMap(map);
+
+            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());
+
+            Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
+
+            if (preferences != null) {
+                generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, 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;
+                }
+            }
+
+                generators.add(generator);
+            } catch (CayenneRuntimeException exception) {
+                JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
+                return null;
+            }
+
+
+        return generators;
+    }
+
+    public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
+        ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
+        if (embeddableFailure != null) {
+            validationBuffer.addFailure(embeddableFailure);
+            return;
+        }
+
+        for (EmbeddableAttribute attribute : embeddable.getAttributes()) {
+            ValidationFailure failure = validateEmbeddableAttribute(attribute);
+            if (failure != null) {
+                validationBuffer.addFailure(failure);
+                return;
+            }
+        }
+    }
+
+    private ValidationFailure validateEmbeddableAttribute(EmbeddableAttribute attribute) {
+        String name = attribute.getEmbeddable().getClassName();
+
+        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+                attribute.getName());
+        if (emptyName != null) {
+            return emptyName;
+        }
+
+        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+                attribute.getName());
+        if (badName != null) {
+            return badName;
+        }
+
+        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+                attribute.getType());
+        if (emptyType != null) {
+            return emptyType;
+        }
+
+        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+                attribute.getType());
+        if (badType != null) {
+            return badType;
+        }
+
+        return null;
+    }
+
+    protected ValidationFailure validateEmbeddable(Embeddable embeddable) {
+
+        String name = embeddable.getClassName();
+
+        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className",
+                embeddable.getClassName());
+        if (emptyClass != null) {
+            return emptyClass;
+        }
+
+        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
+                embeddable.getClassName());
+        if (badClass != null) {
+            return badClass;
+        }
+
+        return null;
+    }
+
+    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity, boolean clientValidation) {
+
+        ValidationFailure entityFailure = validateEntity(clientValidation ? entity.getClientEntity() : entity);
+        if (entityFailure != null) {
+            validationBuffer.addFailure(entityFailure);
+            return;
+        }
+
+        for (ObjAttribute attribute : entity.getAttributes()) {
+            if (attribute instanceof EmbeddedAttribute) {
+                EmbeddedAttribute embeddedAttribute = (EmbeddedAttribute) attribute;
+                for (ObjAttribute subAttribute : embeddedAttribute.getAttributes()) {
+                    ValidationFailure failure = validateEmbeddedAttribute(subAttribute);
+                    if (failure != null) {
+                        validationBuffer.addFailure(failure);
+                        return;
+                    }
+                }
+            } else {
+
+                ValidationFailure failure = validateAttribute(attribute);
+                if (failure != null) {
+                    validationBuffer.addFailure(failure);
+                    return;
+                }
+            }
+        }
+
+        for (ObjRelationship rel : entity.getRelationships()) {
+            ValidationFailure failure = validateRelationship(rel, clientValidation);
+            if (failure != null) {
+                validationBuffer.addFailure(failure);
+                return;
+            }
+        }
+    }
+
+    protected ValidationFailure validateEntity(ObjEntity entity) {
+
+        String name = entity.getName();
+
+        if (entity.isGeneric()) {
+            return new SimpleValidationFailure(name, "Generic class");
+        }
+
+        ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name, "className", entity.getClassName());
+        if (emptyClass != null) {
+            return emptyClass;
+        }
+
+        ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name, "className",
+                entity.getClassName());
+        if (badClass != null) {
+            return badClass;
+        }
+
+        if (entity.getSuperClassName() != null) {
+            ValidationFailure badSuperClass = BeanValidationFailure.validateJavaClassName(name, "superClassName",
+                    entity.getSuperClassName());
+            if (badSuperClass != null) {
+                return badSuperClass;
+            }
+        }
+
+        return null;
+    }
+
+    protected ValidationFailure validateAttribute(ObjAttribute attribute) {
+
+        String name = attribute.getEntity().getName();
+
+        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+                attribute.getName());
+        if (emptyName != null) {
+            return emptyName;
+        }
+
+        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+                attribute.getName());
+        if (badName != null) {
+            return badName;
+        }
+
+        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+                attribute.getType());
+        if (emptyType != null) {
+            return emptyType;
+        }
+
+        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+                attribute.getType());
+        if (badType != null) {
+            return badType;
+        }
+
+        return null;
+    }
+
+    protected ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
+
+        String name = attribute.getEntity().getName();
+
+        // validate embeddedAttribute and attribute names
+        // embeddedAttribute returned attibute as
+        // [name_embeddedAttribute].[name_attribute]
+        String[] attributes = attribute.getName().split("\\.");
+        String nameEmbeddedAttribute = attributes[0];
+        int beginIndex = attributes[0].length();
+        String attr = attribute.getName().substring(beginIndex + 1);
+
+        ValidationFailure emptyEmbeddedName = BeanValidationFailure.validateNotEmpty(name, "attribute.name",
+                nameEmbeddedAttribute);
+        if (emptyEmbeddedName != null) {
+            return emptyEmbeddedName;
+        }
+
+        ValidationFailure badEmbeddedName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name",
+                nameEmbeddedAttribute);
+        if (badEmbeddedName != null) {
+            return badEmbeddedName;
+        }
+
+        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "attribute.name", attr);
+        if (emptyName != null) {
+            return emptyName;
+        }
+
+        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "attribute.name", attr);
+        if (badName != null) {
+            return badName;
+        }
+
+        ValidationFailure emptyType = BeanValidationFailure.validateNotEmpty(name, "attribute.type",
+                attribute.getType());
+        if (emptyType != null) {
+            return emptyType;
+        }
+
+        ValidationFailure badType = BeanValidationFailure.validateJavaClassName(name, "attribute.type",
+                attribute.getType());
+        if (badType != null) {
+            return badType;
+        }
+
+        return null;
+    }
+
+    protected ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
+
+        String name = relationship.getSourceEntity().getName();
+
+        ValidationFailure emptyName = BeanValidationFailure.validateNotEmpty(name, "relationship.name",
+                relationship.getName());
+        if (emptyName != null) {
+            return emptyName;
+        }
+
+        ValidationFailure badName = CodeValidationUtil.validateJavaIdentifier(name, "relationship.name",
+                relationship.getName());
+        if (badName != null) {
+            return badName;
+        }
+
+        if (!relationship.isToMany()) {
+
+            ObjEntity targetEntity = relationship.getTargetEntity();
+
+            if (clientValidation && targetEntity != null) {
+                targetEntity = targetEntity.getClientEntity();
+            }
+
+            if (targetEntity == null) {
+
+                return new BeanValidationFailure(name, "relationship.targetEntity", "No target entity");
+            } else if (!targetEntity.isGeneric()) {
+                ValidationFailure emptyClass = BeanValidationFailure.validateNotEmpty(name,
+                        "relationship.targetEntity.className", targetEntity.getClassName());
+                if (emptyClass != null) {
+                    return emptyClass;
+                }
+
+                ValidationFailure badClass = BeanValidationFailure.validateJavaClassName(name,
+                        "relationship.targetEntity.className", targetEntity.getClassName());
+                if (badClass != null) {
+                    return badClass;
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns a predicate for default entity selection in a given mode.
+     */
+    public Predicate getDefaultClassFilter() {
+        final ObjEntity selectedEntity = Application.getInstance().getFrameController().getProjectController()
+                .getCurrentObjEntity();
+
+        final Embeddable selectedEmbeddable = Application.getInstance().getFrameController().getProjectController()
+                .getCurrentEmbeddable();
+
+        if (selectedEntity != null) {
+            // select a single entity
+            final boolean hasProblem = getParentController().getProblem(selectedEntity.getName()) != null;
+            return object -> !hasProblem && object == selectedEntity;
+        } else if (selectedEmbeddable != null) {
+            // select a single embeddable
+            final boolean hasProblem = getParentController().getProblem(selectedEmbeddable.getClassName()) != null;
+            return object -> !hasProblem && object == selectedEmbeddable;
+        } else {
+            // select all entities
+            return object -> {
+                if (object instanceof ObjEntity) {
+                    return getParentController().getProblem(((ObjEntity) object).getName()) == null;
+                }
+
+                if (object instanceof Embeddable) {
+                    return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
+                }
+
+                return false;
+            };
+        }
+    }
+
+    public File getOutputDir() {
+        String dir = ((GeneratorControllerPanel) getView()).getOutputFolder().getText();
+        return dir != null ? new File(dir) : new File(System.getProperty("user.dir"));
+    }
+
+    /**
+     * An action method that pops up a file chooser dialog to pick the
+     * generation directory.
+     */
+    public void selectOutputFolderAction() {
+
+        JTextField outputFolder = ((GeneratorControllerPanel) getView()).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();
+            outputFolder.setText(path);
+            setOutputPath(path);
+        }
+    }
+
+    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);
+                }
+            }
+        }
+    }
+
+    private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
+        String path = lastPath.getPath();
+        String resourcePath = buildFilePath("src", dirType, "resources");
+        int idx = path.indexOf(resourcePath);
+        if (idx < 0) {
+            return null;
+        }
+        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
+    }
+
+    private static String buildFilePath(String... pathElements) {
+        if (pathElements.length == 0) {
+            return "";
+        }
+        StringBuilder path = new StringBuilder(pathElements[0]);
+        for (int i = 1; i < pathElements.length; i++) {
+            path.append(File.separator).append(pathElements[i]);
+        }
+        return path.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/8119ffaa/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
new file mode 100644
index 0000000..9b836bd
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java
@@ -0,0 +1,53 @@
+/*****************************************************************
+ *   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 javax.swing.*;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * A generic panel that is a superclass of generator panels, defining common fields.
+ * 
+ */
+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");
+    }
+
+    public JTextField getOutputFolder() {
+        return outputFolder;
+    }
+
+    public JButton getSelectOutputFolder() {
+        return selectOutputFolder;
+    }
+
+    public Collection<StandardPanelComponent> getDataMapLines() {
+        return dataMapLines;
+    }
+}


[13/32] cayenne git commit: Add cgen tab.

Posted by nt...@apache.org.
Add cgen tab.


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

Branch: refs/heads/master
Commit: 6a43436ab12017594762210c18dd508e2f2ded9d
Parents: aa22c93
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 31 10:51:32 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 31 10:51:32 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ArtifactsGenerationMode.java    |   2 +-
 .../cayenne/gen/ClassGenerationAction.java      | 499 ++++++++++---------
 .../gen/ClientClassGenerationAction.java        |   7 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      | 117 ++---
 .../cayenne/gen/xml/CgenSaverDelegate.java      |  23 +
 .../cayenne/gen/xml/EmbeddableHandler.java      |  70 ---
 .../cayenne/gen/xml/ObjEntityHandler.java       |  69 ---
 .../cayenne/project/CompoundSaverDelegate.java  |  28 +-
 .../cayenne/project/FileProjectSaver.java       |   2 +
 .../project/extension/BaseSaverDelegate.java    |  13 +
 .../project/extension/SaverDelegate.java        |   4 +
 .../main/java/org/apache/cayenne/util/Util.java |  33 +-
 .../cayenne/tools/CayenneGeneratorMojo.java     |   5 +-
 .../cayenne/modeler/CayenneModelerFrame.java    |  81 +--
 .../cayenne/modeler/action/CgenAction.java      |  27 -
 .../modeler/action/DefaultActionManager.java    |   5 +-
 .../dialog/codegen/ClassesTabController.java    |  13 +-
 .../modeler/dialog/codegen/ClassesTabPanel.java |  15 +-
 .../dialog/codegen/ClientModeController.java    |   2 +-
 .../dialog/codegen/CodeGeneratorController.java |   4 +-
 .../codegen/CodeGeneratorControllerBase.java    |  18 +-
 .../dialog/codegen/CodeGeneratorDialog.java     |  17 +-
 .../dialog/codegen/CustomModeController.java    |  19 +-
 .../modeler/dialog/codegen/CustomModePanel.java |   9 +-
 .../dialog/codegen/GeneratorController.java     |  26 +-
 .../codegen/GeneratorControllerPanel.java       |   4 +-
 .../dialog/codegen/GeneratorTabController.java  |   2 +-
 .../dialog/codegen/GeneratorTabPanel.java       |   2 +-
 .../dialog/codegen/StandardModeController.java  |   6 +-
 .../dialog/codegen/StandardModePanel.java       |   2 +-
 .../dialog/codegen/StandardPanelComponent.java  |   2 +-
 .../modeler/dialog/codegen/cgen/CgenDialog.java |  74 ---
 .../codegen/cgen/CgenGlobalController.java      |  68 ---
 .../dialog/codegen/cgen/CgenGlobalPanel.java    | 293 -----------
 .../codegen/cgen/CgenGlobalPanelController.java | 306 ------------
 .../modeler/editor/DataMapTabbedView.java       |  25 +-
 .../editor/cgen/ClassesTabController.java       |  13 +-
 .../modeler/editor/cgen/ClassesTabPanel.java    |  12 +-
 .../editor/cgen/ClientModeController.java       |  40 ++
 .../editor/cgen/CodeGeneratorController.java    |  48 +-
 .../cgen/CodeGeneratorControllerBase.java       | 112 +++--
 .../modeler/editor/cgen/CodeGeneratorPane.java  |  45 +-
 .../editor/cgen/CustomModeController.java       |  83 +--
 .../modeler/editor/cgen/CustomModePanel.java    | 137 +----
 .../editor/cgen/GeneratorController.java        | 157 +++---
 .../editor/cgen/GeneratorControllerPanel.java   |  30 +-
 .../editor/cgen/GeneratorTabController.java     |  64 ++-
 .../modeler/editor/cgen/GeneratorTabPanel.java  |  70 ++-
 .../editor/cgen/StandardModeController.java     |  61 +++
 .../modeler/editor/cgen/StandardModePanel.java  |  42 ++
 .../editor/cgen/StandardPanelComponent.java     |  63 +++
 51 files changed, 1027 insertions(+), 1842 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
index e76c172..98aca33 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ArtifactsGenerationMode.java
@@ -26,7 +26,7 @@ package org.apache.cayenne.gen;
 public enum ArtifactsGenerationMode {
 
     // TODO: andrus 12/9/2007 - label names are old... need to call it something else...
-    DATAMAP("datamap"), ENTITY("entity"), ALL("all");
+    ENTITY("entity"), ALL("all");
 
     private String label;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index f74ca21..434421f 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -33,16 +33,12 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.slf4j.Logger;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Serializable;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+import java.util.stream.Collectors;
 
 public class ClassGenerationAction implements Serializable, XMLSerializable {
 	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
@@ -62,10 +58,11 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	public static final String SUPERCLASS_PREFIX = "_";
 	private static final String WILDCARD = "*";
 
-	protected Collection<Artifact> artifacts;
-
+	Collection<Artifact> artifacts;
 	private Collection<String> entityArtifacts;
+	private Collection<String> excludeEntityArtifacts;
 	private Collection<String> embeddableArtifacts;
+	private Collection<String> excludeEmbeddableArtifacts;
 
 	protected String superPkg;
 	protected DataMap dataMap;
@@ -74,7 +71,10 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	protected boolean makePairs;
 
 	protected Logger logger;
-	protected File destDir;
+
+	protected Path rootPath;
+	protected Path relPath;
+
 	protected boolean overwrite;
 	protected boolean usePkgPath;
 
@@ -110,22 +110,20 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
         this.artifacts = new ArrayList<>();
         this.entityArtifacts = new ArrayList<>();
+        this.excludeEntityArtifacts = new ArrayList<>();
         this.embeddableArtifacts = new ArrayList<>();
+        this.excludeEmbeddableArtifacts = new ArrayList<>();
         this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
         this.overwrite = false;
-	}
-
-	public void setDefaults() {
-        this.template = SUBCLASS_TEMPLATE;
-        this.superTemplate = SUPERCLASS_TEMPLATE;
+		this.template = SUBCLASS_TEMPLATE;
+		this.superTemplate = SUPERCLASS_TEMPLATE;
+		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
+		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
 
-        this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
-        this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
-
-        this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
-        this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
-    }
+		this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
+		this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+	}
 
 	protected String defaultTemplateName(TemplateType type) {
 		switch (type) {
@@ -178,14 +176,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	/**
-	 * Returns a String used to prefix class name to create a generated
-	 * superclass. Default value is "_".
-	 */
-	private String getSuperclassPrefix() {
-		return ClassGenerationAction.SUPERCLASS_PREFIX;
-	}
-
-	/**
 	 * VelocityContext initialization method called once per artifact.
 	 */
 	private void resetContextForArtifact(Artifact artifact) {
@@ -232,7 +222,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public void prepareArtifacts() {
-        resetArtifacts();
+		this.artifacts.clear();
         addAllEntities();
         addAllEmbeddables();
         addQueries(dataMap.getQueryDescriptors());
@@ -317,84 +307,21 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * Called internally from "execute".
 	 */
 	private void validateAttributes() {
-		if (destDir == null) {
-			throw new CayenneRuntimeException("'destDir' attribute is missing.");
+		Path dir = buildPath();
+		if (dir == null) {
+			throw new CayenneRuntimeException("'rootPath' attribute is missing.");
 		}
 
-		if (!destDir.isDirectory()) {
+		if (!Files.isDirectory(dir)) {
 			throw new CayenneRuntimeException("'destDir' is not a directory.");
 		}
 
-		if (!destDir.canWrite()) {
-			throw new CayenneRuntimeException("Do not have write permissions for %s", destDir);
+		if (!Files.isWritable(dir)) {
+			throw new CayenneRuntimeException("Do not have write permissions for %s", dir);
 		}
 	}
 
 	/**
-	 * Sets the destDir.
-	 */
-	public void setDestDir(File destDir) {
-		this.destDir = destDir;
-	}
-
-	/**
-	 * Sets <code>overwrite</code> property.
-	 */
-	public void setOverwrite(boolean overwrite) {
-		this.overwrite = overwrite;
-	}
-
-	/**
-	 * Sets <code>makepairs</code> property.
-	 */
-	public void setMakePairs(boolean makePairs) {
-		this.makePairs = makePairs;
-	}
-
-	/**
-	 * Sets <code>template</code> property.
-	 */
-	public void setTemplate(String template) {
-		this.template = template;
-	}
-
-	/**
-	 * Sets <code>superTemplate</code> property.
-	 */
-	public void setSuperTemplate(String superTemplate) {
-		this.superTemplate = superTemplate;
-	}
-
-	public void setQueryTemplate(String queryTemplate) {
-		this.queryTemplate = queryTemplate;
-	}
-
-	public void setQuerySuperTemplate(String querySuperTemplate) {
-		this.querySuperTemplate = querySuperTemplate;
-	}
-
-	/**
-	 * Sets <code>usepkgpath</code> property.
-	 */
-	public void setUsePkgPath(boolean usePkgPath) {
-		this.usePkgPath = usePkgPath;
-	}
-
-	/**
-	 * Sets <code>outputPattern</code> property.
-	 */
-	public void setOutputPattern(String outputPattern) {
-		this.outputPattern = outputPattern;
-	}
-
-	/**
-	 * Sets <code>createPropertyNames</code> property.
-	 */
-	public void setCreatePropertyNames(boolean createPropertyNames) {
-		this.createPropertyNames = createPropertyNames;
-	}
-
-	/**
 	 * Opens a Writer to write generated output. Returned Writer is mapped to a
 	 * filesystem file (although subclasses may override that). File location is
 	 * determined from the current state of VelocityContext and the TemplateType
@@ -429,7 +356,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String className = (String) context.get(Artifact.SUPER_CLASS_KEY);
 
 		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(destDir, packageName), filename);
+		File dest = new File(mkpath(new File(getDir()), packageName), filename);
 
 		if (dest.exists() && !fileNeedUpdate(dest, superTemplate)) {
 			return null;
@@ -448,7 +375,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String className = (String) context.get(Artifact.SUB_CLASS_KEY);
 
 		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(destDir, packageName), filename);
+		File dest = new File(mkpath(new File(Objects.requireNonNull(buildPath()).toString()), packageName), filename);
 
 		if (dest.exists()) {
 			// no overwrite of subclasses
@@ -517,31 +444,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return fullPath;
 	}
 
-	public void setTimestamp(long timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	/**
-	 * Sets file encoding. If set to null, default system encoding will be used.
-	 */
-	public void setEncoding(String encoding) {
-		this.encoding = encoding;
-	}
-
-	/**
-	 * Sets "superPkg" property value.
-	 */
-	public void setSuperPkg(String superPkg) {
-		this.superPkg = superPkg;
-	}
-
-	/**
-	 * @param dataMap The dataMap to set.
-	 */
-	public void setDataMap(DataMap dataMap) {
-		this.dataMap = dataMap;
-	}
-
 	/**
 	 * Adds entities to the internal entity list.
 	 * @param entities collection
@@ -549,64 +451,50 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * @since 4.0 throws exception
 	 */
 	public void addEntities(Collection<ObjEntity> entities) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			if (entities != null) {
-				for (ObjEntity entity : entities) {
-					artifacts.add(new EntityArtifact(entity));
-				}
+		if (entities != null) {
+			for (ObjEntity entity : entities) {
+				artifacts.add(new EntityArtifact(entity));
 			}
 		}
 	}
 
 	public void addEmbeddables(Collection<Embeddable> embeddables) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			if (embeddables != null) {
-				for (Embeddable embeddable : embeddables) {
-					artifacts.add(new EmbeddableArtifact(embeddable));
-				}
+		if (embeddables != null) {
+			for (Embeddable embeddable : embeddables) {
+				artifacts.add(new EmbeddableArtifact(embeddable));
 			}
 		}
 	}
 
 	public void addQueries(Collection<QueryDescriptor> queries) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.DATAMAP
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-
+		if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
 			// TODO: andrus 10.12.2010 - why not also check for empty query list??
 			// Or create a better API for enabling DataMapArtifact
 			if (queries != null) {
 				Artifact artifact = new DataMapArtifact(dataMap, queries);
 				if(!artifacts.contains(artifact)) {
-					artifacts.add(new DataMapArtifact(dataMap, queries));
+					artifacts.add(artifact);
 				}
 			}
 		}
 	}
 
     private void addAllEntities() {
-		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-            entityArtifacts.forEach(val -> {
-            	Artifact artifact = new EntityArtifact(dataMap.getObjEntity(val));
-            	if(!artifacts.contains(artifact)) {
-					artifacts.add(artifact);
-				}
-			});
-		}
+		entityArtifacts.forEach(val -> {
+			Artifact artifact = new EntityArtifact(dataMap.getObjEntity(val));
+			if(!artifacts.contains(artifact)) {
+				artifacts.add(artifact);
+			}
+		});
 	}
 
     private void addAllEmbeddables() {
-		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
-				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-		    embeddableArtifacts.forEach(val -> {
-		    	Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
-				if(!artifacts.contains(artifact)) {
-		    		artifacts.add(artifact);
-		    	}
-			});
-		}
+		embeddableArtifacts.forEach(val -> {
+			Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
+			if(!artifacts.contains(artifact)) {
+				artifacts.add(artifact);
+			}
+		});
 	}
 
     /**
@@ -616,85 +504,91 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		entityArtifacts.add(name);
 	}
 
-    /**
-     * @since 4.1
-     */
+	/**
+	 * @since 4.1
+	 */
 	public void loadEmbeddable(String name) {
 		embeddableArtifacts.add(name);
 	}
 
-	/**
-	 * Sets an optional shared VelocityContext. Useful with tools like VPP that
-	 * can set custom values in the context, not known to Cayenne.
-	 */
-	public void setContext(VelocityContext context) {
-		this.context = context;
+	public void setArtifactsGenerationMode(String mode) {
+		if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
+			this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+		} else {
+			this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
+		}
 	}
 
-	/**
-	 * Injects an optional logger that will be used to trace generated files at
-	 * the info level.
-	 */
-	public void setLogger(Logger logger) {
-		this.logger = logger;
+	public Path buildPath() {
+		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : null;
 	}
 
-	public void setEmbeddableTemplate(String embeddableTemplate) {
-		this.embeddableTemplate = embeddableTemplate;
+	public void loadEntities(String entities) {
+		excludeEntityArtifacts.addAll(Arrays.asList(entities.split(",")));
 	}
 
-	public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
-		this.embeddableSuperTemplate = embeddableSuperTemplate;
+	public void resolveExcludeEntities() {
+		entityArtifacts = dataMap.getObjEntities()
+				.stream()
+				.filter(entity -> !excludeEntityArtifacts.contains(entity.getName()))
+				.map(ObjEntity::getName)
+				.collect(Collectors.toList());
 	}
 
-	public void setArtifactsGenerationMode(String mode) {
-		if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
-		} else if (ArtifactsGenerationMode.DATAMAP.getLabel().equalsIgnoreCase(mode)) {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.DATAMAP;
-		} else {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
-		}
+	public void loadEmbeddables(String embeddables) {
+		excludeEmbeddableArtifacts.addAll(Arrays.asList(embeddables.split(",")));
 	}
 
-    /**
-     * @since 4.1
-     */
-    public boolean isCreatePKProperties() {
-        return createPKProperties;
-    }
+	public void resolveExcludeEmbeddables() {
+    	embeddableArtifacts = dataMap.getEmbeddables()
+				.stream()
+				.filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName()))
+				.map(Embeddable::getClassName)
+				.collect(Collectors.toList());
+	}
 
-    /**
-     * @since 4.1
-     */
-    public void setCreatePKProperties(boolean createPKProperties) {
-        this.createPKProperties = createPKProperties;
-    }
+    public void resetCollections(){
+		this.embeddableArtifacts.clear();
+		this.entityArtifacts.clear();
+	}
 
-    private Collection<EntityArtifact> getEntityArtifacts() {
-		resetArtifacts();
-		addAllEntities();
-		Collection<EntityArtifact> entityArtifacts = new ArrayList<>();
-		for(Artifact artifact : artifacts){
-			if(artifact instanceof EntityArtifact){
-				entityArtifacts.add((EntityArtifact) artifact);
-			}
-		}
-		return entityArtifacts;
+	private String getExcludeEntites() {
+		Collection<String> excludeEntities = dataMap.getObjEntities()
+				.stream()
+				.filter(entity -> !entityArtifacts.contains(entity.getName()))
+				.map(ObjEntity::getName)
+				.collect(Collectors.toList());
+		return org.apache.commons.lang3.StringUtils.join(excludeEntities, ",");
 	}
 
-    private Collection<EmbeddableArtifact> getEmbeddableArtifacts() {
-		resetArtifacts();
-		addAllEmbeddables();
-		Collection<EmbeddableArtifact> embeddableArtifacts = new ArrayList<>();
-		for(Artifact artifact : artifacts){
-			if(artifact instanceof EmbeddableArtifact){
-				embeddableArtifacts.add((EmbeddableArtifact) artifact);
-			}
-		}
+	private String getExcludeEmbeddables() {
+		Collection<String> excludeEmbeddable = dataMap.getEmbeddables()
+				.stream()
+				.filter(embeddable -> !embeddableArtifacts.contains(embeddable.getClassName()))
+				.map(Embeddable::getClassName)
+				.collect(Collectors.toList());
+		return org.apache.commons.lang3.StringUtils.join(excludeEmbeddable, ",");
+	}
+
+	/**
+	 * Returns a String used to prefix class name to create a generated
+	 * superclass. Default value is "_".
+	 */
+	private String getSuperclassPrefix() {
+		return ClassGenerationAction.SUPERCLASS_PREFIX;
+	}
+
+	public Collection<String> getEmbeddables() {
 		return embeddableArtifacts;
 	}
 
+	/**
+	 * @since 4.1
+	 */
+	public boolean isCreatePKProperties() {
+		return createPKProperties;
+	}
+
 	public boolean isMakePairs() {
 		return makePairs;
 	}
@@ -724,11 +618,9 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public String getDir(){
-		return destDir != null ? destDir.getAbsolutePath() : null;
+		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize().toString() : rootPath.toString() : null;
 	}
 
-	public File getDestDir() { return destDir; }
-
 	public String getTemplate() {
 		return template;
 	}
@@ -737,16 +629,15 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return superPkg;
 	}
 
-	private void resetArtifacts(){
-		this.artifacts = new ArrayList<>();
-	}
-
 	public Collection<String> getEntities() {
 		return entityArtifacts;
 	}
 
-	public Collection<String> getEmbeddables() {
-		return embeddableArtifacts;
+	public String getRelPath() {
+    	if(relPath == null || relPath.toString().isEmpty()) {
+    		return ".";
+		}
+		return relPath.toString();
 	}
 
 	public String getArtifactsGenerationMode(){
@@ -774,39 +665,155 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	public String getQueryTemplate() {
-	    return queryTemplate;
-    }
+		return queryTemplate;
+	}
 
-    public String getQuerySuperTemplate() {
-        return querySuperTemplate;
-    }
+	public String getQuerySuperTemplate() {
+		return querySuperTemplate;
+	}
 
-    public void resetCollections(){
-		this.embeddableArtifacts = new ArrayList<>();
-		this.entityArtifacts = new ArrayList<>();
+	/**
+	 * Sets an optional shared nVelocityContext. Useful with tools like VPP that
+	 * can set custom values in the context, not known to Cayenne.
+	 */
+	public void setContext(VelocityContext context) {
+		this.context = context;
+	}
+
+	/**
+	 * Injects an optional logger that will be used to trace generated files at
+	 * the info level.
+	 */
+	public void setLogger(Logger logger) {
+		this.logger = logger;
+	}
+
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	/**
+	 * Sets file encoding. If set to null, default system encoding will be used.
+	 */
+	public void setEncoding(String encoding) {
+		this.encoding = encoding;
+	}
+
+	/**
+	 * Sets "superPkg" property value.
+	 */
+	public void setSuperPkg(String superPkg) {
+		this.superPkg = superPkg;
+	}
+
+	/**
+	 * @param dataMap The dataMap to set.
+	 */
+	public void setDataMap(DataMap dataMap) {
+		this.dataMap = dataMap;
+	}
+
+	public void setEmbeddableTemplate(String embeddableTemplate) {
+		this.embeddableTemplate = embeddableTemplate;
+	}
+
+	public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
+		this.embeddableSuperTemplate = embeddableSuperTemplate;
+	}
+
+	/**
+	 * Sets <code>overwrite</code> property.
+	 */
+	public void setOverwrite(boolean overwrite) {
+		this.overwrite = overwrite;
+	}
+
+	/**
+	 * Sets <code>makepairs</code> property.
+	 */
+	public void setMakePairs(boolean makePairs) {
+		this.makePairs = makePairs;
+	}
+
+	/**
+	 * Sets <code>template</code> property.
+	 */
+	public void setTemplate(String template) {
+		this.template = template;
+	}
+
+	/**
+	 * Sets <code>superTemplate</code> property.
+	 */
+	public void setSuperTemplate(String superTemplate) {
+		this.superTemplate = superTemplate;
+	}
+
+	public void setQueryTemplate(String queryTemplate) {
+		this.queryTemplate = queryTemplate;
+	}
+
+	public void setQuerySuperTemplate(String querySuperTemplate) {
+		this.querySuperTemplate = querySuperTemplate;
+	}
+
+	/**
+	 * Sets <code>usepkgpath</code> property.
+	 */
+	public void setUsePkgPath(boolean usePkgPath) {
+		this.usePkgPath = usePkgPath;
+	}
+
+	/**
+	 * Sets <code>outputPattern</code> property.
+	 */
+	public void setOutputPattern(String outputPattern) {
+		this.outputPattern = outputPattern;
+	}
+
+	/**
+	 * Sets <code>createPropertyNames</code> property.
+	 */
+	public void setCreatePropertyNames(boolean createPropertyNames) {
+		this.createPropertyNames = createPropertyNames;
+	}
+
+	/**
+	 * @since 4.1
+	 */
+	public void setCreatePKProperties(boolean createPKProperties) {
+		this.createPKProperties = createPKProperties;
+	}
+
+	public void setRootPath(Path rootPath) {
+		this.rootPath = rootPath;
+	}
+
+	public void setRelPath(Path relPath) {
+		this.relPath = relPath;
+	}
+
+	public void setRelPath(String path) {
+		this.relPath = rootPath.relativize(Paths.get(path));
 	}
 
 	@Override
 	public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
 		encoder.start("cgen")
 				.attribute("xmlns", CgenExtension.NAMESPACE)
-				.nested(this.getEntityArtifacts(), delegate)
-				.nested(this.getEmbeddableArtifacts(), delegate)
-				.simpleTag("outputDirectory", this.destDir != null ? this.destDir.getAbsolutePath() : null)
+				.simpleTag("excludeEntities", getExcludeEntites())
+				.simpleTag("excludeEmbeddables",getExcludeEmbeddables())
+				.simpleTag("outputDirectory", getRelPath())
 				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
-                .simpleTag("dataMapTemplate", this.queryTemplate)
-                .simpleTag("dataMapSuperclassTemplate", this.querySuperTemplate)
 				.simpleTag("subclassTemplate", this.template)
 				.simpleTag("superclassTemplate", this.superTemplate)
-				.simpleTag("embeddableTemplate", this.embeddableTemplate)
-				.simpleTag("embeddableSuperclassTemplate", this.embeddableSuperTemplate)
 				.simpleTag("outputPattern", this.outputPattern)
 				.simpleTag("makePairs", Boolean.toString(this.makePairs))
 				.simpleTag("usePkgPath", Boolean.toString(this.usePkgPath))
 				.simpleTag("overwriteSubclasses", Boolean.toString(this.overwrite))
 				.simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames))
 				.simpleTag("superPkg", this.superPkg)
-				.simpleTag("encoding", this.encoding)
+				.simpleTag("createPKProperties", Boolean.toString(this.createPKProperties))
 				.end();
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
index c944f40..c8880aa 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
@@ -19,12 +19,12 @@
 
 package org.apache.cayenne.gen;
 
-import java.util.Collection;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 
+import java.util.Collection;
+
 /**
  * @since 3.0
  */
@@ -88,8 +88,7 @@ public class ClientClassGenerationAction extends ClassGenerationAction {
 
     @Override
     public void addQueries(Collection<QueryDescriptor> queries) {
-        if (artifactsGenerationMode == ArtifactsGenerationMode.DATAMAP
-                || artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
+        if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
             if (queries != null) {
                 artifacts.add(new ClientDataMapArtifact(dataMap, queries));
             }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
index f77f1f1..7883ca2 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java
@@ -22,10 +22,9 @@ import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
-import java.io.File;
+import java.nio.file.Paths;
 
 /**
  * @since 4.1
@@ -43,14 +42,9 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String USE_PKG_PATH_TAG = "usePkgPath";
     private static final String OVERWRITE_SUBCLASSES_TAG = "overwriteSubclasses";
     private static final String CREATE_PROPERTY_NAMES_TAG = "createPropertyNames";
-    private static final String SUPER_PKG_TAG = "superPkg";
-    private static final String OBJENTITY_TAG = "objEntity";
-    private static final String EMBEDDABLE_TAG = "embeddable";
-    private static final String ENCODING_TAG = "encoding";
-    private static final String EMBEDDABLE_TEMPLATE_TAG = "embeddableTemplate";
-    private static final String EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG = "embeddableSuperclassTemplate";
-    private static final String DATAMAP_TEMPLATE_TAG = "dataMapTemplate";
-    private static final String DATAMAP_SUPERCLASS_TEMPLATE_TAG = "dataMapSuperclassTemplate";
+    private static final String EXCLUDE_ENTITIES_TAG = "excludeEntities";
+    private static final String EXCLUDE_EMBEDDABLES_TAG = "excludeEmbeddables";
+    private static final String CREATE_PK_PROPERTIES = "createPKProperties";
 
     public static final String TRUE = "true";
 
@@ -74,22 +68,6 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     }
 
     @Override
-    protected ContentHandler createChildTagHandler(String namespaceURI, String localName,
-                                                   String qName, Attributes attributes) {
-
-        if (namespaceURI.equals(targetNamespace)) {
-            switch (localName) {
-                case OBJENTITY_TAG:
-                    return new ObjEntityHandler(this, configuration);
-                case EMBEDDABLE_TAG:
-                    return new EmbeddableHandler(this, configuration);
-            }
-        }
-
-        return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
-    }
-
-    @Override
     protected void processCharData(String localName, String data) {
         switch (localName) {
             case OUTPUT_DIRECTORY_TAG:
@@ -98,6 +76,12 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case GENERATION_MODE_TAG:
                 createGenerationMode(data);
                 break;
+            case EXCLUDE_ENTITIES_TAG:
+                createExcludeEntities(data);
+                break;
+            case EXCLUDE_EMBEDDABLES_TAG:
+                createExcludeEmbeddables(data);
+                break;
             case SUBCLASS_TEMPLATE_TAG:
                 createSubclassTemplate(data);
                 break;
@@ -119,23 +103,8 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case CREATE_PROPERTY_NAMES_TAG:
                 createPropertyNamesTag(data);
                 break;
-            case SUPER_PKG_TAG:
-                createSuperPkg(data);
-                break;
-            case ENCODING_TAG:
-                createEncoding(data);
-                break;
-            case EMBEDDABLE_TEMPLATE_TAG:
-                createEmbeddableTemplate(data);
-                break;
-            case EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG:
-                createEmbeddableSuperclassTemplate(data);
-                break;
-            case DATAMAP_TEMPLATE_TAG:
-                createDataMapTemplate(data);
-                break;
-            case DATAMAP_SUPERCLASS_TEMPLATE_TAG:
-                createDataMapSuperclassTemplate(data);
+            case CREATE_PK_PROPERTIES:
+                createPkPropertiesTag(data);
                 break;
         }
     }
@@ -146,7 +115,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
 
         if(configuration != null) {
-            configuration.setDestDir(new File(path));
+            configuration.setRelPath(Paths.get(path));
         }
     }
 
@@ -160,43 +129,43 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    private void createSubclassTemplate(String template) {
-        if(template.trim().length() == 0) {
+    private void createExcludeEntities(String entities) {
+        if(entities.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setTemplate(template);
+            configuration.loadEntities(entities);
         }
     }
 
-    private void createSuperclassTemplate(String template) {
-        if(template.trim().length() == 0) {
+    private void createExcludeEmbeddables(String embeddables) {
+        if(embeddables.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setSuperTemplate(template);
+            configuration.loadEmbeddables(embeddables);
         }
     }
 
-    private void createEmbeddableTemplate(String template) {
+    private void createSubclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEmbeddableTemplate(template);
+            configuration.setTemplate(template);
         }
     }
 
-    private void createEmbeddableSuperclassTemplate(String template) {
+    private void createSuperclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEmbeddableSuperTemplate(template);
+            configuration.setSuperTemplate(template);
         }
     }
 
@@ -266,43 +235,17 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    private void createSuperPkg(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setSuperPkg(data);
-        }
-    }
-
-    private void createEncoding(String data) {
+    private void createPkPropertiesTag(String data) {
         if(data.trim().length() == 0) {
             return;
         }
 
         if(configuration != null) {
-            configuration.setEncoding(data);
-        }
-    }
-
-    private void createDataMapTemplate(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setQueryTemplate(data);
-        }
-    }
-
-    private void createDataMapSuperclassTemplate(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.setQuerySuperTemplate(data);
+            if(data.equals(TRUE)) {
+                configuration.setCreatePKProperties(true);
+            } else {
+                configuration.setCreatePKProperties(false);
+            }
         }
     }
 
@@ -310,6 +253,8 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         configuration = new ClassGenerationAction();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
+            configuration.resolveExcludeEntities();
+            configuration.resolveExcludeEmbeddables();
             CgenConfigHandler.this.metaData.add(dataMap, configuration);
         });
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
index 8d25cf1..fc23e50 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java
@@ -23,6 +23,11 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.project.extension.BaseSaverDelegate;
 
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
 /**
  * @since 4.1
  */
@@ -38,8 +43,26 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
     public Void visitDataMap(DataMap dataMap) {
         ClassGenerationAction cgen = metaData.get(dataMap, ClassGenerationAction.class);
         if(cgen != null){
+            resolveOutputDir(cgen);
             encoder.nested(cgen, getParentDelegate());
         }
         return null;
     }
+
+    private void resolveOutputDir(ClassGenerationAction classGenerationAction) {
+        Path prevPath = classGenerationAction.buildPath();
+        URL url = getBaseDirectory().getURL();
+        if(url != null) {
+            Path resourcePath = Paths.get(url.getPath());
+            if(Files.isRegularFile(resourcePath)) {
+                resourcePath = resourcePath.getParent();
+            }
+
+            if(prevPath != null && resourcePath.compareTo(prevPath) != 0) {
+                classGenerationAction.setRootPath(resourcePath);
+                Path relPath = resourcePath.relativize(prevPath);
+                classGenerationAction.setRelPath(relPath);
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
deleted file mode 100644
index 4772348..0000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.gen.xml;
-
-import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @since 4.1
- */
-public class EmbeddableHandler extends NamespaceAwareNestedTagHandler {
-
-    private static final String EMBEDDABLE_TAG = "embeddable";
-    private static final String EMBEDDABLE_NAME_TAG = "name";
-
-    private ClassGenerationAction configuration;
-
-    EmbeddableHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) {
-        super(parentHandler);
-        this.configuration = configuration;
-    }
-
-    @Override
-    protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
-        switch (localName) {
-            case EMBEDDABLE_TAG:
-                return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void processCharData(String localName, String data) {
-        switch (localName) {
-            case EMBEDDABLE_NAME_TAG:
-                createEmbeddableEntity(data);
-                break;
-        }
-    }
-
-    private void createEmbeddableEntity(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.loadEmbeddable(data);
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
deleted file mode 100644
index 593a002..0000000
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.gen.xml;
-
-import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * @since 4.1
- */
-public class ObjEntityHandler extends NamespaceAwareNestedTagHandler {
-
-    private static final String OBJENTITY_TAG = "objEntity";
-    private static final String OBJENTITY_NAME_TAG = "name";
-
-    private ClassGenerationAction configuration;
-
-    ObjEntityHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) {
-        super(parentHandler);
-        this.configuration = configuration;
-    }
-
-    @Override
-    protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException {
-        switch (localName) {
-            case OBJENTITY_TAG:
-                return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    protected void processCharData(String localName, String data) {
-        switch (localName) {
-            case OBJENTITY_NAME_TAG:
-                createObjEntity(data);
-                break;
-        }
-    }
-
-    private void createObjEntity(String data) {
-        if(data.trim().length() == 0) {
-            return;
-        }
-
-        if(configuration != null) {
-            configuration.loadEntity(data);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
index 5ea7a29..4745e38 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
@@ -19,25 +19,15 @@
 
 package org.apache.cayenne.project;
 
-import java.util.Collection;
-
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.map.*;
 import org.apache.cayenne.project.extension.SaverDelegate;
+import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
+import java.util.Collection;
+
 /**
  * @since 4.1
  */
@@ -180,4 +170,14 @@ class CompoundSaverDelegate implements SaverDelegate {
     public SaverDelegate getParentDelegate() {
         return null;
     }
+
+    @Override
+    public Resource getBaseDirectory() {
+        return null;
+    }
+
+    @Override
+    public void setBaseDirectory(Resource baseDirectory) {
+        delegates.forEach(d -> d.setBaseDirectory(baseDirectory));
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index 0d6af44..20e2328 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@ -97,6 +97,8 @@ public class FileProjectSaver implements ProjectSaver {
 		Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
 		Collection<SaveUnit> units = new ArrayList<>(nodes.size());
 
+		delegate.setBaseDirectory(baseResource);
+
 		for(ConfigurationNode node : nodes) {
 			String targetLocation = nameMapper.configurationLocation(node);
 			Resource targetResource = baseResource.getRelativeResource(targetLocation);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
index a9f45f2..adb5d94 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
@@ -33,6 +33,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -46,6 +47,8 @@ public class BaseSaverDelegate implements SaverDelegate {
 
     protected SaverDelegate parentDelegate;
 
+    protected Resource baseDirectory;
+
     @Override
     public Void visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) {
         return null;
@@ -131,6 +134,16 @@ public class BaseSaverDelegate implements SaverDelegate {
         return parentDelegate;
     }
 
+    @Override
+    public Resource getBaseDirectory() {
+        return baseDirectory;
+    }
+
+    @Override
+    public void setBaseDirectory(Resource baseDirectory) {
+        this.baseDirectory = baseDirectory;
+    }
+
     protected boolean isStandalone() {
         return parentDelegate == null;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
index 4ed5c92..1a002fd 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/SaverDelegate.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.project.extension;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -42,4 +43,7 @@ public interface SaverDelegate extends ConfigurationNodeVisitor<Void> {
 
     SaverDelegate getParentDelegate();
 
+    Resource getBaseDirectory();
+
+    void setBaseDirectory(Resource baseDirectory);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
index 08941b8..de280b4 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
@@ -26,45 +26,20 @@ import org.apache.cayenne.Persistent;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.reflect.ArcProperty;
-import org.apache.cayenne.reflect.AttributeProperty;
-import org.apache.cayenne.reflect.PropertyVisitor;
-import org.apache.cayenne.reflect.ToManyProperty;
-import org.apache.cayenne.reflect.ToOneProperty;
+import org.apache.cayenne.reflect.*;
 import org.w3c.dom.Document;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-import java.io.BufferedReader;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
+import javax.xml.parsers.*;
+import java.io.*;
 import java.lang.reflect.Member;
 import java.lang.reflect.Modifier;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.*;
 import java.util.regex.Pattern;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 3bdf08b..1ab9f96 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -207,7 +207,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
      * @since 4.1
      */
     @Parameter(defaultValue = "false")
-    private boolean createPKProperties;
+    private Boolean createPKProperties;
 
     private transient Injector injector;
 
@@ -295,7 +295,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 		injector.injectMembers(action);
 
-		action.setDestDir(destDir);
+//		action.setDestDir(destDir.toPath());
 		action.setEncoding(encoding != null ? encoding : action.getEncoding());
 		action.setMakePairs(makePairs != null ? makePairs : action.isMakePairs());
 		action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
@@ -310,6 +310,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		action.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : action.isCreatePropertyNames());
 		action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
 		action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
+		action.setCreatePKProperties(createPKProperties != null ? createPKProperties : action.isCreatePropertyNames());
 		return action;
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
index 97772de..1af72ba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -19,64 +19,12 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.modeler.action.AboutAction;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CgenAction;
-import org.apache.cayenne.modeler.action.ConfigurePreferencesAction;
-import org.apache.cayenne.modeler.action.CopyAction;
-import org.apache.cayenne.modeler.action.CreateDataMapAction;
-import org.apache.cayenne.modeler.action.CreateDbEntityAction;
-import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
-import org.apache.cayenne.modeler.action.CreateNodeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityAction;
-import org.apache.cayenne.modeler.action.CreateProcedureAction;
-import org.apache.cayenne.modeler.action.CreateQueryAction;
-import org.apache.cayenne.modeler.action.CutAction;
-import org.apache.cayenne.modeler.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.action.DocumentationAction;
-import org.apache.cayenne.modeler.action.ExitAction;
-import org.apache.cayenne.modeler.action.FindAction;
-import org.apache.cayenne.modeler.action.GenerateCodeAction;
-import org.apache.cayenne.modeler.action.GenerateDBAction;
-import org.apache.cayenne.modeler.action.ImportDataMapAction;
-import org.apache.cayenne.modeler.action.ImportEOModelAction;
-import org.apache.cayenne.modeler.action.InferRelationshipsAction;
-import org.apache.cayenne.modeler.action.MigrateAction;
-import org.apache.cayenne.modeler.action.NavigateBackwardAction;
-import org.apache.cayenne.modeler.action.NavigateForwardAction;
-import org.apache.cayenne.modeler.action.NewProjectAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.ProjectAction;
-import org.apache.cayenne.modeler.action.RedoAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
-import org.apache.cayenne.modeler.action.RevertAction;
-import org.apache.cayenne.modeler.action.SaveAction;
-import org.apache.cayenne.modeler.action.SaveAsAction;
-import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
-import org.apache.cayenne.modeler.action.UndoAction;
-import org.apache.cayenne.modeler.action.ValidateAction;
+import org.apache.cayenne.modeler.action.*;
 import org.apache.cayenne.modeler.action.dbimport.ReverseEngineeringToolMenuAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
-import org.apache.cayenne.modeler.event.DataMapDisplayListener;
-import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
-import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
-import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
-import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
-import org.apache.cayenne.modeler.event.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
-import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
-import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
-import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
-import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
-import org.apache.cayenne.modeler.event.QueryDisplayEvent;
-import org.apache.cayenne.modeler.event.QueryDisplayListener;
-import org.apache.cayenne.modeler.event.RecentFileListListener;
+import org.apache.cayenne.modeler.event.*;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -84,28 +32,8 @@ import org.apache.cayenne.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JPanel;
-import javax.swing.JSplitPane;
-import javax.swing.JTextField;
-import javax.swing.JToolBar;
-import java.awt.AWTEvent;
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.Toolkit;
+import javax.swing.*;
+import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;
@@ -236,7 +164,6 @@ public class CayenneModelerFrame extends JFrame implements DataNodeDisplayListen
         toolMenu.add(getAction(InferRelationshipsAction.class).buildMenu());
         toolMenu.add(getAction(ImportEOModelAction.class).buildMenu());
         toolMenu.addSeparator();
-        toolMenu.add(getAction(CgenAction.class).buildMenu());
         toolMenu.add(getAction(GenerateCodeAction.class).buildMenu());
         toolMenu.add(getAction(GenerateDBAction.class).buildMenu());
         toolMenu.add(getAction(MigrateAction.class).buildMenu());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
deleted file mode 100644
index 9dbd71d..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CgenAction.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.apache.cayenne.modeler.action;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.codegen.cgen.CgenGlobalController;
-import org.apache.cayenne.modeler.util.CayenneAction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.awt.event.ActionEvent;
-
-public class CgenAction extends CayenneAction{
-
-    private static Logger logObj = LoggerFactory.getLogger(CgenAction.class);
-
-    public CgenAction(Application application) {
-        super(getActionName(), application);
-    }
-
-    public static String getActionName(){
-        return "Generate All Classes";
-    }
-
-    @Override
-    public void performAction(ActionEvent e) {
-        new CgenGlobalController(getApplication().getFrameController()).startup();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
index d2ad35f..c476fff 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
@@ -167,8 +167,6 @@ public class DefaultActionManager implements ActionManager {
 
         registerAction(new LinkDataMapAction(application));
         registerAction(new LinkDataMapsAction(application));
-
-        registerAction(new CgenAction((application)));
     }
 
     private void initActions() {
@@ -197,8 +195,7 @@ public class DefaultActionManager implements ActionManager {
                 GenerateCodeAction.class.getName(),
                 GenerateDBAction.class.getName(),
                 PasteAction.class.getName(),
-                ReverseEngineeringToolMenuAction.class.getName(),
-                CgenAction.class.getName()));
+                ReverseEngineeringToolMenuAction.class.getName()));
 
         DATA_NODE_ACTIONS = new HashSet<>(DOMAIN_ACTIONS);
         DATA_NODE_ACTIONS.addAll(Arrays.asList(

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
index 3e61094..b9d1c5b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
@@ -26,13 +26,6 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JTable;
@@ -95,7 +88,7 @@ public class ClassesTabController extends CayenneController {
         builder.bindToAction(view.getCheckAll(), "checkAllAction()");
 
         TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-        
+
         tableBuilder.addColumn(
                 "",
                 "parent.setCurrentClass(#item), selected",
@@ -104,7 +97,7 @@ public class ClassesTabController extends CayenneController {
                 Boolean.TRUE);
 
         tableBuilder.addColumn(
-                "Entity",
+                "Class",
                 "parent.getItemName(#item)",
                 JLabel.class,
                 false,
@@ -207,4 +200,4 @@ public class ClassesTabController extends CayenneController {
         }
         return true;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
index 3c6e53d..b1d3bd9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
@@ -22,12 +22,13 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.map.DataMap;
 
 import javax.swing.BoxLayout;
-import javax.swing.*;
-import javax.swing.border.EmptyBorder;
-import java.awt.*;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.UIManager;
 import javax.swing.border.EmptyBorder;
 import java.awt.BorderLayout;
 import java.awt.Component;
@@ -137,4 +138,4 @@ public class ClassesTabPanel extends JPanel {
     public JCheckBox getCheckAll() {
         return checkAll;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
index 4d5335f..9e3897e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
@@ -78,4 +78,4 @@ public class ClientModeController extends StandardModeController {
     protected ClassGenerationAction newGenerator() {
         return new ClientClassGenerationAction();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
index f4395e9..55817a6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
@@ -113,7 +113,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         }
 
         label = label.concat("; ");
-        
+
         int sizeEmb = getSelectedEmbeddablesSize();
 
         if (sizeEmb == 0) {
@@ -166,4 +166,4 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
 
         view.dispose();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
index 6e6084c..91d87e4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
@@ -27,10 +27,14 @@ import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.function.Predicate;
 
 /**
@@ -212,7 +216,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         for (Object classObj : classes) {
             if (classObj instanceof Embeddable
                     && selectedEmbeddables.contains(((Embeddable) classObj)
-                            .getClassName())) {
+                    .getClassName())) {
                 selected.add((Embeddable) classObj);
             }
         }
@@ -262,14 +266,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     public String getProblem(Object obj) {
 
         String name = null;
-        
+
         if (obj instanceof ObjEntity) {
             name = ((ObjEntity) obj).getName();
         }
         else if (obj instanceof Embeddable) {
             name = ((Embeddable) obj).getClassName();
         }
-        
+
         if (validation == null) {
             return null;
         }
@@ -373,4 +377,4 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return labelIcon;
     }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
index c6d6e69..2bb635f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
@@ -22,8 +22,19 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.ScrollPaneConstants;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
 
 /**
  */
@@ -85,4 +96,4 @@ public class CodeGeneratorDialog extends JDialog {
     public JLabel getClassesCount() {
         return classesCount;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
index 4f48854..bb87006 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
@@ -28,13 +28,22 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.util.Util;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.*;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import java.awt.Component;
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeMap;
 
-import static org.apache.cayenne.modeler.CodeTemplateManager.*;
+import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
+import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
+import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
 import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
 
 /**
@@ -223,4 +232,4 @@ public class CustomModeController extends GeneratorController {
 		getApplication().getInjector().injectMembers(action);
 		return action;
 	}
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
index 73f89f7..406e1d2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
@@ -29,8 +29,6 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
-import javax.swing.*;
-import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
@@ -58,11 +56,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
-        pairs.addChangeListener(e -> {
-            superclassTemplate.setEnabled(pairs.isSelected());
-            overwrite.setEnabled(!pairs.isSelected());
-        });
-
         // assemble
         FormLayout layout = new FormLayout(
                 "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
@@ -141,4 +134,4 @@ public class CustomModePanel extends GeneratorControllerPanel {
     public JCheckBox getCreatePKProperties() {
         return createPKProperties;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
index c695684..db8c872 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
@@ -22,7 +22,13 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.EmbeddedAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
@@ -36,15 +42,22 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.*;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.JTextField;
 import java.io.File;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 
 /**
  * A mode-specific part of the code generation dialog.
- * 
+ *
  */
 public abstract class GeneratorController extends CayenneController {
 
@@ -149,7 +162,6 @@ public abstract class GeneratorController extends CayenneController {
         selectedEntities.removeIf(ObjEntity::isGeneric);
 
         Collection<ClassGenerationAction> generators = new ArrayList<>();
-        Collection<StandardPanelComponent> dataMapLines = ((GeneratorControllerPanel) getView()).getDataMapLines();
         for (DataMap map : getParentController().getDataMaps()) {
             try {
                 ClassGenerationAction generator = newGenerator();
@@ -180,7 +192,7 @@ public abstract class GeneratorController extends CayenneController {
 
                 }
 
-                generator.setDestDir(outputDir);
+//                generator.setDestDir(outputDir);
                 generator.setMakePairs(true);
                 generator.setForce(true);
 
@@ -547,4 +559,4 @@ public abstract class GeneratorController extends CayenneController {
         }
         return path.toString();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
index bb02345..49cbc4b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorControllerPanel.java
@@ -27,7 +27,7 @@ import java.util.Collection;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
- * 
+ *
  */
 public class GeneratorControllerPanel extends JPanel {
 
@@ -52,4 +52,4 @@ public class GeneratorControllerPanel extends JPanel {
     public Collection<StandardPanelComponent> getDataMapLines() {
         return dataMapLines;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
index 4e681ae..5d7594f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.pref.PreferenceDetail;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
 
-import java.awt.*;
+import java.awt.Component;
 import java.awt.Dimension;
 import java.util.Collection;
 import java.util.HashMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
index 130741d..854e2d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabPanel.java
@@ -62,4 +62,4 @@ public class GeneratorTabPanel extends JPanel {
     public JComboBox getGenerationMode() {
         return generationMode;
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
index f11ade8..b0650d8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import java.awt.*;
+import java.awt.Component;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.TreeMap;
@@ -38,7 +38,7 @@ public class StandardModeController extends GeneratorController {
     }
 
     protected void createDefaults() {
-        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<DataMap, DataMapDefaults>();
+        TreeMap<DataMap, DataMapDefaults> treeMap = new TreeMap<>();
         ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
 
         for (DataMap dataMap : dataMaps) {
@@ -79,4 +79,4 @@ public class StandardModeController extends GeneratorController {
     public Collection<ClassGenerationAction> createGenerator() {
         return super.createGenerator();
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
index 1f10ffb..cbb3f35 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
-import java.awt.*;
+import java.awt.BorderLayout;
 
 public class StandardModePanel extends GeneratorControllerPanel {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
index b4794f3..425a0f2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
@@ -78,4 +78,4 @@ public class StandardPanelComponent extends JComponent {
         return superclassPackage;
     }
 
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
deleted file mode 100644
index b81cc73..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenDialog.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.swing.components.TopBorder;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-/**
- * @since 4.1
- */
-public class CgenDialog extends JDialog {
-
-    protected JPanel panel;
-    protected JButton cancelButton;
-
-    CgenDialog(Component generatorPanel) {
-        super(Application.getFrame());
-
-        this.panel = new JPanel();
-        this.panel.setFocusable(false);
-
-        this.cancelButton = new JButton("Cancel");
-        JScrollPane scrollPane = new JScrollPane(
-                generatorPanel,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        scrollPane.setPreferredSize(new Dimension(900, 550));
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.setBorder(TopBorder.create());
-        buttons.add(Box.createHorizontalStrut(50));
-        buttons.add(cancelButton);
-
-        panel.add(scrollPane);
-
-        Container contentPane = getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(panel, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-
-        setTitle("Cgen Global Config");
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-}


[17/32] cayenne git commit: Cgen tab, cgen configuration, cgen in maven, ant, gradle.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index 384d366..3b339df 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -20,15 +20,18 @@
 package org.apache.cayenne.tools;
 
 import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Set;
 
-import com.sun.org.apache.xpath.internal.operations.Bool;
 import groovy.lang.Reference;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
@@ -74,6 +77,10 @@ public class CgenTask extends BaseCayenneTask {
 
     @Input
     @Optional
+    private String excludeEmbeddables;
+
+    @Input
+    @Optional
     private String makePairs;
 
     @Input
@@ -142,6 +149,8 @@ public class CgenTask extends BaseCayenneTask {
 
     private DataChannelMetaData metaData;
 
+    private boolean useConfigFromDataMap;
+
     @TaskAction
     public void generate() {
         File dataMapFile = getDataMapFile();
@@ -152,9 +161,12 @@ public class CgenTask extends BaseCayenneTask {
         CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
         loaderAction.setMainDataMapFile(dataMapFile);
 
-        CayenneGeneratorEntityFilterAction filterAction = new CayenneGeneratorEntityFilterAction();
-        filterAction.setClient(client);
-        filterAction.setNameFilter(NamePatternMatcher.build(getLogger(), includeEntities, excludeEntities));
+        CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+        filterEntityAction.setClient(client);
+        filterEntityAction.setNameFilter(NamePatternMatcher.build(getLogger(), includeEntities, excludeEntities));
+
+        CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+        filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(getLogger(), null, excludeEmbeddables));
 
         try {
             loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
@@ -165,16 +177,18 @@ public class CgenTask extends BaseCayenneTask {
             generator.setLogger(getLogger());
 
             if(this.force || getProject().hasProperty("force")) {
-                generator.setForce(true);
+                generator.getCgenConfiguration().setForce(true);
             }
-            generator.setTimestamp(dataMapFile.lastModified());
-            generator.setDataMap(dataMap);
-            if(generator.getEntities().isEmpty() && generator.getEmbeddables().isEmpty()) {
-                generator.addEntities(filterAction.getFilteredEntities(dataMap));
-                generator.addEmbeddables(dataMap.getEmbeddables());
-                generator.addQueries(dataMap.getQueryDescriptors());
-            } else {
+            generator.getCgenConfiguration().setTimestamp(dataMapFile.lastModified());
+
+            if(!hasConfig() && useConfigFromDataMap) {
                 generator.prepareArtifacts();
+                setDestDir(generator.getCgenConfiguration().getRelPath());
+                generator.getCgenConfiguration().setRelPath(getDestDirFile().toPath());
+            } else {
+                generator.addEntities(filterEntityAction.getFilteredEntities(dataMap));
+                generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
+                generator.addQueries(dataMap.getQueryDescriptors());
             }
             generator.execute();
         } catch (Exception exception) {
@@ -196,35 +210,74 @@ public class CgenTask extends BaseCayenneTask {
         );
     }
 
-    ClassGenerationAction newGeneratorInstance() {
-        return client ? new ClientClassGenerationAction() : new ClassGenerationAction();
-    }
-
     ClassGenerationAction createGenerator(DataMap dataMap) {
-        ClassGenerationAction action = this.newGeneratorInstance();
-
-        if(metaData != null && metaData.get(dataMap, ClassGenerationAction.class) != null){
-            action = metaData.get(dataMap, ClassGenerationAction.class);
+        CgenConfiguration cgenConfiguration = buildConfiguration(dataMap);
+        return cgenConfiguration.isClient() ? new ClientClassGenerationAction(cgenConfiguration) :
+                new ClassGenerationAction(cgenConfiguration);
+    }
+
+    CgenConfiguration buildConfiguration(DataMap dataMap) {
+        CgenConfiguration cgenConfiguration;
+        if(hasConfig()) {
+            return cgenConfigFromPom(dataMap);
+        } else if(metaData != null && metaData.get(dataMap, CgenConfiguration.class) != null) {
+            useConfigFromDataMap = true;
+            cgenConfiguration = metaData.get(dataMap, CgenConfiguration.class);
+            Path resourcePath = Paths.get(getDataMapFile().getPath());
+            if(Files.isRegularFile(resourcePath)) {
+                resourcePath = resourcePath.getParent();
+            }
+            cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
+            return cgenConfiguration;
+        } else {
+            cgenConfiguration = new CgenConfiguration();
+            cgenConfiguration.setRelPath(getDestDirFile().getPath());
+            cgenConfiguration.setDataMap(dataMap);
+            return cgenConfiguration;
         }
+    }
 
-        action.setDestDir(getDestDirFile());
-        action.setEncoding(encoding != null ? encoding : action.getEncoding());
-        action.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : action.isMakePairs());
-        action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
-        action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
-        action.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : action.isOverwrite());
-        action.setSuperPkg(superPkg != null ? superPkg : action.getSuperPkg());
-        action.setSuperTemplate(superTemplate != null ? superTemplate : action.getSuperclassTemplate());
-        action.setTemplate(template != null ? template : action.getTemplate());
-        action.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : action.getEmbeddableSuperTemplate());
-        action.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : action.getEmbeddableTemplate());
-        action.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : action.isUsePkgPath());
-        action.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : action.isCreatePropertyNames());
-        action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
-        action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
-        return action;
+    private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
+        cgenConfiguration.setDataMap(dataMap);
+        cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().getPath() : cgenConfiguration.getRelPath());
+        cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
+        cgenConfiguration.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : cgenConfiguration.isMakePairs());
+        cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
+        cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
+        cgenConfiguration.setOverwrite(overwrite != null ? Boolean.valueOf(overwrite) : cgenConfiguration.isOverwrite());
+        cgenConfiguration.setSuperPkg(superPkg != null ? superPkg : cgenConfiguration.getSuperPkg());
+        cgenConfiguration.setSuperTemplate(superTemplate != null ? superTemplate : cgenConfiguration.getSuperTemplate());
+        cgenConfiguration.setTemplate(template != null ? template :  cgenConfiguration.getTemplate());
+        cgenConfiguration.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : cgenConfiguration.getEmbeddableSuperTemplate());
+        cgenConfiguration.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : cgenConfiguration.getEmbeddableTemplate());
+        cgenConfiguration.setUsePkgPath(usePkgPath != null ? Boolean.valueOf(usePkgPath) : cgenConfiguration.isUsePkgPath());
+        cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : cgenConfiguration.isCreatePropertyNames());
+        cgenConfiguration.setQueryTemplate(queryTemplate != null ? queryTemplate : cgenConfiguration.getQueryTemplate());
+        cgenConfiguration.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : cgenConfiguration.getQuerySuperTemplate());
+        cgenConfiguration.setCreatePKProperties(createPKProperties);
+        cgenConfiguration.setClient(client);
+        if(!cgenConfiguration.isMakePairs()) {
+            if(template == null) {
+                cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+            }
+            if(embeddableTemplate == null) {
+                cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
+            }
+            if(queryTemplate == null) {
+                cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+            }
+        }
+        return cgenConfiguration;
     }
 
+    private boolean hasConfig() {
+        return destDir != null || destDirName != null || encoding != null || client || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+                makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
+                superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
+                usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
+                querySuperTemplate != null || createPKProperties;
+    }
 
     @OutputDirectory
     protected File getDestDirFile() {
@@ -358,6 +411,18 @@ public class CgenTask extends BaseCayenneTask {
         setIncludeEntities(includeEntities);
     }
 
+    public String getExcludeEmbeddables() {
+        return excludeEmbeddables;
+    }
+
+    public void setExcludeEmbeddables(String excludeEmbeddables) {
+        this.excludeEmbeddables = excludeEmbeddables;
+    }
+
+    public void excludeEmbeddables(String excludeEmbeddables) {
+        setExcludeEmbeddables(excludeEmbeddables);
+    }
+
     public boolean isMakePairs() {
         return Boolean.valueOf(makePairs);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
index 132320c..b41c1d2 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
@@ -24,11 +24,14 @@ import org.gradle.testkit.runner.GradleRunner;
 import org.gradle.testkit.runner.TaskOutcome;
 import org.junit.Test;
 
-
 import java.io.File;
 import java.net.URLDecoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -88,4 +91,59 @@ public class CgenTaskIT extends BaseTaskIT {
         assertEquals(TaskOutcome.SUCCESS, result.task(":cgen").getOutcome());
     }
 
+    @Test
+    public void cgenWithConfig() throws Exception {
+        GradleRunner runner = createRunner(
+                "cgen_with_config",
+                "cgen",
+                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenConfig.map.xml").getFile(), "UTF-8")
+        );
+
+        BuildResult result = runner.forwardOutput().build();
+
+        String generatedDirectoryPath = projectDir.getAbsolutePath() + "/customDirectory1/";
+
+        String generatedClassPath = generatedDirectoryPath + "ObjEntity1.txt";
+        String datamap = generatedDirectoryPath + "CgenMap.txt";
+        String notIncludedEntity = generatedDirectoryPath + "ObjEntity.txt";
+        String notIncludedEmbeddable = generatedDirectoryPath + "Embeddable.txt";
+
+        Path generatedClass = Paths.get(generatedClassPath);
+        Path generatedDataMap = Paths.get(datamap);
+        Path generatedNotIncludedEntity = Paths.get(notIncludedEntity);
+        Path generatedNotIncludedEmbeddable = Paths.get(notIncludedEmbeddable);
+
+        assertTrue(Files.exists(generatedClass));
+        assertFalse(Files.exists(generatedDataMap));
+        assertFalse(Files.exists(generatedNotIncludedEmbeddable));
+        assertFalse(Files.exists(generatedNotIncludedEntity));
+        assertEquals(TaskOutcome.SUCCESS, result.task(":cgen").getOutcome());
+    }
+
+    @Test
+    public void testWithConfigs() throws Exception {
+        GradleRunner runner = createRunner(
+                "cgen_with_configs",
+                "cgen",
+                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenMap.map.xml").getFile(), "UTF-8")
+        );
+
+        BuildResult result = runner.forwardOutput().build();
+
+        String generatedDirectoryPath = projectDir.getAbsolutePath() + "/customDirectory/";
+
+        String generatedClassPath = generatedDirectoryPath + "ObjEntity.groovy";
+        Path generatedClass = Paths.get(generatedClassPath);
+        assertTrue(Files.exists(generatedClass));
+
+        String notIncludedEntity = generatedDirectoryPath + "ObjEntity1.groovy";
+        Path generatedNotIncludedEntity = Paths.get(notIncludedEntity);
+        assertFalse(Files.exists(generatedNotIncludedEntity));
+
+        String includedDataMap = generatedDirectoryPath + "CgenMap.groovy";
+        Path generatedIncludedDataMap = Paths.get(includedDataMap);
+        assertTrue(Files.exists(generatedIncludedDataMap));
+
+        assertEquals(TaskOutcome.SUCCESS, result.task(":cgen").getOutcome());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
index 478ac5c..e2fa3ca 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.tools;
 
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.junit.Rule;
@@ -27,7 +28,8 @@ import org.junit.rules.TemporaryFolder;
 
 import java.io.File;
 
-import static junit.framework.TestCase.assertSame;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.*;
 
 /**
@@ -40,7 +42,7 @@ public class CgenTaskTest {
 
     DataMap dataMap = new DataMap();
 
-    private CgenTask createCgenTaskMock(ClassGenerationAction action) {
+    private CgenTask createCgenTaskMock() {
         CgenTask mock = mock(CgenTask.class);
 
         doCallRealMethod().when(mock).setClient(anyBoolean());
@@ -59,7 +61,7 @@ public class CgenTaskTest {
         doCallRealMethod().when(mock).setOverwrite(anyBoolean());
         doCallRealMethod().when(mock).setUsePkgPath(anyBoolean());
         doCallRealMethod().when(mock).setTemplate(anyString());
-        when(mock.newGeneratorInstance()).thenReturn(action);
+        when(mock.buildConfiguration(dataMap)).thenCallRealMethod();
         when(mock.createGenerator(dataMap)).thenCallRealMethod();
 
         return mock;
@@ -67,9 +69,7 @@ public class CgenTaskTest {
 
     @Test
     public void testGeneratorCreation() {
-        ClassGenerationAction action = mock(ClassGenerationAction.class);
-        CgenTask task = createCgenTaskMock(action);
-
+        CgenTask task = createCgenTaskMock();
         task.setEmbeddableSuperTemplate("superTemplate");
         task.setEmbeddableTemplate("template");
         task.setEncoding("UTF-8");
@@ -78,28 +78,29 @@ public class CgenTaskTest {
         task.setMode("entity");
         task.setOutputPattern("pattern");
         task.setSuperPkg("org.example.model.auto");
-        task.setSuperTemplate("*.java");
-        task.setTemplate("*.java");
+        task.setSuperTemplate("superTemplate");
+        task.setTemplate("template");
         task.setMakePairs(true);
         task.setCreatePropertyNames(true);
         task.setOverwrite(true);
         task.setUsePkgPath(true);
 
         ClassGenerationAction createdAction = task.createGenerator(dataMap);
-        assertSame(action, createdAction);
 
-        verify(action).setCreatePropertyNames(true);
-        verify(action).setMakePairs(true);
-        verify(action).setOverwrite(true);
-        verify(action).setUsePkgPath(true);
-        verify(action).setArtifactsGenerationMode("entity");
-        verify(action).setEncoding("UTF-8");
-        verify(action).setEmbeddableSuperTemplate("superTemplate");
-        verify(action).setEmbeddableTemplate("template");
-        verify(action).setOutputPattern("pattern");
-        verify(action).setSuperPkg("org.example.model.auto");
-        verify(action).setSuperTemplate("*.java");
-        verify(action).setTemplate("*.java");
+        CgenConfiguration cgenConfiguration = createdAction.getCgenConfiguration();
+        assertEquals(cgenConfiguration.getEmbeddableSuperTemplate(), "superTemplate");
+        assertEquals(cgenConfiguration.getEmbeddableTemplate(), "template");
+        assertEquals(cgenConfiguration.getEncoding(), "UTF-8");
+        assertEquals(cgenConfiguration.getArtifactsGenerationMode(), "entity");
+        assertEquals(cgenConfiguration.getOutputPattern(), "pattern");
+        assertEquals(cgenConfiguration.getSuperPkg(), "org.example.model.auto");
+        assertEquals(cgenConfiguration.getSuperTemplate(), "superTemplate");
+        assertEquals(cgenConfiguration.getTemplate(), "template");
+        assertTrue(cgenConfiguration.isMakePairs());
+        assertTrue(cgenConfiguration.isCreatePropertyNames());
+        assertTrue(cgenConfiguration.isOverwrite());
+        assertTrue(cgenConfiguration.isUsePkgPath());
+
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
deleted file mode 100644
index bf981ec..0000000
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
+++ /dev/null
@@ -1,71 +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.tools;
-
-import org.gradle.testkit.runner.BuildResult;
-import org.gradle.testkit.runner.GradleRunner;
-import org.gradle.testkit.runner.TaskOutcome;
-import org.junit.Test;
-
-
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.URLDecoder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-/**
- * @since 4.1
- */
-public class CgenTaskWithConfigIT extends BaseTaskIT{
-
-    @Test
-    public void cgenWithConfig() throws Exception {
-        GradleRunner runner = createRunner(
-                "cgen_with_config",
-                "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenMap.map.xml").getFile(), "UTF-8")
-        );
-
-        BuildResult result = runner.forwardOutput().build();
-
-        String generatedDirectoryPath = projectDir.getAbsolutePath() + "/customDirectory/";
-
-        String generatedClassPath = generatedDirectoryPath + "ObjEntity1.txt";
-        String datamap = generatedDirectoryPath + "TestCgenMap.txt";
-        String notIncludedEntity = generatedDirectoryPath + "ObjEntity.txt";
-        String notIncludedSuperDatamap = generatedDirectoryPath + "_TestCgenMap.txt";
-
-        File notIncludeSuperDatamap = new File("_TestCgenMap.txt");
-        assertFalse(notIncludeSuperDatamap.exists());
-
-        File generatedClass = new File(generatedClassPath);
-        File generatedDatamap = new File(datamap);
-        File generatedNotIncludedEntity = new File(notIncludedEntity);
-        File generatedNotIncludedSuperDatamap = new File(notIncludedSuperDatamap);
-
-        assertTrue(generatedClass.exists());
-        assertFalse(generatedDatamap.exists());
-        assertFalse(generatedNotIncludedEntity.exists());
-        assertFalse(generatedNotIncludedSuperDatamap.exists());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
new file mode 100644
index 0000000..e3bfe55
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <destDir>./customDirectory1</destDir>
+        <excludeEntities>ObjEntity</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <mode>entity</mode>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>false</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwrite>false</overwrite>
+        <createPropertyNames>false</createPropertyNames>
+    </cgen>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
index 930acbc..78da7cd 100644
--- a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
@@ -7,21 +7,16 @@
     <obj-entity name="ObjEntity" className="ObjEntity"/>
     <obj-entity name="ObjEntity1" className="ObjEntity1"/>
     <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
-        <objEntity>
-            <name>ObjEntity1</name>
-        </objEntity>
-        <generationMode>all</generationMode>
-        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
-        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
-        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
-        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
-        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
-        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <destDir>./customDirectory</destDir>
+        <excludeEntities>ObjEntity</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <mode>entity</mode>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
         <outputPattern>*.txt</outputPattern>
         <makePairs>false</makePairs>
         <usePkgPath>true</usePkgPath>
-        <overwriteSubclasses>false</overwriteSubclasses>
+        <overwrite>false</overwrite>
         <createPropertyNames>false</createPropertyNames>
-        <encoding>UTF-8</encoding>
     </cgen>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
index 3cad46e..94de25f 100644
--- a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
@@ -19,10 +19,9 @@
 
 plugins {
     id 'org.apache.cayenne'
+    id 'java'
 }
 
 cgen {
     map dataMap
-    destDir = './customDirectory'
-    mode = 'entity'
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_configs.gradle
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_configs.gradle b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_configs.gradle
new file mode 100644
index 0000000..9299033
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_configs.gradle
@@ -0,0 +1,32 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+
+plugins {
+    id 'org.apache.cayenne'
+}
+
+cgen {
+    map dataMap
+    destDir = './customDirectory'
+    makePairs false
+    outputPattern = '*.groovy'
+    excludeEntities = 'ObjEntity1'
+    overwrite = false
+    mode = 'all'
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 1ab9f96..e936024 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
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
@@ -38,9 +39,13 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 
 /**
- * Maven mojo to perform class generation from data map. This class is an Maven
+ * Maven mojo to perform class generation from data cgenConfiguration. This class is an Maven
  * adapter to DefaultClassGenerator class.
  * 
  * @since 3.0
@@ -94,6 +99,13 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	private String includeEntities;
 
 	/**
+	 * Embeddables (expressed as a perl5 regex) to exclude from template
+	 * generation. (Default is to include all embeddables in the DataMap).
+	 */
+	@Parameter
+	private String excludeEmbeddables;
+
+	/**
 	 * If set to <code>true</code>, will generate subclass/superclass pairs,
 	 * with all generated code included in superclass (default is
 	 * <code>true</code>).
@@ -207,30 +219,31 @@ public class CayenneGeneratorMojo extends AbstractMojo {
      * @since 4.1
      */
     @Parameter(defaultValue = "false")
-    private Boolean createPKProperties;
+    private boolean createPKProperties;
 
     private transient Injector injector;
 
     private static final Logger logger = LoggerFactory.getLogger(CayenneGeneratorMojo.class);
 
+    private boolean useConfigFromDataMap;
+
 	public void execute() throws MojoExecutionException, MojoFailureException {
 		// Create the destination directory if necessary.
 		// TODO: (KJM 11/2/06) The destDir really should be added as a
 		// compilation resource for maven.
 
-		if (!destDir.exists()) {
-			destDir.mkdirs();
-		}
-
 		injector = DIBootstrap.createInjector(new CgenModule(), new ToolsModule(LoggerFactory.getLogger(CayenneGeneratorMojo.class)));
 
 		Logger logger = new MavenLogger(this);
 		CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
 		loaderAction.setMainDataMapFile(map);
 
-		CayenneGeneratorEntityFilterAction filterAction = new CayenneGeneratorEntityFilterAction();
-		filterAction.setClient(client);
-		filterAction.setNameFilter(NamePatternMatcher.build(logger, includeEntities, excludeEntities));
+		CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+		filterEntityAction.setClient(client);
+		filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntities, excludeEntities));
+
+		CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+		filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddables));
 
 		try {
 			loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
@@ -242,17 +255,17 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 			if(force) {
 				// will (re-)generate all files
-				generator.setForce(true);
+				generator.getCgenConfiguration().setForce(true);
 			}
-			generator.setTimestamp(map.lastModified());
-			generator.setDataMap(dataMap);
-			if(!generator.getEntities().isEmpty() || !generator.getEmbeddables().isEmpty()){
+			generator.getCgenConfiguration().setTimestamp(map.lastModified());
+			if(!hasConfig() && useConfigFromDataMap) {
 				generator.prepareArtifacts();
 			} else {
-				generator.addEntities(filterAction.getFilteredEntities(dataMap));
-				generator.addEmbeddables(dataMap.getEmbeddables());
+				generator.addEntities(filterEntityAction.getFilteredEntities(dataMap));
+				generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
 				generator.addQueries(dataMap.getQueryDescriptors());
 			}
+			URL dataName = dataMap.getConfigurationSource().getURL();
 			generator.execute();
 		} catch (Exception e) {
 			throw new MojoExecutionException("Error generating classes: ", e);
@@ -260,7 +273,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	}
 
 	/**
-	 * Loads and returns DataMap based on <code>map</code> attribute.
+	 * Loads and returns DataMap based on <code>cgenConfiguration</code> attribute.
 	 */
 	protected File[] convertAdditionalDataMaps() throws Exception {
 
@@ -277,40 +290,78 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		);
 	}
 
+	private boolean hasConfig() {
+		return encoding != null || client || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+				makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
+				superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
+				usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
+				querySuperTemplate != null || createPKProperties;
+	}
+
 	/**
 	 * Factory method to create internal class generator. Called from
 	 * constructor.
 	 */
-	protected ClassGenerationAction createGenerator(DataMap dataMap) {
+	private ClassGenerationAction createGenerator(DataMap dataMap) {
+		CgenConfiguration cgenConfiguration = buildConfiguration(dataMap);
+		ClassGenerationAction classGenerationAction = cgenConfiguration.isClient() ? new ClientClassGenerationAction(cgenConfiguration) :
+				new ClassGenerationAction(cgenConfiguration);
+		injector.injectMembers(classGenerationAction);
 
-	    ClassGenerationAction action = injector.getInstance(DataChannelMetaData.class).get(dataMap, ClassGenerationAction.class);
+		return classGenerationAction;
+	}
 
-		if (client) {
-			action = new ClientClassGenerationAction();
+	private CgenConfiguration buildConfiguration(DataMap dataMap) {
+		CgenConfiguration cgenConfiguration = injector.getInstance(DataChannelMetaData.class).get(dataMap, CgenConfiguration.class);
+		if(hasConfig()) {
+			return cgenConfigFromPom(dataMap);
+		} else if(cgenConfiguration != null) {
+			useConfigFromDataMap = true;
+			Path resourcePath = Paths.get(map.getPath());
+			if(Files.isRegularFile(resourcePath)) {
+				resourcePath = resourcePath.getParent();
+			}
+			cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
+			return cgenConfiguration;
 		} else {
-            if(action == null) {
-                action = new ClassGenerationAction();
-            }
+			cgenConfiguration = new CgenConfiguration();
+			cgenConfiguration.setDataMap(dataMap);
+			cgenConfiguration.setRelPath(destDir.getPath());
+			return cgenConfiguration;
 		}
+	}
 
-		injector.injectMembers(action);
-
-//		action.setDestDir(destDir.toPath());
-		action.setEncoding(encoding != null ? encoding : action.getEncoding());
-		action.setMakePairs(makePairs != null ? makePairs : action.isMakePairs());
-		action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
-		action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
-		action.setOverwrite(overwrite != null ? overwrite : action.isOverwrite());
-		action.setSuperPkg(superPkg != null ? superPkg : action.getSuperPkg());
-		action.setSuperTemplate(superTemplate != null ? superTemplate : action.getSuperclassTemplate());
-		action.setTemplate(template != null ? template : action.getTemplate());
-		action.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : action.getEmbeddableSuperTemplate());
-		action.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : action.getEmbeddableTemplate());
-		action.setUsePkgPath(usePkgPath != null ? usePkgPath : action.isUsePkgPath());
-		action.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : action.isCreatePropertyNames());
-		action.setQueryTemplate(queryTemplate != null ? queryTemplate : action.getQueryTemplate());
-		action.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : action.getQuerySuperTemplate());
-		action.setCreatePKProperties(createPKProperties != null ? createPKProperties : action.isCreatePropertyNames());
-		return action;
+	private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
+		CgenConfiguration cgenConfiguration = new CgenConfiguration();
+		cgenConfiguration.setDataMap(dataMap);
+		cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : cgenConfiguration.getRelPath());
+		cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
+		cgenConfiguration.setMakePairs(makePairs != null ? makePairs : cgenConfiguration.isMakePairs());
+		cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
+		cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
+		cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
+		cgenConfiguration.setSuperPkg(superPkg != null ? superPkg : cgenConfiguration.getSuperPkg());
+		cgenConfiguration.setSuperTemplate(superTemplate != null ? superTemplate : cgenConfiguration.getSuperTemplate());
+		cgenConfiguration.setTemplate(template != null ? template :  cgenConfiguration.getTemplate());
+		cgenConfiguration.setEmbeddableSuperTemplate(embeddableSuperTemplate != null ? embeddableSuperTemplate : cgenConfiguration.getEmbeddableSuperTemplate());
+		cgenConfiguration.setEmbeddableTemplate(embeddableTemplate != null ? embeddableTemplate : cgenConfiguration.getEmbeddableTemplate());
+		cgenConfiguration.setUsePkgPath(usePkgPath != null ? usePkgPath : cgenConfiguration.isUsePkgPath());
+		cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : cgenConfiguration.isCreatePropertyNames());
+		cgenConfiguration.setQueryTemplate(queryTemplate != null ? queryTemplate : cgenConfiguration.getQueryTemplate());
+		cgenConfiguration.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : cgenConfiguration.getQuerySuperTemplate());
+		cgenConfiguration.setCreatePKProperties(createPKProperties);
+		cgenConfiguration.setClient(client);
+		if(!cgenConfiguration.isMakePairs()) {
+			if(template == null) {
+				cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+			}
+			if(embeddableTemplate == null) {
+				cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
+			}
+			if(queryTemplate == null) {
+				cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+			}
+		}
+		return cgenConfiguration;
 	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
index 40338fb..edad490 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
@@ -65,4 +65,52 @@ public class CayenneGeneratorMojoTest extends AbstractMojoTestCase {
         assertTrue(content.contains("public void addToAdditionalRel(TestRelEntity obj)"));
         assertTrue(content.contains("public void removeFromAdditionalRel(TestRelEntity obj)"));
     }
+
+    public void testCgenDataMapConfig() throws Exception {
+        File pom = getTestFile("src/test/resources/cgen/project-to-test/cgen-pom.xml");
+        assertNotNull(pom);
+        assertTrue(pom.exists());
+
+        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen", pom);
+        assertNotNull(myMojo);
+        myMojo.execute();
+
+        File testEntity = new File("target/cgenClasses/ObjEntity1.txt");
+        File notIncludedDataMapEntity = new File("target/cgenClasses/TestCgenMap.txt");
+
+        File notIncludedEntity = new File("target/cgenClasses/ObjEntity.txt");
+        File notIncludedEmbeddable = new File("target/cgenClasses/Embeddable.txt");
+        File notIncludedSuperDataMap = new File("target/cgenClasses/_TestCgenMap.txt");
+
+        assertTrue(testEntity.exists());
+        assertFalse(notIncludedDataMapEntity.exists());
+
+        assertFalse(notIncludedEntity.exists());
+        assertFalse(notIncludedSuperDataMap.exists());
+        assertFalse(notIncludedEmbeddable.exists());
+    }
+
+    public void testDataMapPomCgen() throws Exception {
+        File pom = getTestFile("src/test/resources/cgen/project-to-test/datamap-and-pom.xml");
+        assertNotNull(pom);
+        assertTrue(pom.exists());
+
+        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen", pom);
+        assertNotNull(myMojo);
+        myMojo.execute();
+
+        File objEntity1 = new File("target/resultClasses/ObjEntity1.txt");
+        assertTrue(objEntity1.exists());
+        File embeddable = new File("target/resultClasses/Embeddable.txt");
+        assertTrue(embeddable.exists());
+        File dataMap = new File("target/resultClasses/TestCgen.txt");
+        assertTrue(dataMap.exists());
+
+        File objEntity = new File("target/resultClasses/ObjEntity.txt");
+        assertFalse(objEntity.exists());
+        File superObjEntity1 = new File("target/resultClasses/superPkg/_ObjEntity.txt");
+        assertFalse(superObjEntity1.exists());
+        File superDataMap = new File("target/resultClasses/superPkg/_TestCgen.txt");
+        assertFalse(superDataMap.exists());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
deleted file mode 100644
index 2532db5..0000000
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
+++ /dev/null
@@ -1,51 +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.tools;
-
-import org.apache.maven.plugin.testing.AbstractMojoTestCase;
-
-import java.io.File;
-
-/**
- * @since 4.1
- */
-public class CgenWithConfigMojoTest extends AbstractMojoTestCase {
-
-    public void testCgen() throws Exception {
-        File pom = getTestFile("src/test/resources/cgen/project-to-test/cgen-pom.xml");
-        assertNotNull(pom);
-        assertTrue(pom.exists());
-
-        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen", pom);
-        assertNotNull(myMojo);
-        myMojo.execute();
-
-        File testEntity = new File("target/cgenClasses/ObjEntity1.txt");
-        File notIncludedDataMapEntity = new File("target/cgenClasses/TestCgenMap.txt");
-
-        File notIncludedEntity = new File("target/cgenClasses/ObjEntity.txt");
-        File notIncludedSuperDataMap = new File("target/cgenClasses/_TestCgenMap.txt");
-
-        assertTrue(testEntity.exists());
-        assertFalse(notIncludedDataMapEntity.exists());
-
-        assertFalse(notIncludedEntity.exists());
-        assertFalse(notIncludedSuperDataMap.exists());
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
index eadddc6..f72e2db 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
@@ -38,8 +38,6 @@
                 <artifactId>cayenne-maven-plugin</artifactId>
                 <configuration>
                     <map>src/test/resources/cgen/testCgenMap.map.xml</map>
-                    <destDir>target/cgenClasses</destDir>
-                    <mode>entity</mode>
                 </configuration>
             </plugin>
         </plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
new file mode 100644
index 0000000..620a6d0
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <name>Test CayenneGeneratorMojo</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>cayenne-maven-plugin</artifactId>
+                <configuration>
+                    <map>src/test/resources/cgen/testCgen.map.xml</map>
+                    <destDir>target/resultClasses</destDir>
+                    <outputPattern>*.txt</outputPattern>
+                    <makePairs>false</makePairs>
+                    <usePkgPath>true</usePkgPath>
+                    <superPkg>superPkg</superPkg>
+                    <encoding>UTF-8</encoding>
+                    <excludeEntities>ObjEntity</excludeEntities>
+                    <mode>all</mode>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgen.map.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgen.map.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgen.map.xml
new file mode 100644
index 0000000..6986022
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgen.map.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <destDir>../../../../target/cgenClasses</destDir>
+        <mode>entity</mode>
+        <excludeEntities>ObjEntity1</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>true</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwrite>false</overwrite>
+        <createPropertyNames>false</createPropertyNames>
+    </cgen>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
index 930acbc..e320b07 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
@@ -7,21 +7,16 @@
     <obj-entity name="ObjEntity" className="ObjEntity"/>
     <obj-entity name="ObjEntity1" className="ObjEntity1"/>
     <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
-        <objEntity>
-            <name>ObjEntity1</name>
-        </objEntity>
-        <generationMode>all</generationMode>
-        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
-        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
-        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
-        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
-        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
-        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <destDir>../../../../target/cgenClasses</destDir>
+        <mode>entity</mode>
+        <excludeEntities>ObjEntity</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
         <outputPattern>*.txt</outputPattern>
         <makePairs>false</makePairs>
         <usePkgPath>true</usePkgPath>
-        <overwriteSubclasses>false</overwriteSubclasses>
+        <overwrite>false</overwrite>
         <createPropertyNames>false</createPropertyNames>
-        <encoding>UTF-8</encoding>
     </cgen>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
index bdb2e15..6861916 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
@@ -19,15 +19,14 @@
 
 package org.apache.cayenne.modeler.action;
 
+
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.codegen.CodeGeneratorController;
+import org.apache.cayenne.modeler.event.DomainDisplayEvent;
 import org.apache.cayenne.modeler.util.CayenneAction;
-import org.apache.cayenne.project.Project;
 
 import java.awt.event.ActionEvent;
-import java.util.Collection;
+
 
 public class GenerateCodeAction extends CayenneAction {
 
@@ -44,9 +43,6 @@ public class GenerateCodeAction extends CayenneAction {
     }
 
     public void performAction(ActionEvent e) {
-        Collection<DataMap> dataMaps;
-        Project project = getProjectController().getProject();
-        dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
-        new CodeGeneratorController(getApplication().getFrameController(), dataMaps).startup();
+        getProjectController().fireDomainDisplayEvent(new DomainDisplayEvent(this, (DataChannelDescriptor) getProjectController().getProject().getRootNode()));
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
index b9d1c5b..8df07df 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
@@ -1,203 +1,203 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-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;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.List;
-
-public class ClassesTabController extends CayenneController {
-
-    public static final String GENERATE_PROPERTY = "generate";
-
-    protected ClassesTabPanel view;
-
-    private Map<DataMap, ObjectBinding> objectBindings;
-
-    protected Collection<DataMap> dataMaps;
-
-    protected Map<DataMap, List<Object>> objectList;
-
-    private List<Object> currentCollection;
-
-    public ClassesTabController(CodeGeneratorControllerBase parent, Collection<DataMap> dataMaps) {
-        super(parent);
-
-        currentCollection = new ArrayList<>();
-
-        this.objectList = new HashMap<>();
-        for(DataMap dataMap : dataMaps) {
-            List<Object> list = new ArrayList<>();
-            list.add(dataMap);
-            list.addAll(dataMap.getObjEntities());
-            list.addAll(dataMap.getEmbeddables());
-            objectList.put(dataMap, list);
-        }
-
-        this.objectBindings = new HashMap<>();
-        this.dataMaps = dataMaps;
-        this.view = new ClassesTabPanel(dataMaps);
-
-        initBindings();
-    }
-
-    protected CodeGeneratorControllerBase getParentController() {
-        return (CodeGeneratorControllerBase) getParent();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    protected void initBindings() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "parent.setCurrentClass(#item), selected",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-
-        tableBuilder.addColumn(
-                "Class",
-                "parent.getItemName(#item)",
-                JLabel.class,
-                false,
-                "XXXXXXXXXXXXXX");
-
-        tableBuilder.addColumn(
-                "Comments, Warnings",
-                "parent.getProblem(#item)",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        for(DataMap dataMap : dataMaps) {
-            JTable table = view.getDataMapTables().get(dataMap);
-            if(table != null) {
-                currentCollection = objectList.get(dataMap);
-                objectBindings.put(dataMap, tableBuilder.bindToTable(table, "currentCollection"));
-                table.getColumnModel().getColumn(1).setCellRenderer(new ImageRendererColumn());
-            }
-            JCheckBox checkBox = view.getDataMapJCheckBoxMap().get(dataMap);
-            if(checkBox != null) {
-                checkBox.addActionListener(val -> checkDataMap(dataMap, ((JCheckBox)val.getSource()).isSelected()));
-            }
-        }
-    }
-
-    public List<Object> getCurrentCollection() {
-        return currentCollection;
-    }
-
-    public boolean isSelected() {
-        return getParentController().isSelected();
-    }
-
-    public void setSelected(boolean selected) {
-        getParentController().setSelected(selected);
-        classSelectedAction();
-
-        for(DataMap dataMap : dataMaps) {
-            if(view.isAllCheckBoxesFromDataMapSelected(dataMap)) {
-                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(true);
-            } else {
-                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(false);
-            }
-        }
-    }
-
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
-    public void classSelectedAction() {
-        int selectedCount = getParentController().getSelectedEntitiesSize()
-                + getParentController().getSelectedEmbeddablesSize()
-                + getParentController().getSelectedDataMapsSize();
-
-        if (selectedCount == 0) {
-            view.getCheckAll().setSelected(false);
-        }
-        else if (selectedCount == getParentController().getClasses().size()) {
-            view.getCheckAll().setSelected(true);
-        }
-    }
-
-    /**
-     * An action that updates entity check boxes in response to the Select All state
-     * change.
-     */
-    public void checkAllAction() {
-        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
-            dataMaps.forEach(dataMap -> {
-                ObjectBinding binding = objectBindings.get(dataMap);
-                if(binding != null) {
-                    currentCollection = objectList.get(dataMap);
-                    binding.updateView();
-                }
-            });
-        }
-    }
-
-    private void checkDataMap(DataMap dataMap, boolean selected) {
-        if (getParentController().updateDataMapSelection(selected ? o -> true : o -> false, dataMap)){
-            ObjectBinding binding = objectBindings.get(dataMap);
-            if(binding != null) {
-                currentCollection = objectList.get(dataMap);
-                binding.updateView();
-            }
-            if(isAllMapsSelected()) {
-                view.getCheckAll().setSelected(true);
-            }
-        }
-    }
-
-    private boolean isAllMapsSelected() {
-        for(DataMap dataMap : dataMaps) {
-            if(view.getDataMapJCheckBoxMap().get(dataMap) != null) {
-                if(!view.getDataMapJCheckBoxMap().get(dataMap).isSelected()) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//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;
+//import org.apache.cayenne.swing.ObjectBinding;
+//import org.apache.cayenne.swing.TableBindingBuilder;
+//
+//import javax.swing.JCheckBox;
+//import javax.swing.JLabel;
+//import javax.swing.JTable;
+//import java.awt.Component;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.HashMap;
+//import java.util.Map;
+//import java.util.List;
+//
+//public class ClassesTabController extends CayenneController {
+//
+//    public static final String GENERATE_PROPERTY = "generate";
+//
+//    protected ClassesTabPanel view;
+//
+//    private Map<DataMap, ObjectBinding> objectBindings;
+//
+//    protected Collection<DataMap> dataMaps;
+//
+//    protected Map<DataMap, List<Object>> objectList;
+//
+//    private List<Object> currentCollection;
+//
+//    public ClassesTabController(CodeGeneratorControllerBase parent, Collection<DataMap> dataMaps) {
+//        super(parent);
+//
+//        currentCollection = new ArrayList<>();
+//
+//        this.objectList = new HashMap<>();
+//        for(DataMap dataMap : dataMaps) {
+//            List<Object> list = new ArrayList<>();
+//            list.add(dataMap);
+//            list.addAll(dataMap.getObjEntities());
+//            list.addAll(dataMap.getEmbeddables());
+//            objectList.put(dataMap, list);
+//        }
+//
+//        this.objectBindings = new HashMap<>();
+//        this.dataMaps = dataMaps;
+//        this.view = new ClassesTabPanel(dataMaps);
+//
+//        initBindings();
+//    }
+//
+//    protected CodeGeneratorControllerBase getParentController() {
+//        return (CodeGeneratorControllerBase) getParent();
+//    }
+//
+//    public Component getView() {
+//        return view;
+//    }
+//
+//    protected void initBindings() {
+//
+//        BindingBuilder builder = new BindingBuilder(
+//                getApplication().getBindingFactory(),
+//                this);
+//
+//        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+//
+//        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
+//
+//        tableBuilder.addColumn(
+//                "",
+//                "parent.setCurrentClass(#item), selected",
+//                Boolean.class,
+//                true,
+//                Boolean.TRUE);
+//
+//        tableBuilder.addColumn(
+//                "Class",
+//                "parent.getItemName(#item)",
+//                JLabel.class,
+//                false,
+//                "XXXXXXXXXXXXXX");
+//
+//        tableBuilder.addColumn(
+//                "Comments, Warnings",
+//                "parent.getProblem(#item)",
+//                String.class,
+//                false,
+//                "XXXXXXXXXXXXXXXXXXXXXXXXXXX");
+//
+//        for(DataMap dataMap : dataMaps) {
+//            JTable table = view.getDataMapTables().get(dataMap);
+//            if(table != null) {
+//                currentCollection = objectList.get(dataMap);
+//                objectBindings.put(dataMap, tableBuilder.bindToTable(table, "currentCollection"));
+//                table.getColumnModel().getColumn(1).setCellRenderer(new ImageRendererColumn());
+//            }
+//            JCheckBox checkBox = view.getDataMapJCheckBoxMap().get(dataMap);
+//            if(checkBox != null) {
+//                checkBox.addActionListener(val -> checkDataMap(dataMap, ((JCheckBox)val.getSource()).isSelected()));
+//            }
+//        }
+//    }
+//
+//    public List<Object> getCurrentCollection() {
+//        return currentCollection;
+//    }
+//
+//    public boolean isSelected() {
+//        return getParentController().isSelected();
+//    }
+//
+//    public void setSelected(boolean selected) {
+//        getParentController().setSelected(selected);
+//        classSelectedAction();
+//
+//        for(DataMap dataMap : dataMaps) {
+//            if(view.isAllCheckBoxesFromDataMapSelected(dataMap)) {
+//                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(true);
+//            } else {
+//                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(false);
+//            }
+//        }
+//    }
+//
+//    /**
+//     * A callback action that updates the state of Select All checkbox.
+//     */
+//    public void classSelectedAction() {
+//        int selectedCount = getParentController().getSelectedEntitiesSize()
+//                + getParentController().getSelectedEmbeddablesSize()
+//                + getParentController().getSelectedDataMapsSize();
+//
+//        if (selectedCount == 0) {
+//            view.getCheckAll().setSelected(false);
+//        }
+//        else if (selectedCount == getParentController().getClasses().size()) {
+//            view.getCheckAll().setSelected(true);
+//        }
+//    }
+//
+//    /**
+//     * An action that updates entity check boxes in response to the Select All state
+//     * change.
+//     */
+//    public void checkAllAction() {
+//        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
+//            dataMaps.forEach(dataMap -> {
+//                ObjectBinding binding = objectBindings.get(dataMap);
+//                if(binding != null) {
+//                    currentCollection = objectList.get(dataMap);
+//                    binding.updateView();
+//                }
+//            });
+//        }
+//    }
+//
+//    private void checkDataMap(DataMap dataMap, boolean selected) {
+//        if (getParentController().updateDataMapSelection(selected ? o -> true : o -> false, dataMap)){
+//            ObjectBinding binding = objectBindings.get(dataMap);
+//            if(binding != null) {
+//                currentCollection = objectList.get(dataMap);
+//                binding.updateView();
+//            }
+//            if(isAllMapsSelected()) {
+//                view.getCheckAll().setSelected(true);
+//            }
+//        }
+//    }
+//
+//    private boolean isAllMapsSelected() {
+//        for(DataMap dataMap : dataMaps) {
+//            if(view.getDataMapJCheckBoxMap().get(dataMap) != null) {
+//                if(!view.getDataMapJCheckBoxMap().get(dataMap).isSelected()) {
+//                    return false;
+//                }
+//            }
+//        }
+//        return true;
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
index b1d3bd9..5d7e895 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
@@ -1,141 +1,141 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.map.DataMap;
-
-import javax.swing.BoxLayout;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.UIManager;
-import javax.swing.border.EmptyBorder;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- */
-public class ClassesTabPanel extends JPanel {
-
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
-
-    private Map<DataMap, JTable> dataMapTables;
-
-    private Map<DataMap, JCheckBox> dataMapJCheckBoxMap;
-
-    public ClassesTabPanel(Collection<DataMap> dataMaps) {
-        dataMapTables = new HashMap<>();
-        dataMapJCheckBoxMap = new HashMap<>();
-
-        // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
-        // table header????
-        this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Classes");
-
-        checkAll.addItemListener(event -> {
-            if (checkAll.isSelected()) {
-                checkAllLabel.setText("Uncheck All Classess");
-                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(true));
-            }
-            else {
-                checkAllLabel.setText("Check All Classes");
-                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(false));
-            }
-        });
-
-        // assemble
-        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
-        topPanel.setBorder(UIManager.getBorder("ToolBar.border"));
-        topPanel.add(checkAll);
-        topPanel.add(checkAllLabel);
-
-        JPanel panel = new JPanel();
-        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-        for(DataMap dataMap : dataMaps) {
-            JTable table = new JTable();
-            table.setRowHeight(22);
-            dataMapTables.put(dataMap, table);
-            JPanel scrollTable = new JPanel(new BorderLayout());
-            scrollTable.add(dataMapTables.get(dataMap).getTableHeader(), BorderLayout.NORTH);
-            scrollTable.add(dataMapTables.get(dataMap), BorderLayout.CENTER);
-            scrollTable.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width,
-                    (dataMap.getEmbeddables().size() + dataMap.getObjEntities().size()) * dataMapTables.get(dataMap).getRowHeight() + 45));
-            JPanel labelPanel = new JPanel(new BorderLayout());
-            labelPanel.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width, 20));
-            JLabel dataMapLabel = new JLabel(dataMap.getName());
-            dataMapLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
-            dataMapLabel.setBorder(new EmptyBorder(8, 8, 8, 0));
-            labelPanel.add(dataMapLabel, BorderLayout.CENTER);
-
-            JCheckBox dataMapCheckBox = new JCheckBox();
-            dataMapJCheckBoxMap.put(dataMap, dataMapCheckBox);
-            labelPanel.add(dataMapCheckBox, BorderLayout.WEST);
-
-            JPanel currPanel = new JPanel(new BorderLayout());
-            currPanel.add(labelPanel, BorderLayout.NORTH);
-            currPanel.add(scrollTable, BorderLayout.CENTER);
-
-            panel.add(currPanel);
-        }
-
-        JScrollPane tablePanel = new JScrollPane(
-                panel,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
-
-        // set some minimal preferred size, so that it is smaller than other forms used in
-        // the dialog... this way we get the right automated overall size
-        tablePanel.setPreferredSize(new Dimension(450, 400));
-        setLayout(new BorderLayout());
-        add(topPanel, BorderLayout.NORTH);
-        add(tablePanel, BorderLayout.CENTER);
-    }
-
-    public boolean isAllCheckBoxesFromDataMapSelected(DataMap dataMap) {
-        JTable table = dataMapTables.get(dataMap);
-        for(int i = 0; i < table.getRowCount(); i++) {
-            if(!(Boolean)table.getModel().getValueAt(i, 0)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public Map<DataMap, JTable> getDataMapTables() {
-        return dataMapTables;
-    }
-
-    public Map<DataMap, JCheckBox> getDataMapJCheckBoxMap() {
-        return dataMapJCheckBoxMap;
-    }
-
-    public JCheckBox getCheckAll() {
-        return checkAll;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.map.DataMap;
+//
+//import javax.swing.BoxLayout;
+//import javax.swing.JCheckBox;
+//import javax.swing.JLabel;
+//import javax.swing.JPanel;
+//import javax.swing.JScrollPane;
+//import javax.swing.JTable;
+//import javax.swing.ScrollPaneConstants;
+//import javax.swing.UIManager;
+//import javax.swing.border.EmptyBorder;
+//import java.awt.BorderLayout;
+//import java.awt.Component;
+//import java.awt.Dimension;
+//import java.awt.FlowLayout;
+//import java.util.Collection;
+//import java.util.HashMap;
+//import java.util.Map;
+//
+///**
+// */
+//public class ClassesTabPanel extends JPanel {
+//
+//    protected JCheckBox checkAll;
+//    protected JLabel checkAllLabel;
+//
+//    private Map<DataMap, JTable> dataMapTables;
+//
+//    private Map<DataMap, JCheckBox> dataMapJCheckBoxMap;
+//
+//    public ClassesTabPanel(Collection<DataMap> dataMaps) {
+//        dataMapTables = new HashMap<>();
+//        dataMapJCheckBoxMap = new HashMap<>();
+//
+//        // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
+//        // table header????
+//        this.checkAll = new JCheckBox();
+//        this.checkAllLabel = new JLabel("Check All Classes");
+//
+//        checkAll.addItemListener(event -> {
+//            if (checkAll.isSelected()) {
+//                checkAllLabel.setText("Uncheck All Classess");
+//                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(true));
+//            }
+//            else {
+//                checkAllLabel.setText("Check All Classes");
+//                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(false));
+//            }
+//        });
+//
+//        // assemble
+//        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
+//        topPanel.setBorder(UIManager.getBorder("ToolBar.border"));
+//        topPanel.add(checkAll);
+//        topPanel.add(checkAllLabel);
+//
+//        JPanel panel = new JPanel();
+//        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+//        for(DataMap dataMap : dataMaps) {
+//            JTable table = new JTable();
+//            table.setRowHeight(22);
+//            dataMapTables.put(dataMap, table);
+//            JPanel scrollTable = new JPanel(new BorderLayout());
+//            scrollTable.add(dataMapTables.get(dataMap).getTableHeader(), BorderLayout.NORTH);
+//            scrollTable.add(dataMapTables.get(dataMap), BorderLayout.CENTER);
+//            scrollTable.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width,
+//                    (dataMap.getEmbeddables().size() + dataMap.getObjEntities().size()) * dataMapTables.get(dataMap).getRowHeight() + 45));
+//            JPanel labelPanel = new JPanel(new BorderLayout());
+//            labelPanel.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width, 20));
+//            JLabel dataMapLabel = new JLabel(dataMap.getName());
+//            dataMapLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
+//            dataMapLabel.setBorder(new EmptyBorder(8, 8, 8, 0));
+//            labelPanel.add(dataMapLabel, BorderLayout.CENTER);
+//
+//            JCheckBox dataMapCheckBox = new JCheckBox();
+//            dataMapJCheckBoxMap.put(dataMap, dataMapCheckBox);
+//            labelPanel.add(dataMapCheckBox, BorderLayout.WEST);
+//
+//            JPanel currPanel = new JPanel(new BorderLayout());
+//            currPanel.add(labelPanel, BorderLayout.NORTH);
+//            currPanel.add(scrollTable, BorderLayout.CENTER);
+//
+//            panel.add(currPanel);
+//        }
+//
+//        JScrollPane tablePanel = new JScrollPane(
+//                panel,
+//                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+//                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+//
+//        // set some minimal preferred size, so that it is smaller than other forms used in
+//        // the dialog... this way we get the right automated overall size
+//        tablePanel.setPreferredSize(new Dimension(450, 400));
+//        setLayout(new BorderLayout());
+//        add(topPanel, BorderLayout.NORTH);
+//        add(tablePanel, BorderLayout.CENTER);
+//    }
+//
+//    public boolean isAllCheckBoxesFromDataMapSelected(DataMap dataMap) {
+//        JTable table = dataMapTables.get(dataMap);
+//        for(int i = 0; i < table.getRowCount(); i++) {
+//            if(!(Boolean)table.getModel().getValueAt(i, 0)) {
+//                return false;
+//            }
+//        }
+//        return true;
+//    }
+//
+//    public Map<DataMap, JTable> getDataMapTables() {
+//        return dataMapTables;
+//    }
+//
+//    public Map<DataMap, JCheckBox> getDataMapJCheckBoxMap() {
+//        return dataMapJCheckBoxMap;
+//    }
+//
+//    public JCheckBox getCheckAll() {
+//        return checkAll;
+//    }
+//}
\ No newline at end of file


[26/32] cayenne git commit: Add dialog to create missing templates or using default.

Posted by nt...@apache.org.
Add dialog to create missing templates or using default.


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

Branch: refs/heads/master
Commit: 397d29fa98d1c74ac37732b9243d5cc1366fd98e
Parents: c813e76
Author: Arseni Bulatski <an...@gmail.com>
Authored: Tue Nov 13 16:27:56 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Tue Nov 13 16:27:56 2018 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/CodeTemplateManager.java    |  12 +-
 .../modeler/dialog/cgen/TemplateDialog.java     |  87 ++++++++++++
 .../modeler/dialog/cgen/TemplateDialogView.java | 136 +++++++++++++++++++
 .../modeler/dialog/pref/PreferenceDialog.java   |  18 ++-
 .../dialog/pref/TemplatePreferences.java        |  37 +++--
 .../editor/cgen/CustomModeController.java       |  44 ++++--
 .../modeler/editor/cgen/CustomModePanel.java    |  17 +--
 7 files changed, 308 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/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 ccb4980..7579d5d 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
@@ -25,6 +25,8 @@ import org.apache.cayenne.modeler.pref.FSPath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -155,9 +157,10 @@ public class CodeTemplateManager {
 	// TODO: andrus, 12/5/2007 - this should also take a "pairs" parameter to
 	// correctly
 	// assign standard templates
-	public String getTemplatePath(String name) {
+	public String getTemplatePath(String name, Path rootPath) {
 		Object value = customTemplates.get(name);
 		if (value != null) {
+			value = rootPath.relativize(Paths.get((String)value));
 			return value.toString();
 		}
 
@@ -165,9 +168,10 @@ public class CodeTemplateManager {
 		return value != null ? value.toString() : null;
 	}
 
-	public String getNameByPath(String name) {
-		if(reverseCustomTemplate.containsKey(name)){
-			return reverseCustomTemplate.get(name);
+	public String getNameByPath(String name, Path rootPath) {
+		String fullPath = rootPath.resolve(Paths.get(name)).toString();
+		if(reverseCustomTemplate.containsKey(fullPath)){
+			return reverseCustomTemplate.get(fullPath);
 		} else {
 			Object value = reverseStandartTemplates.get(name);
 			return value != null ? value.toString() : null;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java
new file mode 100644
index 0000000..bd81368
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialog.java
@@ -0,0 +1,87 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.modeler.dialog.cgen;
+
+import org.apache.cayenne.gen.CgenConfiguration;
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.modeler.editor.cgen.CustomModeController;
+import org.apache.cayenne.modeler.util.CayenneController;
+
+import javax.swing.JDialog;
+import javax.swing.SwingUtilities;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Window;
+
+/**
+ * @since 4.1
+ */
+public class TemplateDialog extends CayenneController {
+
+    protected TemplateDialogView view;
+    private CgenConfiguration cgenConfiguration;
+    private String template;
+    private String superTemplate;
+
+    public TemplateDialog(final CayenneController parent, CgenConfiguration cgenConfiguration, String template, String superTemplate) {
+        super(parent);
+        this.cgenConfiguration = cgenConfiguration;
+        this.template = template;
+        this.superTemplate = superTemplate;
+        final Window parentView = parent.getView() instanceof Window
+                ? (Window) parent.getView()
+                : SwingUtilities.getWindowAncestor(parent.getView());
+        this.view = (parentView instanceof Dialog)
+                ? new TemplateDialogView((Dialog) parentView, template, superTemplate)
+                : new TemplateDialogView((Frame) parentView, template, superTemplate);
+        initListeners();
+    }
+
+    public void startupAction() {
+        view.pack();
+        // show
+        centerView();
+        makeCloseableOnEscape();
+        view.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+        view.setModal(true);
+        view.setVisible(true);
+    }
+
+    @Override
+    public Component getView() {
+        return view;
+    }
+
+    private void initListeners() {
+        view.getUseDefault().addActionListener(action -> {
+            if(template != null) {
+                cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE);
+            }
+            if(superTemplate != null) {
+                cgenConfiguration.setSuperTemplate(ClassGenerationAction.SUPERCLASS_TEMPLATE);
+            }
+            view.dispose();
+        });
+        view.getAddTemplate().addActionListener(action -> {
+            ((CustomModeController)parent).addTemplateAction(template, superTemplate);
+            view.dispose();
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java
new file mode 100644
index 0000000..48a80f9
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/cgen/TemplateDialogView.java
@@ -0,0 +1,136 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+package org.apache.cayenne.modeler.dialog.cgen;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.table.AbstractTableModel;
+import java.awt.BorderLayout;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @since 4.1
+ */
+public class TemplateDialogView extends CayenneDialog {
+
+    private JTable pathTable;
+    private JButton useDefault;
+    private JButton addTemplate;
+    private List<String> missingPathes;
+
+    public TemplateDialogView(Dialog parent, String templatePath, String superTemplatePath) {
+        super(parent);
+        initPathes(templatePath, superTemplatePath);
+        init();
+    }
+
+    public TemplateDialogView(Frame parent, String templatePath, String superTemplatePath) {
+        super(parent);
+        initPathes(templatePath, superTemplatePath);
+        init();
+    }
+
+    private void initPathes(String templatePath, String superTemplatePath) {
+        this.missingPathes = new ArrayList<>();
+        if(templatePath != null) {
+            missingPathes.add(templatePath);
+        }
+        if(superTemplatePath != null) {
+            missingPathes.add(superTemplatePath);
+        }
+    }
+
+    private void init() {
+        useDefault = new JButton("Use default");
+        addTemplate = new JButton("Add template");
+
+        pathTable = new JTable();
+        pathTable.setRowHeight(25);
+        pathTable.setRowMargin(3);
+        pathTable.setCellSelectionEnabled(false);
+
+
+        // assemble
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout("fill:200dlu:grow", "pref, 3dlu, fill:40dlu:grow"));
+
+        builder.setDefaultDialogBorder();
+
+        builder.addLabel("This templates are missing: ", cc.xy(1, 1));
+        builder.add(new JScrollPane(pathTable), cc.xy(1, 3));
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(useDefault);
+        buttons.add(addTemplate);
+
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+        getContentPane().add(buttons, BorderLayout.SOUTH);
+        pathTable.setModel(new MissingPathTableModel());
+
+        setPreferredSize(new Dimension(450, 350));
+    }
+
+    public JButton getUseDefault() {
+        return useDefault;
+    }
+
+    public JButton getAddTemplate() {
+        return addTemplate;
+    }
+
+    class MissingPathTableModel extends AbstractTableModel {
+
+        public int getRowCount() {
+            return missingPathes.size();
+        }
+
+        public int getColumnCount() {
+            return 1;
+        }
+
+        public Object getValueAt(int row, int col) {
+            return missingPathes.get(row);
+        }
+
+        public boolean isCellEditable(int row, int col) {
+            return false;
+        }
+
+        public String getColumnName(int column) {
+            return " ";
+        }
+
+        public Class getColumnClass(int columnIndex) {
+            return String.class;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java
index 2e2ab38..677cc5e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/PreferenceDialog.java
@@ -19,6 +19,12 @@
 
 package org.apache.cayenne.modeler.dialog.pref;
 
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.pref.PreferenceEditor;
+
+import javax.swing.JDialog;
+import javax.swing.JList;
+import javax.swing.SwingUtilities;
 import java.awt.Component;
 import java.awt.Dialog;
 import java.awt.Frame;
@@ -26,13 +32,6 @@ import java.awt.Window;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.swing.JDialog;
-import javax.swing.JList;
-import javax.swing.SwingUtilities;
-
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.pref.PreferenceEditor;
-
 /**
  * A controller for editing Modeler preferences.
  * 
@@ -133,6 +132,11 @@ public class PreferenceDialog extends CayenneController {
         view.setVisible(true);
     }
 
+    public void startupToCreateTemplate(String template, String superTemplate) {
+        configure();
+        ((TemplatePreferences) detailControllers.get(TEMPLATES_KEY)).addTemplateAction(template, superTemplate);
+    }
+
     protected void configure() {
         // init known panels
         registerPanel(GENERAL_KEY, new GeneralPreferences(this));

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java
index e76aa5c..1b29183 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/pref/TemplatePreferences.java
@@ -19,14 +19,6 @@
 
 package org.apache.cayenne.modeler.dialog.pref;
 
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.prefs.BackingStoreException;
-import java.util.prefs.Preferences;
-
-import javax.swing.table.AbstractTableModel;
-
 import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
@@ -38,6 +30,14 @@ import org.apache.cayenne.swing.TableBindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.swing.table.AbstractTableModel;
+import java.awt.Component;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
+
 public class TemplatePreferences extends CayenneController {
 
     protected TemplatePreferencesView view;
@@ -120,9 +120,28 @@ public class TemplatePreferences extends CayenneController {
     }
 
     public void addTemplateAction() {
-
         FSPath path = new TemplateCreator(this).startupAction();
+        addToTemplateEntries(path);
+    }
+
+    void addTemplateAction(String templatePath, String superTemplatePath) {
+        if(templatePath != null) {
+            createTemplate(templatePath);
+        }
+        if(superTemplatePath != null) {
+            createTemplate(superTemplatePath);
+        }
+    }
+
+    private void createTemplate(String templatePath) {
+        TemplateCreator templateCreator = new TemplateCreator(this);
+        TemplateCreatorView creatorView = (TemplateCreatorView)templateCreator.getView();
+        creatorView.getTemplateChooser().setFile(Paths.get(templatePath).toFile());
+        FSPath path = templateCreator.startupAction();
+        addToTemplateEntries(path);
+    }
 
+    private void addToTemplateEntries(FSPath path) {
         if (path != null) {
             int len = templateEntries.size();
             templateEntries.add(path);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/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 c591584..a6be13b 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
@@ -22,12 +22,12 @@ package org.apache.cayenne.modeler.editor.cgen;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.modeler.CodeTemplateManager;
+import org.apache.cayenne.modeler.dialog.cgen.TemplateDialog;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.swing.BindingBuilder;
 
-import javax.swing.*;
-import java.awt.*;
-import java.nio.file.Path;
+import javax.swing.DefaultComboBoxModel;
+import java.awt.Component;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -82,22 +82,44 @@ public class CustomModeController extends GeneratorController {
         return view;
     }
 
+    public void missTemplateDialog(CgenConfiguration cgenConfiguration, String template, String superTemplate) {
+        new TemplateDialog(this, cgenConfiguration, template, superTemplate).startupAction();
+        updateComboBoxes();
+    }
+
     public void popPreferencesAction() {
         new PreferenceDialog(getApplication().getFrameController()).startupAction(PreferenceDialog.TEMPLATES_KEY);
         updateTemplates();
         updateComboBoxes();
     }
 
-    private void updateComboBoxes() {
-        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(
-                getAbsoluteTemplatePath(cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath())));
-        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(
-                getAbsoluteTemplatePath(cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath())));
-        view.setDisableSuperComboBoxes(view.getPairs().isSelected());
+    public void addTemplateAction(String template, String superTemplate) {
+        new PreferenceDialog(getApplication().getFrameController()).startupToCreateTemplate(template, superTemplate);
+        updateTemplates();
     }
 
-    private String getAbsoluteTemplatePath(String relTemplatePath, Path rootPath) {
-        return rootPath.resolve(Paths.get(relTemplatePath)).toString();
+    private void updateComboBoxes() {
+        String templateName = getApplication().getCodeTemplateManager().getNameByPath(
+                cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath());
+        String superTemplateName = getApplication().getCodeTemplateManager().getNameByPath(
+                cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath());
+        String path = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getTemplate())).toString();
+        String superPath = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getSuperTemplate())).toString();
+        if(templateName == null && superTemplateName == null) {
+            view.getSubclassTemplate().setItem(null);
+            view.getSuperclassTemplate().setItem(null);
+            missTemplateDialog(cgenConfiguration, path, superPath);
+        } else if(templateName == null) {
+            view.getSubclassTemplate().setItem(null);
+            missTemplateDialog(cgenConfiguration, path, null);
+        } else if(superTemplateName == null) {
+            view.getSuperclassTemplate().setItem(null);
+            missTemplateDialog(cgenConfiguration, null, superPath);
+        } else {
+            view.getSubclassTemplate().setItem(templateName);
+            view.getSuperclassTemplate().setItem(superTemplateName);
+        }
+        view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
     private void initListeners(){

http://git-wip-us.apache.org/repos/asf/cayenne/blob/397d29fa/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 16c8edf..ea5f1ce 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
@@ -27,13 +27,10 @@ import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.ComboBoxAdapter;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.swing.components.JCayenneCheckBox;
-import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
 import javax.swing.*;
 import java.awt.*;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 
 /**
  * @since 4.1
@@ -49,7 +46,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
     private JCheckBox createPropertyNames;
     private JCheckBox pkProperties;
 
-    private ActionLink manageTemplatesLink;
+    private JButton manageTemplatesLink;
 
     CustomModePanel(ProjectController projectController, CodeGeneratorControllerBase codeGeneratorControllerBase) {
         super(projectController, codeGeneratorControllerBase);
@@ -58,7 +55,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenByDataMap();
-                cgenConfiguration.setSuperTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item));
+                cgenConfiguration.setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath()));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }
@@ -70,7 +67,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 CgenConfiguration cgenConfiguration = getCgenByDataMap();
-                cgenConfiguration.setTemplate(getTemplatePath(cgenConfiguration.getRootPath(), item));
+                cgenConfiguration.setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(item, cgenConfiguration.getRootPath()));
                 if(!codeGeneratorControllerBase.isInitFromModel()) {
                     projectController.setDirty(true);
                 }
@@ -93,7 +90,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
         this.createPropertyNames = new JCayenneCheckBox();
         this.pkProperties = new JCayenneCheckBox();
-        this.manageTemplatesLink = new ActionLink("Customize Templates...");
+        this.manageTemplatesLink = new JButton("Customize Templates...");
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
         pairs.addChangeListener(e -> {
@@ -144,15 +141,11 @@ public class CustomModePanel extends GeneratorControllerPanel {
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
-    private String getTemplatePath(Path rootPath, String templatePath) {
-        return rootPath.relativize(Paths.get(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(templatePath)))).toString();
-    }
-
     public void setDisableSuperComboBoxes(boolean val){
         superclassTemplate.getComboBox().setEnabled(val);
     }
 
-    public ActionLink getManageTemplatesLink() {
+    public JButton getManageTemplatesLink() {
         return manageTemplatesLink;
     }
 


[20/32] cayenne git commit: Cgen task refactoring

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
deleted file mode 100644
index 81bd599..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import com.jgoodies.forms.builder.DefaultFormBuilder;
-//import com.jgoodies.forms.layout.FormLayout;
-//
-//import java.awt.BorderLayout;
-//
-//public class StandardModePanel extends GeneratorControllerPanel {
-//
-//    private DefaultFormBuilder builder;
-//
-//    public StandardModePanel() {
-//        FormLayout layout = new FormLayout(
-//                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
-//
-//        builder = new DefaultFormBuilder(layout);
-//        builder.append("Output Directory:", outputFolder, selectOutputFolder);
-//        builder.nextLine();
-//
-//        setLayout(new BorderLayout());
-//        add(builder.getPanel(), BorderLayout.CENTER);
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
deleted file mode 100644
index c900728..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
+++ /dev/null
@@ -1,81 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//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.JComponent;
-//import javax.swing.JLabel;
-//import javax.swing.JTextField;
-//import java.awt.BorderLayout;
-//
-//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;
-//    }
-//
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
index 96a195e..de4059e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
@@ -39,8 +39,8 @@ public class DataDomainTabbedView extends JTabbedPane
     ProjectController mediator;
     
     DataDomainGraphTab graphTab;
-    JScrollPane cgenView;
-    CgenTabController cgenTabController;
+    private JScrollPane cgenView;
+    private CgenTabController cgenTabController;
 
     /**
      * constructor

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index 9c8fcab..ddd6893 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -31,12 +31,12 @@ import javax.swing.*;
  *
  */
 public class DataMapTabbedView extends JTabbedPane{
-    ProjectController mediator;
-    private int lastSelectionIndex;
-    private DbImportView dbImportView1;
 
+    ProjectController mediator;
+    private DbImportView dbImportView;
+    private JScrollPane dbImportScrollPane;
     private CodeGeneratorController codeGeneratorController;
-    JScrollPane cgenView;
+    private JScrollPane cgenView;
 
     /**
      * constructor
@@ -59,37 +59,23 @@ public class DataMapTabbedView extends JTabbedPane{
         // note that those panels that have no internal scrollable tables
         // must be wrapped in a scroll pane
         JScrollPane dataMapScrollPane = new JScrollPane(new DataMapView(mediator));
-        dbImportView1 = new DbImportView(mediator);
-        JScrollPane dbImportScrollPane = new JScrollPane(dbImportView1);
+        dbImportView = new DbImportView(mediator);
+        dbImportScrollPane = new JScrollPane(dbImportView);
+        codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
+        cgenView = new JScrollPane(codeGeneratorController.getView());
         addTab("DataMap", dataMapScrollPane);
         addTab("DB Import", dbImportScrollPane);
-        addChangeListener(e -> {
-            lastSelectionIndex = getSelectedIndex();
-            updateTabs();
-        });
-    }
-
-    private void updateTabs() {
-        switch (lastSelectionIndex) {
-            case 1:
-                dbImportView1.initFromModel();
-            break;
-        }
-        JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
-        JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
-        this.codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
-        cgenView = new JScrollPane(codeGeneratorController.getView());
-        addTab("DataMap", dataMapView);
-        addTab("DbImport", dbImportView);
         addTab("Class Generation", cgenView);
 
         addChangeListener(tab -> {
             if(isCgenTabActive()) {
                 codeGeneratorController.startup(mediator.getCurrentDataMap());
+            } else if(isDbImportTabActive()) {
+                dbImportView.initFromModel();
             }
         });
         mediator.addDataMapDisplayListener(e -> {
-            if(isCgenTabActive()) {
+            if(isCgenTabActive() || isDbImportTabActive()) {
                 fireStateChanged();
             } else if(e.getSource() instanceof CgenTab){
                 setSelectedComponent(cgenView);
@@ -100,5 +86,9 @@ public class DataMapTabbedView extends JTabbedPane{
     private boolean isCgenTabActive() {
         return getSelectedComponent() == cgenView;
     }
+
+    private boolean isDbImportTabActive() {
+        return getSelectedComponent() == dbImportScrollPane;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 cfa6a57..7b98f4c 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
@@ -100,7 +100,11 @@ public class ClassesTabController extends CayenneController {
         int selectedCount = getParentController().getSelectedEntitiesSize()
                 + getParentController().getSelectedEmbeddablesSize()
                 + (getParentController().isDataMapSelected() ? 1 : 0);
-
+        if(selectedCount == 0) {
+            getParentController().enableGenerateButton(false);
+        } else {
+            getParentController().enableGenerateButton(true);
+        }
         if (selectedCount < getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(false);
         }
@@ -118,6 +122,11 @@ public class ClassesTabController extends CayenneController {
         if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
             getParentController().updateEntities();
+            if(view.getCheckAll().isSelected()) {
+                getParentController().enableGenerateButton(true);
+            } else {
+                getParentController().enableGenerateButton(false);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
index 87881f4..7485d25 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
@@ -28,16 +28,11 @@ public class ClientModeController extends StandardModeController {
     }
 
     protected GeneratorControllerPanel createView() {
-        this.view = new StandardModePanel();
+        this.view = new StandardModePanel(getParentController());
         return view;
     }
 
     @Override
-    public CgenConfiguration createConfiguration() {
-        return super.createConfiguration();
-    }
-
-    @Override
     public void updateConfiguration(CgenConfiguration cgenConfiguration) {
         cgenConfiguration.setClient(true);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 f4ab6bc..1274ecb 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
@@ -65,14 +65,13 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     public void startup(DataMap dataMap) {
         super.startup(dataMap);
         classesSelectedAction();
-        GeneratorController modeController = prevGeneratorController.get(dataMap) != null ? prevGeneratorController.get(dataMap) : generatorSelector.getStandartController();
-        CgenConfiguration cgenConfiguration = modeController.createConfiguration();
-        if(cgenConfiguration.isClient()) {
-            modeController = generatorSelector.getClientGeneratorController();
-        }
-        classesSelector.startup();
+        CgenConfiguration cgenConfiguration = createConfiguration();
+        GeneratorController modeController = prevGeneratorController.get(dataMap) != null ? prevGeneratorController.get(dataMap) : cgenConfiguration.isClient() ?
+                generatorSelector.getClientGeneratorController() : generatorSelector.getStandartController();
         prevGeneratorController.put(dataMap, modeController);
         generatorSelector.setSelectedController(modeController);
+        classesSelector.startup();
+        initFromModel = false;
     }
 
     private void initListeners(){
@@ -147,11 +146,13 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         }
 
         ((GeneratorTabPanel)generatorSelector.getView()).getClassesCount().setText(label);
-        projectController.setDirty(true);
+        if(!isInitFromModel()) {
+            getProjectController().setDirty(true);
+        }
     }
 
     public void generateAction() {
-        CgenConfiguration cgenConfiguration = generatorSelector.getConfiguration();
+        CgenConfiguration cgenConfiguration = createConfiguration();
         ClassGenerationAction generator = cgenConfiguration.isClient() ?
                 new ClientClassGenerationAction(cgenConfiguration) :
                 new ClassGenerationAction(cgenConfiguration);
@@ -173,4 +174,8 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     public ConcurrentMap<DataMap, GeneratorController> getPrevGeneratorController() {
         return prevGeneratorController;
     }
+
+    public void enableGenerateButton(boolean enable) {
+        ((GeneratorTabPanel)generatorSelector.getView()).getGenerateButton().setEnabled(enable);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 35ba15e..211384d 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
@@ -22,18 +22,27 @@ package org.apache.cayenne.modeler.editor.cgen;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CellRenderers;
+import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
 import javax.swing.*;
 import java.awt.*;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.*;
 import java.util.List;
 import java.util.function.Predicate;
+import java.util.prefs.Preferences;
+import java.util.stream.Collectors;
 
 /**
  * A base superclass of a top controller for the code generator. Defines all common model
@@ -56,6 +65,8 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     protected transient Object currentClass;
     protected ProjectController projectController;
 
+    protected boolean initFromModel;
+
     public CodeGeneratorControllerBase(CayenneController parent, ProjectController projectController) {
         super(parent);
         this.projectController = projectController;
@@ -66,6 +77,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     }
 
     public void startup(DataMap dataMap){
+        initFromModel = true;
         this.dataMap = dataMap;
         prepareClasses(dataMap);
     }
@@ -87,6 +99,65 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                 value == null ? new HashSet<>() : value);
     }
 
+    /**
+     * Creates a class generator for provided selections.
+     */
+    public CgenConfiguration createConfiguration() {
+        DataMap map = projectController.getCurrentDataMap();
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null){
+            addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities());
+            addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables());
+            return cgenConfiguration;
+        }
+
+        try {
+            cgenConfiguration = new CgenConfiguration();
+            cgenConfiguration.setDataMap(map);
+
+            Path basePath = Paths.get(ModelerUtil.initOutputFolder());
+
+            // no destination folder
+            if (basePath == null) {
+                JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+                return null;
+            }
+
+            // no such folder
+            if (!Files.exists(basePath)) {
+                Files.createDirectories(basePath);
+            }
+
+            // not a directory
+            if (!Files.isDirectory(basePath)) {
+                JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
+                return null;
+            }
+
+            cgenConfiguration.setRootPath(basePath);
+            Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
+            if (preferences != null) {
+                cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
+            }
+            addToSelectedEntities(map, map.getObjEntities()
+                    .stream()
+                    .map(Entity::getName)
+                    .collect(Collectors.toList()));
+            addToSelectedEmbeddables(map, map.getEmbeddables()
+                    .stream()
+                    .map(Embeddable::getClassName)
+                    .collect(Collectors.toList()));
+           getApplication().getMetaData().add(map, cgenConfiguration);
+           projectController.setDirty(true);
+        } catch (IOException exception) {
+            JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
+                    ". Select a different one.");
+            return null;
+        }
+
+        return cgenConfiguration;
+    }
+
     public List<Object> getClasses() {
         return classes;
     }
@@ -363,4 +434,15 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     public void setCurrentClass(Object currentClass) {
         this.currentClass = currentClass;
     }
+
+    public boolean isInitFromModel() {
+        return initFromModel;
+    }
+
+    public void setInitFromModel(boolean initFromModel) {
+        this.initFromModel = initFromModel;
+    }
+
+
+    public abstract void enableGenerateButton(boolean enabled);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 5626a38..247d747 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
@@ -46,7 +46,7 @@ public class CustomModeController extends GeneratorController {
 
     @Override
     protected GeneratorControllerPanel createView() {
-        this.view = new CustomModePanel(getApplication().getFrameController().getProjectController());
+        this.view = new CustomModePanel(getApplication().getFrameController().getProjectController(), getParentController());
         return view;
     }
 
@@ -91,11 +91,6 @@ public class CustomModeController extends GeneratorController {
         view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
-    @Override
-    public CgenConfiguration createConfiguration() {
-        return super.createConfiguration();
-    }
-
     private void initListeners(){
         view.getPairs().addActionListener(val -> {
             cgenConfiguration.setMakePairs(view.getPairs().isSelected());
@@ -109,27 +104,37 @@ public class CustomModeController extends GeneratorController {
                 cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
             }
             initForm(cgenConfiguration);
-            getParentController().getProjectController().setDirty(true);
+            if(!getParentController().isInitFromModel()) {
+                getParentController().getProjectController().setDirty(true);
+            }
         });
 
         view.getOverwrite().addActionListener(val -> {
             cgenConfiguration.setOverwrite(view.getOverwrite().isSelected());
-            getParentController().getProjectController().setDirty(true);
+            if(!getParentController().isInitFromModel()) {
+                getParentController().getProjectController().setDirty(true);
+            }
         });
 
         view.getCreatePropertyNames().addActionListener(val -> {
             cgenConfiguration.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
-            getParentController().getProjectController().setDirty(true);
+            if(!getParentController().isInitFromModel()) {
+                getParentController().getProjectController().setDirty(true);
+            }
         });
 
         view.getUsePackagePath().addActionListener(val -> {
             cgenConfiguration.setUsePkgPath(view.getUsePackagePath().isSelected());
-            getParentController().getProjectController().setDirty(true);
+            if(!getParentController().isInitFromModel()) {
+                getParentController().getProjectController().setDirty(true);
+            }
         });
 
         view.getPkProperties().addActionListener(val -> {
             cgenConfiguration.setCreatePKProperties(view.getPkProperties().isSelected());
-            getParentController().getProjectController().setDirty(true);
+            if(!getParentController().isInitFromModel()) {
+                getParentController().getProjectController().setDirty(true);
+            }
         });
     }
 
@@ -146,6 +151,7 @@ public class CustomModeController extends GeneratorController {
             ((CodeGeneratorControllerBase) parent).setSelected(true);
         }
         updateComboBoxes();
+        getParentController().setInitFromModel(false);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 a8c0183..468eec7 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
@@ -45,14 +45,16 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     private ActionLink manageTemplatesLink;
 
-    CustomModePanel(ProjectController projectController) {
-        super(projectController);
+    CustomModePanel(ProjectController projectController, CodeGeneratorControllerBase codeGeneratorControllerBase) {
+        super(projectController, codeGeneratorControllerBase);
         JComboBox<String> superclassField = new JComboBox<>();
         this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
+                if(!codeGeneratorControllerBase.isInitFromModel()) {
+                    projectController.setDirty(true);
+                }
             }
         };
 
@@ -61,7 +63,9 @@ public class CustomModePanel extends GeneratorControllerPanel {
             @Override
             protected void updateModel(String item) throws ValidationException {
                 getCgenByDataMap().setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
+                if(!codeGeneratorControllerBase.isInitFromModel()) {
+                    projectController.setDirty(true);
+                }
             }
         };
 
@@ -72,7 +76,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
         JTextField outputPatternField = new JTextField();
         this.outputPattern = new TextAdapter(outputPatternField) {
             protected void updateModel(String text) {
-
+                getCgenByDataMap().setOutputPattern(text);
+                if(!codeGeneratorControllerBase.isInitFromModel()) {
+                    projectController.setDirty(true);
+                }
             }
         };
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 31aec74..22187f5 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
@@ -23,11 +23,9 @@ import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.*;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CodeValidationUtil;
-import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
@@ -38,13 +36,7 @@ import org.apache.cayenne.validation.ValidationResult;
 
 import javax.swing.*;
 import java.io.File;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.function.Predicate;
-import java.util.prefs.Preferences;
-import java.util.stream.Collectors;
 
 /**
  * A mode-specific part of the code generation dialog.
@@ -75,70 +67,11 @@ public abstract class GeneratorController extends CayenneController {
 
     protected void initForm(CgenConfiguration cgenConfiguration) {
         this.cgenConfiguration = cgenConfiguration;
-        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(cgenConfiguration.getDir());
+        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(cgenConfiguration.buildPath().toString());
     }
 
     public abstract void updateConfiguration(CgenConfiguration cgenConfiguration);
 
-    /**
-     * Creates a class generator for provided selections.
-     */
-    public CgenConfiguration createConfiguration() {
-        DataMap map = getParentController().getProjectController().getCurrentDataMap();
-        CgenConfiguration cgenConfiguration = getParentController().projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
-        if(cgenConfiguration != null){
-            getParentController().addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities());
-            getParentController().addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables());
-            cgenConfiguration.setRootPath(Paths.get(ModelerUtil.initOutputFolder()));
-            return cgenConfiguration;
-        }
-
-        try {
-            cgenConfiguration = new CgenConfiguration();
-            cgenConfiguration.setDataMap(map);
-
-            Path basePath = Paths.get(ModelerUtil.initOutputFolder());
-
-            // no destination folder
-            if (basePath == null) {
-                JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
-                return null;
-            }
-
-            // no such folder
-            if (!Files.exists(basePath)) {
-                Files.createDirectories(basePath);
-            }
-
-            // not a directory
-            if (!Files.isDirectory(basePath)) {
-                JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
-                return null;
-            }
-
-            cgenConfiguration.setRootPath(basePath);
-            Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
-            if (preferences != null) {
-                cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
-            }
-            getParentController().addToSelectedEntities(map, map.getObjEntities()
-                    .stream()
-                    .map(Entity::getName)
-                    .collect(Collectors.toList()));
-            getParentController().addToSelectedEmbeddables(map, map.getEmbeddables()
-                    .stream()
-                    .map(Embeddable::getClassName)
-                    .collect(Collectors.toList()));
-            getParentController().projectController.getApplication().getMetaData().add(map, cgenConfiguration);
-        } catch (IOException exception) {
-            JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
-                    ". Select a different one.");
-            return null;
-        }
-
-        return cgenConfiguration;
-    }
-
     public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
         ValidationFailure embeddableFailure = validateEmbeddable(embeddable);
         if (embeddableFailure != null) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 21bd223..5771b89 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
@@ -26,8 +26,6 @@ import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.validation.ValidationException;
 
 import javax.swing.*;
-import java.util.ArrayList;
-import java.util.Collection;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
@@ -35,19 +33,19 @@ import java.util.Collection;
  */
 public class GeneratorControllerPanel extends JPanel {
 
-    protected Collection<StandardPanelComponent> dataMapLines;
     protected TextAdapter outputFolder;
     protected JButton selectOutputFolder;
     protected ProjectController projectController;
 
-    public GeneratorControllerPanel(ProjectController projectController) {
-        this.dataMapLines = new ArrayList<>();
+    public GeneratorControllerPanel(ProjectController projectController, CodeGeneratorControllerBase codeGeneratorControllerBase) {
         this.projectController = projectController;
         this.outputFolder = new TextAdapter(new JTextField()) {
             @Override
             protected void updateModel(String text) throws ValidationException {
                 getCgenByDataMap().setRelPath(text);
-                projectController.setDirty(true);
+                if(!codeGeneratorControllerBase.isInitFromModel()) {
+                    projectController.setDirty(true);
+                }
             }
         };
         this.selectOutputFolder = new JButton("Select");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 16aebae..6af5436 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
@@ -77,7 +77,7 @@ public class GeneratorTabController extends CayenneController {
         view.getGenerationMode().addActionListener(action -> {
             String name = (String)view.getGenerationMode().getSelectedItem();
             GeneratorController modeController = getGeneratorController();
-            CgenConfiguration cgenConfiguration = modeController.createConfiguration();
+            CgenConfiguration cgenConfiguration = getParentController().createConfiguration();
             modeController.updateConfiguration(cgenConfiguration);
             controllers.get(name).initForm(cgenConfiguration);
             ((CodeGeneratorController)getParentController()).getPrevGeneratorController().put(cgenConfiguration.getDataMap(), modeController);
@@ -104,9 +104,4 @@ public class GeneratorTabController extends CayenneController {
     GeneratorController getClientGeneratorController() {
         return controllers.get(CLIENT_OBJECTS_MODE);
     }
-
-    public CgenConfiguration getConfiguration() {
-        GeneratorController modeController = getGeneratorController();
-        return (modeController != null) ? modeController.createConfiguration() : null;
-    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
index 9cfd542..08f1dee 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -45,6 +45,7 @@ public class GeneratorTabPanel extends JPanel {
         this.generateButton = new JButton("Generate");
         generateButton.setIcon(ModelerUtil.buildIcon("icon-gen_java.png"));
         generateButton.setPreferredSize(new Dimension(180, 30));
+        generateButton.setEnabled(false);
         this.classesCount = new JLabel("No classes selected");
         classesCount.setFont(classesCount.getFont().deriveFont(10f));
         JPanel messages = new JPanel(new BorderLayout());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
index 69cb19f..5b34efc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -34,7 +34,7 @@ public class StandardModeController extends GeneratorController {
     }
 
     protected GeneratorControllerPanel createView() {
-        this.view = new StandardModePanel();
+        this.view = new StandardModePanel(getParentController());
         return view;
     }
 
@@ -43,13 +43,9 @@ public class StandardModeController extends GeneratorController {
     }
 
     @Override
-    public CgenConfiguration createConfiguration() {
-        return super.createConfiguration();
-    }
-
-    @Override
     protected void initForm(CgenConfiguration cgenConfiguration) {
         super.initForm(cgenConfiguration);
+        getParentController().setInitFromModel(false);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
index 0ddf1e2..2b755e7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
@@ -27,8 +27,8 @@ import java.awt.*;
 
 public class StandardModePanel extends GeneratorControllerPanel {
 
-    public StandardModePanel() {
-        super(Application.getInstance().getFrameController().getProjectController());
+    public StandardModePanel(CodeGeneratorControllerBase codeGeneratorControllerBase) {
+        super(Application.getInstance().getFrameController().getProjectController(), codeGeneratorControllerBase);
         FormLayout layout = new FormLayout(
                 "right:88dlu, 1dlu, fill:300:grow, 1dlu, left:100dlu, 100dlu", "");
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 8170548..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
+++ /dev/null
@@ -1,63 +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;
-
-    public StandardPanelComponent() {
-        super();
-
-        FormLayout layout = new FormLayout(
-                "right:77dlu, 3dlu, fill:100:grow, 3dlu", "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.nextLine();
-
-        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;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
index cf9b27a8..637cc12 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
@@ -1,3 +1,22 @@
+/*****************************************************************
+ *   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.domain;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
index 87a7cc4..0c5288e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
@@ -1,3 +1,22 @@
+/*****************************************************************
+ *   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.domain;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
index daeb677..0f82abf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
@@ -1,3 +1,22 @@
+/*****************************************************************
+ *   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.domain;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
@@ -19,7 +38,6 @@ import org.slf4j.LoggerFactory;
 import javax.swing.*;
 import java.awt.event.ItemEvent;
 import java.io.IOException;
-import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -115,14 +133,6 @@ public class CgenTabController {
                 if(cgenConfiguration == null) {
                     cgenConfiguration = createConfiguration(dataMap);
                 }
-                if(cgenConfiguration.getRootPath() == null) {
-                    URL url = projectController.getProject().getConfigurationResource().getURL();
-                    Path resourcePath = Paths.get(url.getPath());
-                    if(Files.isRegularFile(resourcePath)) {
-                        resourcePath = resourcePath.getParent();
-                    }
-                    cgenConfiguration.setRootPath(resourcePath);
-                }
                 ClassGenerationAction classGenerationAction = cgenConfiguration.isClient() ? new ClientClassGenerationAction(cgenConfiguration) :
                         new ClassGenerationAction(cgenConfiguration);
                 classGenerationAction.prepareArtifacts();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
index 90c6d19..ab1e01e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
@@ -215,6 +215,9 @@ public final class ModelerUtil {
         child.setLocation(x, y);
     }
 
+    /**
+     * @since 4.1
+     */
     public static String initOutputFolder() {
         String path;
         if (System.getProperty("cayenne.cgen.destdir") != null) {


[29/32] cayenne git commit: Selection bug fix

Posted by nt...@apache.org.
Selection bug fix


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

Branch: refs/heads/master
Commit: 5128e66e36433839ec288296b8cb22d80cb90845
Parents: c19f235
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Nov 14 16:07:07 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Nov 14 16:07:07 2018 +0300

----------------------------------------------------------------------
 .../apache/cayenne/gen/CgenConfiguration.java   | 34 +++++---
 .../dialog/db/load/ModelerDbImportAction.java   |  3 +
 .../editor/cgen/CodeGeneratorController.java    | 75 ++++++++++++++--
 .../cgen/CodeGeneratorControllerBase.java       | 91 ++++++++++++--------
 4 files changed, 150 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
index 1277baa..e03598e 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
@@ -30,9 +30,7 @@ import org.apache.cayenne.util.XMLSerializable;
 import java.io.Serializable;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,9 +43,9 @@ import java.util.stream.Collectors;
 public class CgenConfiguration implements Serializable, XMLSerializable {
 
     private Collection<Artifact> artifacts;
-    private Collection<String> entityArtifacts;
+    private Set<String> entityArtifacts;
     private Collection<String> excludeEntityArtifacts;
-    private Collection<String> embeddableArtifacts;
+    private Set<String> embeddableArtifacts;
     private Collection<String> excludeEmbeddableArtifacts;
 
     private String superPkg;
@@ -87,9 +85,9 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         setArtifactsGenerationMode("entity");
 
         this.artifacts = new ArrayList<>();
-        this.entityArtifacts = new ArrayList<>();
+        this.entityArtifacts = new HashSet<>();
         this.excludeEntityArtifacts = new ArrayList<>();
-        this.embeddableArtifacts = new ArrayList<>();
+        this.embeddableArtifacts = new HashSet<>();
         this.excludeEmbeddableArtifacts = new ArrayList<>();
         this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
@@ -286,11 +284,11 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         return artifacts;
     }
 
-    public Collection<String> getEntities() {
+    public Set<String> getEntities() {
         return entityArtifacts;
     }
 
-    public Collection<String> getEmbeddables() {
+    public Set<String> getEmbeddables() {
         return embeddableArtifacts;
     }
 
@@ -310,8 +308,10 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
 		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : relPath;
 	}
 
-    public void loadEntity(String name) {
-        entityArtifacts.add(name);
+    public void loadEntity(ObjEntity entity) {
+        if(!entity.isGeneric()) {
+            entityArtifacts.add(entity.getName());
+        }
     }
 
     public void loadEmbeddable(String name) {
@@ -349,7 +349,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
 				.stream()
 				.filter(entity -> !excludeEntityArtifacts.contains(entity.getName()))
 				.map(ObjEntity::getName)
-				.collect(Collectors.toList());
+				.collect(Collectors.toSet());
 	}
 
 	public void resolveExcludeEmbeddables() {
@@ -357,9 +357,17 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
 				.stream()
 				.filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName()))
 				.map(Embeddable::getClassName)
-				.collect(Collectors.toList());
+				.collect(Collectors.toSet());
 	}
 
+	public Collection<String> getExcludeEntityArtifacts() {
+        return excludeEntityArtifacts;
+    }
+
+    public Collection<String> getExcludeEmbeddableArtifacts() {
+        return excludeEmbeddableArtifacts;
+    }
+
     @Override
     public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
         encoder.start("cgen")

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
index 0c5c729..e0f01e3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.dialog.db.load;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptorLoader;
 import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
@@ -29,6 +30,7 @@ import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
 import org.apache.cayenne.dbsync.reverse.dbimport.DefaultDbImportAction;
@@ -73,6 +75,7 @@ public class ModelerDbImportAction extends DefaultDbImportAction {
 
     public void commit() throws Exception {
         commit(config, sourceDataMap);
+        Application.getInstance().getFrameController().getProjectController().fireDataMapEvent(new DataMapEvent(this, targetMap));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/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 0785820..9db6135 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
@@ -19,20 +19,27 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.configuration.event.DataMapListener;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.event.EmbeddableEvent;
+import org.apache.cayenne.map.event.EmbeddableListener;
+import org.apache.cayenne.map.event.EntityEvent;
+import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
+import org.apache.cayenne.modeler.dialog.db.load.ModelerDbImportAction;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.JOptionPane;
-import java.awt.Component;
-import java.util.Collections;
+import javax.swing.*;
+import java.awt.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Predicate;
@@ -41,7 +48,7 @@ import java.util.function.Predicate;
  * @since 4.1
  * A controller for the class generator dialog.
  */
-public class CodeGeneratorController extends CodeGeneratorControllerBase {
+public class CodeGeneratorController extends CodeGeneratorControllerBase implements ObjEntityListener, EmbeddableListener, DataMapListener {
     /**
      * Logger to print stack traces
      */
@@ -86,8 +93,9 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     }
 
     private void initListeners(){
-        projectController.addObjEntityDisplayListener(e -> super.addToSelectedEntities(e.getEntity().getDataMap(), Collections.singleton(e.getEntity().getName())));
-        projectController.addEmbeddableDisplayListener(e -> super.addToSelectedEmbeddables(e.getEmbeddable().getDataMap(), Collections.singleton(e.getEmbeddable().getClassName())));
+        projectController.addObjEntityListener(this);
+        projectController.addEmbeddableListener(this);
+        projectController.addDataMapListener(this);
     }
 
     @Override
@@ -189,4 +197,59 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     public void enableGenerateButton(boolean enable) {
         ((GeneratorTabPanel)generatorSelector.getView()).getGenerateButton().setEnabled(enable);
     }
+
+    @Override
+    public void objEntityChanged(EntityEvent e) {}
+
+    @Override
+    public void objEntityAdded(EntityEvent e) {
+        super.addEntity(e.getEntity().getDataMap(), (ObjEntity) e.getEntity());
+    }
+
+    @Override
+    public void objEntityRemoved(EntityEvent e) {
+        super.removeFromSelectedEntities((ObjEntity) e.getEntity());
+        DataMap map = e.getEntity().getDataMap();
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null) {
+            cgenConfiguration.getEntities().remove(e.getEntity().getName());
+        }
+    }
+
+    @Override
+    public void embeddableChanged(EmbeddableEvent e, DataMap map) {}
+
+    @Override
+    public void embeddableAdded(EmbeddableEvent e, DataMap map) {
+        super.addEmbeddable(e.getEmbeddable().getDataMap(), e.getEmbeddable());
+    }
+
+    @Override
+    public void embeddableRemoved(EmbeddableEvent e, DataMap map) {
+        super.removeFromSelectedEmbeddables(e.getEmbeddable());
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null) {
+            cgenConfiguration.getEmbeddables().remove(e.getEmbeddable().getClassName());
+        }
+    }
+
+    @Override
+    public void dataMapChanged(DataMapEvent e) {
+        if(e.getSource() instanceof ModelerDbImportAction) {
+            CgenConfiguration cgenConfiguration = getCurrentConfiguration();
+            if(cgenConfiguration != null) {
+                for(ObjEntity objEntity : dataMap.getObjEntities()) {
+                    if(!cgenConfiguration.getExcludeEntityArtifacts().contains(objEntity.getName())) {
+                        addEntity(cgenConfiguration.getDataMap(), objEntity);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void dataMapAdded(DataMapEvent e) {}
+
+    @Override
+    public void dataMapRemoved(DataMapEvent e) {}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5128e66e/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 21a3736..1c41cb8 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
@@ -32,20 +32,13 @@ import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.Icon;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
@@ -114,8 +107,8 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         DataMap map = projectController.getCurrentDataMap();
         CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
         if(cgenConfiguration != null){
-            addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities());
-            addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables());
+            addToSelectedEntities(cgenConfiguration.getEntities());
+            addToSelectedEmbeddables(cgenConfiguration.getEmbeddables());
             cgenConfiguration.setForce(true);
             return cgenConfiguration;
         }
@@ -149,11 +142,11 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
             if (preferences != null) {
                 cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
             }
-            addToSelectedEntities(map, map.getObjEntities()
+            addToSelectedEntities(map.getObjEntities()
                     .stream()
                     .map(Entity::getName)
                     .collect(Collectors.toList()));
-            addToSelectedEmbeddables(map, map.getEmbeddables()
+            addToSelectedEmbeddables(map.getEmbeddables()
                     .stream()
                     .map(Embeddable::getClassName)
                     .collect(Collectors.toList()));
@@ -247,25 +240,28 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         return modified;
     }
 
-    public List<Embeddable> getSelectedEmbeddables() {
+    private List<Embeddable> getSelectedEmbeddables() {
         List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
         for (Object classObj : classes) {
-            if (classObj instanceof Embeddable
-                    && selectedEmbeddables.contains(((Embeddable) classObj)
-                            .getClassName())) {
-                selected.add((Embeddable) classObj);
+            if(classObj instanceof Embeddable) {
+                String name = ((Embeddable) classObj).getClassName();
+                if(selectedEmbeddables.contains(name)) {
+                    selected.add((Embeddable) classObj);
+                }
             }
         }
 
         return selected;
     }
 
-    public List<ObjEntity> getSelectedEntities() {
+    private List<ObjEntity> getSelectedEntities() {
         List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
         for (Object classObj : classes) {
-            if (classObj instanceof ObjEntity
-                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
-                selected.add(((ObjEntity) classObj));
+            if(classObj instanceof ObjEntity) {
+                String name = ((ObjEntity) classObj).getName();
+                if(selectedEntities.contains(name)) {
+                    selected.add(((ObjEntity) classObj));
+                }
             }
         }
 
@@ -392,22 +388,23 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         updateEmbeddables();
     }
 
-    public void updateEntities() {
+    CgenConfiguration getCurrentConfiguration() {
         DataMap map = getProjectController().getCurrentDataMap();
-        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        return projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+    }
+
+    private void updateEntities() {
+        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
         if(cgenConfiguration != null) {
             cgenConfiguration.getEntities().clear();
             for(ObjEntity entity: getSelectedEntities()) {
-                if(!entity.isGeneric()) {
-                    cgenConfiguration.loadEntity(entity.getName());
-                }
+                cgenConfiguration.loadEntity(entity);
             }
         }
     }
 
-    public void updateEmbeddables() {
-        DataMap map = getProjectController().getCurrentDataMap();
-        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+    private void updateEmbeddables() {
+        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
         if(cgenConfiguration != null) {
             cgenConfiguration.getEmbeddables().clear();
             for(Embeddable embeddable : getSelectedEmbeddables()) {
@@ -416,18 +413,34 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         }
     }
 
-    void addToSelectedEntities(DataMap dataMap, Collection<String> entities) {
-        prepareClasses(dataMap);
+    private void addToSelectedEntities(Collection<String> entities) {
         selectedEntities.addAll(entities);
         updateEntities();
     }
 
-    void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
+    void addEntity(DataMap dataMap, ObjEntity objEntity) {
         prepareClasses(dataMap);
+        selectedEntities.add(objEntity.getName());
+        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
+        if(cgenConfiguration != null) {
+            cgenConfiguration.loadEntity(objEntity);
+        }
+    }
+
+    private void addToSelectedEmbeddables(Collection<String> embeddables) {
         selectedEmbeddables.addAll(embeddables);
         updateEmbeddables();
     }
 
+    void addEmbeddable(DataMap dataMap, Embeddable embeddable) {
+        prepareClasses(dataMap);
+        selectedEmbeddables.add(embeddable.getClassName());
+        CgenConfiguration cgenConfiguration = getCurrentConfiguration();
+        if(cgenConfiguration != null) {
+            cgenConfiguration.loadEmbeddable(embeddable.getClassName());
+        }
+    }
+
     public int getSelectedEntitiesSize() {
         return selectedEntities != null ? selectedEntities.size() : 0;
     }
@@ -466,4 +479,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
 
     public abstract void enableGenerateButton(boolean enabled);
+
+    void removeFromSelectedEntities(ObjEntity objEntity) {
+        initCollectionsForSelection(objEntity.getDataMap());
+        selectedEntities.remove(objEntity.getName());
+    }
+
+    void removeFromSelectedEmbeddables(Embeddable embeddable) {
+        initCollectionsForSelection(embeddable.getDataMap());
+        selectedEmbeddables.remove(embeddable.getClassName());
+    }
 }


[10/32] cayenne git commit: Update cgen dialog

Posted by nt...@apache.org.
Update cgen dialog


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

Branch: refs/heads/master
Commit: aa22c93c536a6ee82e1bdd4e364113473f77135f
Parents: 93da6be
Author: Arseni Bulatski <an...@gmail.com>
Authored: Fri Jul 6 15:59:27 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:47:32 2018 +0300

----------------------------------------------------------------------
 .../dialog/codegen/ClassesTabController.java     |  9 ++++++++-
 .../modeler/dialog/codegen/ClassesTabPanel.java  | 13 ++++++-------
 .../codegen/CodeGeneratorControllerBase.java     | 10 +++-------
 .../dialog/codegen/CodeGeneratorDialog.java      | 15 ++-------------
 .../dialog/codegen/CustomModeController.java     | 17 ++++-------------
 .../modeler/dialog/codegen/CustomModePanel.java  |  7 +++++++
 .../dialog/codegen/GeneratorController.java      | 19 +++----------------
 .../dialog/codegen/GeneratorTabController.java   |  2 +-
 .../dialog/codegen/StandardModeController.java   |  2 +-
 .../dialog/codegen/StandardModePanel.java        |  2 +-
 10 files changed, 36 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
index acd94d7..3e61094 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
@@ -26,6 +26,13 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JTable;
@@ -97,7 +104,7 @@ public class ClassesTabController extends CayenneController {
                 Boolean.TRUE);
 
         tableBuilder.addColumn(
-                "Class",
+                "Entity",
                 "parent.getItemName(#item)",
                 JLabel.class,
                 false,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
index f1a8132..3c6e53d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
@@ -22,13 +22,12 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.map.DataMap;
 
 import javax.swing.BoxLayout;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.UIManager;
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import java.awt.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import javax.swing.border.EmptyBorder;
 import java.awt.BorderLayout;
 import java.awt.Component;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
index 5d1201d..6e6084c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
@@ -27,14 +27,10 @@ import org.apache.cayenne.modeler.util.CellRenderers;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.Icon;
-import javax.swing.JLabel;
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
 import java.util.List;
-import java.util.Set;
 import java.util.function.Predicate;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
index 7ed60e2..c6d6e69 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
@@ -22,19 +22,8 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.swing.components.TopBorder;
 
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 /**
  */

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
index 3ec4778..4f48854 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
@@ -28,22 +28,13 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.util.Util;
 
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
+import java.util.*;
 import java.util.List;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
 import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
 
-import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
-import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
-import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
+import static org.apache.cayenne.modeler.CodeTemplateManager.*;
 import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
index 7dd2e79..73f89f7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
@@ -29,6 +29,8 @@ import javax.swing.JPanel;
 import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
@@ -56,6 +58,11 @@ public class CustomModePanel extends GeneratorControllerPanel {
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
+        pairs.addChangeListener(e -> {
+            superclassTemplate.setEnabled(pairs.isSelected());
+            overwrite.setEnabled(!pairs.isSelected());
+        });
+
         // assemble
         FormLayout layout = new FormLayout(
                 "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
index 082a08f..c695684 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorController.java
@@ -22,13 +22,7 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.*;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
@@ -42,16 +36,9 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.JTextField;
+import javax.swing.*;
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
index 5d7594f..4e681ae 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/GeneratorTabController.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.pref.PreferenceDetail;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
 
-import java.awt.Component;
+import java.awt.*;
 import java.awt.Dimension;
 import java.util.Collection;
 import java.util.HashMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
index 1c3a27a..f11ade8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModeController.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
-import java.awt.Component;
+import java.awt.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.TreeMap;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/aa22c93c/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
index cbb3f35..1f10ffb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.dialog.codegen;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
-import java.awt.BorderLayout;
+import java.awt.*;
 
 public class StandardModePanel extends GeneratorControllerPanel {
 


[05/32] cayenne git commit: Cgen. Refactoring, changes

Posted by nt...@apache.org.
Cgen. Refactoring, changes


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

Branch: refs/heads/master
Commit: 0e19c96147992fcbd10d285d13d3b029cc013f7d
Parents: b85a090
Author: Arseni Bulatski <an...@gmail.com>
Authored: Thu Jun 21 16:55:07 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:41:33 2018 +0300

----------------------------------------------------------------------
 .../cayenne/gen/ClassGenerationAction.java      | 110 +++++----
 .../org/apache/cayenne/gen/DataMapArtifact.java |   1 -
 .../cayenne/gen/xml/CgenConfigHandler.java      |  55 ++++-
 .../apache/cayenne/gen/xml/CgenExtension.java   |  21 ++
 .../cayenne/gen/xml/CgenLoaderDelegate.java     |  21 ++
 .../cayenne/gen/xml/CgenSaverDelegate.java      |  21 ++
 .../cayenne/gen/xml/EmbeddableHandler.java      |  21 ++
 .../cayenne/gen/xml/ObjEntityHandler.java       |  21 ++
 .../cayenne/modeler/CodeTemplateManager.java    |  44 +++-
 .../editor/cgen/ClassesTabController.java       |   9 +-
 .../modeler/editor/cgen/ClassesTabPanel.java    |  17 +-
 .../editor/cgen/CodeGeneratorController.java    |   2 +-
 .../cgen/CodeGeneratorControllerBase.java       |  26 +-
 .../editor/cgen/CustomModeController.java       | 188 ++++-----------
 .../modeler/editor/cgen/CustomModePanel.java    | 238 ++++++++++++-------
 .../editor/cgen/CustomPreferencesUpdater.java   | 193 ---------------
 .../editor/cgen/GeneratorController.java        |  29 +--
 .../editor/cgen/GeneratorControllerPanel.java   |  34 ++-
 .../editor/cgen/GeneratorTabController.java     |   5 -
 .../modeler/editor/cgen/GeneratorTabPanel.java  |   1 +
 .../cayenne/modeler/util/ComboBoxAdapter.java   |  72 ++++++
 21 files changed, 575 insertions(+), 554 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 35e34cf..f56f81e 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
@@ -22,7 +22,10 @@ package org.apache.cayenne.gen;
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.gen.xml.CgenExtension;
-import org.apache.cayenne.map.*;
+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.util.XMLEncoder;
 import org.apache.cayenne.util.XMLSerializable;
 import org.apache.velocity.Template;
@@ -102,6 +105,9 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
 		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
 
+		this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
+		this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+
 		this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
 
 		this.artifacts = new ArrayList<>();
@@ -218,6 +224,11 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 */
 	public void execute() throws Exception {
 
+		resetArtifacts();
+		addAllEntities();
+		addAllEmbeddables();
+		addQueries(dataMap.getQueryDescriptors());
+
 		validateAttributes();
 
 		try {
@@ -255,26 +266,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		}
 	}
 
-	public void prepareArtifacts(){
-//		resetArtifacts();
-		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);
@@ -577,20 +568,36 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		}
 	}
 
-	public void loadEntity(String name) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
+    private void addAllEntities() {
+		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
 				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			entityArtifacts.add(name);
+            entityArtifacts.forEach(val ->
+                artifacts.add(new EntityArtifact(dataMap.getObjEntity(val))));
 		}
 	}
 
-	public void loadEmbeddable(String name) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
+    private void addAllEmbeddables() {
+		if(artifactsGenerationMode == ArtifactsGenerationMode.ENTITY
 				|| artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			embeddableArtifacts.add(name);
+		    embeddableArtifacts.forEach(val ->
+                    artifacts.add(new EmbeddableArtifact(dataMap.getEmbeddable(val))));
 		}
 	}
 
+    /**
+     * @since 4.1
+     */
+	public void loadEntity(String name) {
+		entityArtifacts.add(name);
+	}
+
+    /**
+     * @since 4.1
+     */
+	public void loadEmbeddable(String name) {
+		embeddableArtifacts.add(name);
+	}
+
 	/**
 	 * Sets an optional shared VelocityContext. Useful with tools like VPP that
 	 * can set custom values in the context, not known to Cayenne.
@@ -625,21 +632,23 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		}
 	}
 
-	/**
-	 * @since 4.1
-	 */
-	public boolean isCreatePKProperties() {
-		return createPKProperties;
-	}
+    /**
+     * @since 4.1
+     */
+    public boolean isCreatePKProperties() {
+        return createPKProperties;
+    }
 
-	/**
-	 * @since 4.1
-	 */
-	public void setCreatePKProperties(boolean createPKProperties) {
-		this.createPKProperties = createPKProperties;
-	}
+    /**
+     * @since 4.1
+     */
+    public void setCreatePKProperties(boolean createPKProperties) {
+        this.createPKProperties = createPKProperties;
+    }
 
-	public Collection<EntityArtifact> getEntityArtifacts() {
+    private Collection<EntityArtifact> getEntityArtifacts() {
+		resetArtifacts();
+		addAllEntities();
 		Collection<EntityArtifact> entityArtifacts = new ArrayList<>();
 		for(Artifact artifact : artifacts){
 			if(artifact instanceof EntityArtifact){
@@ -649,7 +658,9 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return entityArtifacts;
 	}
 
-	public Collection<EmbeddableArtifact> getEmbeddableArtifacts() {
+    private Collection<EmbeddableArtifact> getEmbeddableArtifacts() {
+		resetArtifacts();
+		addAllEmbeddables();
 		Collection<EmbeddableArtifact> embeddableArtifacts = new ArrayList<>();
 		for(Artifact artifact : artifacts){
 			if(artifact instanceof EmbeddableArtifact){
@@ -699,7 +710,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return superPkg;
 	}
 
-	public void resetArtifacts(){
+	private void resetArtifacts(){
 		this.artifacts = new ArrayList<>();
 	}
 
@@ -735,6 +746,19 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		return embeddableSuperTemplate;
 	}
 
+	public String getQueryTemplate() {
+	    return queryTemplate;
+    }
+
+    public String getQuerySuperTemplate() {
+        return querySuperTemplate;
+    }
+
+    public void resetCollections(){
+		this.embeddableArtifacts = new ArrayList<>();
+		this.entityArtifacts = new ArrayList<>();
+	}
+
 	@Override
 	public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
 		encoder.start("cgen")
@@ -743,6 +767,8 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 				.nested(this.getEmbeddableArtifacts(), delegate)
 				.simpleTag("outputDirectory", this.destDir.getAbsolutePath())
 				.simpleTag("generationMode", this.artifactsGenerationMode.getLabel())
+                .simpleTag("dataMapTemplate", this.queryTemplate)
+                .simpleTag("dataMapSuperclassTemplate", this.querySuperTemplate)
 				.simpleTag("subclassTemplate", this.template)
 				.simpleTag("superclassTemplate", this.superTemplate)
 				.simpleTag("embeddableTemplate", this.embeddableTemplate)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 54a7426..937f451 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,5 +137,4 @@ public class DataMapArtifact implements Artifact {
     public DataMap getDataMap() {
     	return dataMap;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 667a4a6..f77f1f1 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
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
@@ -9,6 +27,9 @@ import org.xml.sax.SAXException;
 
 import java.io.File;
 
+/**
+ * @since 4.1
+ */
 public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
 
     public static final String CONFIG_TAG = "cgen";
@@ -28,6 +49,8 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
     private static final String ENCODING_TAG = "encoding";
     private static final String EMBEDDABLE_TEMPLATE_TAG = "embeddableTemplate";
     private static final String EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG = "embeddableSuperclassTemplate";
+    private static final String DATAMAP_TEMPLATE_TAG = "dataMapTemplate";
+    private static final String DATAMAP_SUPERCLASS_TEMPLATE_TAG = "dataMapSuperclassTemplate";
 
     public static final String TRUE = "true";
 
@@ -108,7 +131,12 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case EMBEDDABLE_SUPERCLASS_TEMPLATE_TAG:
                 createEmbeddableSuperclassTemplate(data);
                 break;
-
+            case DATAMAP_TEMPLATE_TAG:
+                createDataMapTemplate(data);
+                break;
+            case DATAMAP_SUPERCLASS_TEMPLATE_TAG:
+                createDataMapSuperclassTemplate(data);
+                break;
         }
     }
 
@@ -152,7 +180,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    public void createEmbeddableTemplate(String template) {
+    private void createEmbeddableTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
@@ -162,7 +190,7 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
-    public void createEmbeddableSuperclassTemplate(String template) {
+    private void createEmbeddableSuperclassTemplate(String template) {
         if(template.trim().length() == 0) {
             return;
         }
@@ -258,11 +286,30 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
+    private void createDataMapTemplate(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setQueryTemplate(data);
+        }
+    }
+
+    private void createDataMapSuperclassTemplate(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            configuration.setQuerySuperTemplate(data);
+        }
+    }
+
     private void createConfig() {
         configuration = new ClassGenerationAction();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
-            configuration.prepareArtifacts();
             CgenConfigHandler.this.metaData.add(dataMap, configuration);
         });
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 e98eca9..074a532 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
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
@@ -9,6 +27,9 @@ import org.apache.cayenne.project.extension.LoaderDelegate;
 import org.apache.cayenne.project.extension.ProjectExtension;
 import org.apache.cayenne.project.extension.SaverDelegate;
 
+/**
+ * @since 4.1
+ */
 public class CgenExtension implements ProjectExtension {
 
     public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/cgen";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 8b3728f..b2f1cba 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
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
@@ -5,6 +23,9 @@ import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
 
 import org.apache.cayenne.project.extension.LoaderDelegate;
 
+/**
+ * @since 4.1
+ */
 public class CgenLoaderDelegate implements LoaderDelegate {
 
     private DataChannelMetaData metaData;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 d4d4b8f..8d25cf1 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,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
@@ -5,6 +23,9 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.project.extension.BaseSaverDelegate;
 
+/**
+ * @since 4.1
+ */
 public class CgenSaverDelegate extends BaseSaverDelegate{
 
     private DataChannelMetaData metaData;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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
index 4e11a6f..4772348 100644
--- 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
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
@@ -5,6 +23,9 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
+/**
+ * @since 4.1
+ */
 public class EmbeddableHandler extends NamespaceAwareNestedTagHandler {
 
     private static final String EMBEDDABLE_TAG = "embeddable";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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
index f4ebc48..593a002 100644
--- 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
@@ -1,3 +1,21 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
@@ -5,6 +23,9 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
+/**
+ * @since 4.1
+ */
 public class ObjEntityHandler extends NamespaceAwareNestedTagHandler {
 
     private static final String OBJENTITY_TAG = "objEntity";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 b56851a..98f0dc9 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,19 +43,26 @@ 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";
+	private static final String STANDART_EMBEDDABLE_SUPERCLASS = "Standart Embeddable Superclass";
+	private static final String STANDART_EMBEDDABLE_SUBCLASS = "Standart Embeddable Subclass";
+	private static final String SINGLE_EMBEDDABLE_CLASS = "Single Embeddable class";
+
+	private static final String STANDART_DATAMAP_SUPERCLASS = "Standart DataMap Superclass";
+	private static final String STANDART_DATAMAP_SUBCLASS = "Standart DataMap Subclass";
+	private static final String SINGLE_DATAMAP_CLASS = "Single DataMap class";
 
 	public static final String NODE_NAME = "codeTemplateManager";
 
-	protected List<String> standardSubclassTemplates;
-	protected List<String> standardSuperclassTemplates;
-	protected Map<String, String> customTemplates;
-	protected Map<String, String> standardTemplates;
+	private List<String> standardSubclassTemplates;
+	private List<String> standardSuperclassTemplates;
+	private Map<String, String> customTemplates;
+	private Map<String, String> standardTemplates;
+
+	private List<String> standartEmbeddableTemplates;
+	private List<String> standartEmbeddableSuperclassTemplates;
 
-	protected List<String> standartEmbeddableTemplates;
-	protected List<String> standartEmbeddableSuperclassTemplates;
+	private List<String> standartDataMapTemplates;
+	private List<String> standartDataMapSuperclassTemplates;
 
 	private Map<String, String> reverseStandartTemplates;
 
@@ -83,6 +90,13 @@ public class CodeTemplateManager {
 		standartEmbeddableSuperclassTemplates = new ArrayList<>();
 		standartEmbeddableSuperclassTemplates.add(STANDART_EMBEDDABLE_SUPERCLASS);
 
+		standartDataMapTemplates = new ArrayList<>();
+		standartDataMapTemplates.add(STANDART_DATAMAP_SUBCLASS);
+		standartDataMapTemplates.add(SINGLE_DATAMAP_CLASS);
+
+		standartDataMapSuperclassTemplates = new ArrayList<>();
+		standartDataMapSuperclassTemplates.add(STANDART_DATAMAP_SUPERCLASS);
+
 		updateCustomTemplates(getTemplatePreferences(application));
 
 		standardTemplates = new HashMap<>();
@@ -96,6 +110,10 @@ public class CodeTemplateManager {
 		standardTemplates.put(STANDART_EMBEDDABLE_SUBCLASS, ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE);
 		standardTemplates.put(SINGLE_EMBEDDABLE_CLASS, ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
 
+		standardTemplates.put(STANDART_DATAMAP_SUBCLASS, ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
+		standardTemplates.put(SINGLE_DATAMAP_CLASS, ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+		standardTemplates.put(STANDART_DATAMAP_SUPERCLASS, ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE);
+
 		reverseStandartTemplates = new HashMap<>();
 		reverseStandartTemplates.put(ClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_SERVER_SUBCLASS);
 		reverseStandartTemplates.put(ClientClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_CLIENT_SUBCLASS);
@@ -106,6 +124,10 @@ public class CodeTemplateManager {
 		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);
+
+		reverseStandartTemplates.put(ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE, STANDART_DATAMAP_SUBCLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE, SINGLE_DATAMAP_CLASS);
+		reverseStandartTemplates.put(ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE, STANDART_DATAMAP_SUPERCLASS);
 	}
 
 	/**
@@ -166,4 +188,8 @@ public class CodeTemplateManager {
 	public List<String> getStandartEmbeddableSuperclassTemplates() {
 		return standartEmbeddableSuperclassTemplates;
 	}
+
+	public List<String> getStandartDataMapTemplates() { return standartDataMapTemplates; }
+
+	public List<String> getStandartDataMapSuperclassTemplates() { return standartDataMapSuperclassTemplates; }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 586416e..704e851 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
@@ -106,7 +106,7 @@ public class ClassesTabController extends CayenneController {
         else if (selectedCount == getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(true);
         }
-        updateEntities();
+        getParentController().updateEntities();
     }
 
     /**
@@ -116,12 +116,7 @@ public class ClassesTabController extends CayenneController {
     public void checkAllAction() {
         if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
             tableBinding.updateView();
-            updateEntities();
+            getParentController().updateEntities();
         }
     }
-
-    private void updateEntities(){
-        getParentController().updateEntities();
-//        getParentController().getProjectController().setDirty(true);
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
index e4fc20c..f6cad0b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -21,8 +21,6 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
 
 /**
  */
@@ -42,15 +40,12 @@ public class ClassesTabPanel extends JPanel {
         this.checkAll = new JCheckBox();
         this.checkAllLabel = new JLabel("Check All Classes");
 
-        checkAll.addItemListener(new ItemListener() {
-
-            public void itemStateChanged(ItemEvent event) {
-                if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Classess");
-                }
-                else {
-                    checkAllLabel.setText("Check All Classes");
-                }
+        checkAll.addItemListener(event -> {
+            if (checkAll.isSelected()) {
+                checkAllLabel.setText("Uncheck All Classess");
+            }
+            else {
+                checkAllLabel.setText("Check All Classes");
             }
         });
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 ac5e152..64a15fa 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
@@ -58,7 +58,6 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         projectController.addDataMapDisplayListener(e -> {
             super.startup(e.getDataMap());
             classesSelector.startup();
-            generatorSelector.startup(e.getDataMap());
 
             GeneratorController modeController = generatorSelector.getGeneratorController();
             ClassGenerationAction classGenerationAction = modeController.createGenerator();
@@ -125,6 +124,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
         }
         
         view.getClassesCount().setText(label);
+        projectController.setDirty(true);
     }
 
     public void generateAction() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 d99e708..0642fb9 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
@@ -264,20 +264,16 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         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.resetCollections();
+            for(ObjEntity entity: getSelectedEntities()) {
+                if(!entity.isGeneric()) {
+                    generator.loadEntity(entity.getName());
+                }
+            }
 
-            generator.addQueries(map.getQueryDescriptors());
+            for(Embeddable embeddable : getSelectedEmbeddables()) {
+                generator.loadEmbeddable(embeddable.getClassName());
+            }
         }
     }
 
@@ -312,8 +308,4 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     public void setCurrentClass(Object currentClass) {
         this.currentClass = currentClass;
     }
-
-//    public Collection<DataMap> getDataMaps() {
-//        return dataMaps;
-//    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 134381b..2559657 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
@@ -23,11 +23,8 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
 
 import javax.swing.*;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
 import java.awt.*;
 import java.util.*;
 import java.util.List;
@@ -38,17 +35,17 @@ import java.util.List;
 public class CustomModeController extends GeneratorController {
 
     // correspond to non-public constants on MapClassGenerator.
-    static final String MODE_DATAMAP = "datamap";
-    static final String MODE_ENTITY = "entity";
-    static final String MODE_ALL = "all";
+    private static final String MODE_DATAMAP = "datamap";
+    private static final String MODE_ENTITY = "entity";
+    private static final String MODE_ALL = "all";
 
-    static final String DATA_MAP_MODE_LABEL = "DataMap generation";
-    static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
+    private static final String DATA_MAP_MODE_LABEL = "DataMap generation";
+    private static final String ENTITY_MODE_LABEL = "Entity and Embeddable generation";
     static final String ALL_MODE_LABEL = "Generate all";
 
     static final Map<String, String> modesByLabel = new HashMap<>();
 
-    static final Map<String, String> labelByMode = new HashMap<>();
+    private static final Map<String, String> labelByMode = new HashMap<>();
 
     static {
         modesByLabel.put(DATA_MAP_MODE_LABEL, MODE_DATAMAP);
@@ -60,56 +57,29 @@ public class CustomModeController extends GeneratorController {
     }
 
     protected CustomModePanel view;
-    private CodeTemplateManager templateManager;
-
-    protected ObjectBinding superTemplate;
-    protected ObjectBinding subTemplate;
-
-    private BindingBuilder builder;
-
-    private CustomPreferencesUpdater preferencesUpdater;
 
     private ClassGenerationAction classGenerationAction;
 
     public CustomModeController(CodeGeneratorControllerBase parent) {
         super(parent);
-        this.view = new CustomModePanel();
-        initListeners();
+        this.view = new CustomModePanel(parent.getProjectController());
         bind();
+        initListeners();
     }
 
     private void bind() {
         initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
-        builder = new BindingBuilder(getApplication().getBindingFactory(), this);
+        BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
         builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
 
         updateTemplates();
     }
 
-    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);
-    }
-
     protected void updateTemplates() {
         Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices));
+        view.getGenerationMode().getComboBox().setModel(new DefaultComboBoxModel(modeChoices));
 
-        this.templateManager = getApplication().getCodeTemplateManager();
+        CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
         List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
         Collections.sort(customTemplates);
@@ -130,11 +100,22 @@ public class CustomModeController extends GeneratorController {
         Collections.sort(embeddableSuperTemplates);
         embeddableSuperTemplates.addAll(customTemplates);
 
-        this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
-        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
+        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().getComboBox().setModel(new DefaultComboBoxModel(subTemplates.toArray()));
+        this.view.getSuperclassTemplate().getComboBox().setModel(new DefaultComboBoxModel(superTemplates.toArray()));
 
-        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
-        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
+        this.view.getEmbeddableTemplate().getComboBox().setModel(new DefaultComboBoxModel(embeddableTemplates.toArray()));
+        this.view.getEmbeddableSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel(embeddableSuperTemplates.toArray()));
+
+        this.view.getDataMapTemplate().getComboBox().setModel(new DefaultComboBoxModel(dataMapTemplates.toArray()));
+        this.view.getDataMapSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel(dataMapSuperTemplates.toArray()));
     }
 
     public Component getView() {
@@ -144,6 +125,19 @@ public class CustomModeController extends GeneratorController {
     public void popPreferencesAction() {
         new PreferenceDialog(getApplication().getFrameController()).startupAction(PreferenceDialog.TEMPLATES_KEY);
         updateTemplates();
+        updateComboBoxes();
+    }
+
+    private void updateComboBoxes() {
+        view.getEmbeddableTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableTemplate()));
+        view.getEmbeddableSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableSuperTemplate()));
+        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate()));
+        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate()));
+        view.getGenerationMode().setItem(labelByMode.get(classGenerationAction.getArtifactsGenerationMode()));
+        view.getDataMapTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQueryTemplate()));
+        view.getDataMapSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQuerySuperTemplate()));
+
+        view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
     @Override
@@ -154,19 +148,6 @@ public class CustomModeController extends GeneratorController {
     }
 
     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);
@@ -186,92 +167,19 @@ public class CustomModeController extends GeneratorController {
             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.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);
-        });
-
-        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) {}
-        });
-
-        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){
         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.getOutputFolder().setText(classGenerationAction.getDir());
         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());
-        view.setEncoding(classGenerationAction.getEncoding());
-        view.setEmbeddableTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableTemplate()));
-        view.setEmbeddableSuperTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableSuperTemplate()));
-
-//        getParentController().getProjectController().setDirty(false);
+        view.getOutputPattern().setText(classGenerationAction.getOutputPattern());
+        view.getPairs().setSelected(classGenerationAction.isMakePairs());
+        view.getUsePackagePath().setSelected(classGenerationAction.isUsePkgPath());
+        view.getOverwrite().setSelected(classGenerationAction.isOverwrite());
+        view.getCreatePropertyNames().setSelected(classGenerationAction.isCreatePropertyNames());
+        view.getSuperclassPackage().setText(classGenerationAction.getSuperPkg());
+        view.getEncoding().setText(classGenerationAction.getEncoding());
+        updateComboBoxes();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 e79ef7a..bfadc8a 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
@@ -21,85 +21,179 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.ComboBoxAdapter;
+import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
+import org.apache.cayenne.validation.ValidationException;
 
 import javax.swing.*;
 import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
-    private JComboBox generationMode;
-    private JComboBox subclassTemplate;
-    private JComboBox superclassTemplate;
+    private ComboBoxAdapter generationMode;
+    private ComboBoxAdapter subclassTemplate;
+    private ComboBoxAdapter superclassTemplate;
+    private ComboBoxAdapter embeddableTemplate;
+    private ComboBoxAdapter embeddableSuperTemplate;
+    private ComboBoxAdapter dataMapTemplate;
+    private ComboBoxAdapter dataMapSuperTemplate;
     protected JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
-    private JTextField outputPattern;
+    private TextAdapter outputPattern;
     private JCheckBox createPropertyNames;
-    private JTextField superclassPackage;
+    private TextAdapter superclassPackage;
 
-    private JTextField encoding;
-    private JComboBox embeddableTemplate;
-    private JComboBox embeddableSuperTemplate;
-    private JLabel dataMapName;
-
-    private DefaultFormBuilder builder;
-
-    protected ActionLink manageTemplatesLink;
+    private TextAdapter encoding;
 
-    public CustomModePanel() {
+    private JLabel dataMapName;
 
-        this.generationMode = new JComboBox();
-        this.superclassTemplate = new JComboBox();
-        this.subclassTemplate = new JComboBox();
-        this.pairs = new JCheckBox();
-        this.overwrite = new JCheckBox();
-        this.usePackagePath = new JCheckBox();
-        this.outputPattern = new JTextField();
-        this.createPropertyNames = new JCheckBox();
+    private ActionLink manageTemplatesLink;
+
+    CustomModePanel(ProjectController projectController) {
+        super(projectController);
+
+        JComboBox modeField = new JComboBox();
+        this.generationMode = new ComboBoxAdapter(modeField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setArtifactsGenerationMode(CustomModeController.modesByLabel.get(item));
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox superclassField = new JComboBox();
+        this.superclassTemplate = new ComboBoxAdapter(superclassField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox subclassField = new JComboBox();
+        this.subclassTemplate = new ComboBoxAdapter(subclassField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox dataMapField = new JComboBox();
+        this.dataMapTemplate = new ComboBoxAdapter(dataMapField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox dataMapSuperField = new JComboBox();
+        this.dataMapSuperTemplate = new ComboBoxAdapter(dataMapSuperField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
+        this.pairs = new JCayenneCheckBox();
+        this.overwrite = new JCayenneCheckBox();
+        this.usePackagePath = new JCayenneCheckBox();
+
+        JTextField outputPatternField = new JTextField();
+        this.outputPattern = new TextAdapter(outputPatternField) {
+            protected void updateModel(String text) {
+                getCgenByDataMap().setOutputPattern(text);
+                projectController.setDirty(true);
+            }
+        };
+
+        this.createPropertyNames = new JCayenneCheckBox();
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
-        this.superclassPackage = new JTextField();
 
-        this.encoding = new JTextField();
-        this.embeddableTemplate = new JComboBox();
-        this.embeddableSuperTemplate = new JComboBox();
+        JTextField superclassPackageField = new JTextField();
+        this.superclassPackage = new TextAdapter(superclassPackageField) {
+            protected void updateModel(String text) {
+                getCgenByDataMap().setSuperPkg(text);
+                projectController.setDirty(true);
+            }
+        };
+
+        JTextField encodingField = new JTextField();
+        this.encoding = new TextAdapter(encodingField) {
+            protected void updateModel(String text) {
+                getCgenByDataMap().setEncoding(text);
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox embeddableField = new JComboBox();
+        this.embeddableTemplate = new ComboBoxAdapter(embeddableField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
+        JComboBox embeddableSuperclassField = new JComboBox();
+        this.embeddableSuperTemplate = new ComboBoxAdapter(embeddableSuperclassField) {
+            @Override
+            protected void updateModel(Object item) throws ValidationException {
+                getCgenByDataMap().setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
+                projectController.setDirty(true);
+            }
+        };
+
         this.dataMapName = new JLabel();
         this.dataMapName.setFont(dataMapName.getFont().deriveFont(1));
 
         pairs.addChangeListener(e -> {
-            superclassTemplate.setEnabled(pairs.isSelected());
+           setDisableSuperComboBoxes(pairs.isSelected());
             overwrite.setEnabled(!pairs.isSelected());
         });
 
         // assemble
         FormLayout layout = new FormLayout(
-                "right:77dlu, 3dlu, fill:200:grow, 6dlu, fill:50dlu, 3dlu", "");
-        builder = new DefaultFormBuilder(layout);
+                "right:100dlu, 3dlu, fill:100:grow, 6dlu, fill:50dlu, 3dlu", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
 
-        builder.append("Output Directory:", outputFolder, selectOutputFolder);
+        builder.append("Output Directory:", outputFolder.getComponent(), selectOutputFolder);
+        builder.nextLine();
+
+        builder.append("Generation Mode:", generationMode.getComboBox());
+        builder.nextLine();
+
+        builder.append("DataMap Template:", dataMapTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Generation Mode:", generationMode);
+        builder.append("DataMap Superclass Template", dataMapSuperTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Subclass Template:", subclassTemplate);
+        builder.append("Subclass Template:", subclassTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Superclass Template:", superclassTemplate);
+        builder.append("Superclass Template:", superclassTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Embeddable Template", embeddableTemplate);
+        builder.append("Embeddable Template", embeddableTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Embeddable Super Template", embeddableSuperTemplate);
+        builder.append("Embeddable Super Template", embeddableSuperTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Output Pattern:", outputPattern);
+        builder.append("Output Pattern:", outputPattern.getComponent());
         builder.nextLine();
 
-        builder.append("Encoding", encoding);
+        builder.append("Encoding", encoding.getComponent());
         builder.nextLine();
 
         builder.append("Make Pairs:", pairs);
@@ -117,7 +211,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append(dataMapName);
         builder.nextLine();
 
-        builder.append("Superclass package", superclassPackage);
+        builder.append("Superclass package", superclassPackage.getComponent());
 
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
@@ -129,7 +223,13 @@ public class CustomModePanel extends GeneratorControllerPanel {
         add(builder.getPanel(), BorderLayout.CENTER);
     }
 
-    public JComboBox getGenerationMode() {
+    public void setDisableSuperComboBoxes(boolean val){
+        superclassTemplate.getComboBox().setEnabled(val);
+        embeddableSuperTemplate.getComboBox().setEnabled(val);
+        dataMapSuperTemplate.getComboBox().setEnabled(val);
+    }
+
+    public ComboBoxAdapter getGenerationMode() {
         return generationMode;
     }
 
@@ -137,16 +237,20 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return manageTemplatesLink;
     }
 
-    public JComboBox getSubclassTemplate() { return subclassTemplate; }
+    public ComboBoxAdapter getSubclassTemplate() { return subclassTemplate; }
 
-    public JComboBox getEmbeddableTemplate() { return embeddableTemplate; }
+    public ComboBoxAdapter getEmbeddableTemplate() { return embeddableTemplate; }
 
-    public JComboBox getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
+    public ComboBoxAdapter getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
 
-    public JComboBox getSuperclassTemplate() {
+    public ComboBoxAdapter getSuperclassTemplate() {
         return superclassTemplate;
     }
 
+    public ComboBoxAdapter getDataMapTemplate() { return dataMapTemplate; }
+
+    public ComboBoxAdapter getDataMapSuperTemplate() { return dataMapSuperTemplate; }
+
     public JCheckBox getOverwrite() {
         return overwrite;
     }
@@ -159,7 +263,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return usePackagePath;
     }
 
-    public JTextField getOutputPattern() {
+    public TextAdapter getOutputPattern() {
         return outputPattern;
     }
 
@@ -167,55 +271,13 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
-    public JTextField getSuperclassPackage() {
+    public TextAdapter getSuperclassPackage() {
         return superclassPackage;
     }
 
-    public JTextField getEncoding() { return encoding; }
+    public TextAdapter getEncoding() { return encoding; }
 
     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);
-    }
-
-    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/0e19c961/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
deleted file mode 100644
index 469e594..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomPreferencesUpdater.java
+++ /dev/null
@@ -1,193 +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 org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-public class CustomPreferencesUpdater {
-
-    enum Property {
-        SUBCLASS_TEMPLATE,
-        SUPERCLASS_TEMPLATE,
-        OVERWRITE,
-        PAIRS,
-        USE_PACKAGE_PATH,
-        MODE,
-        OUTPUT_PATTERN,
-        CREATE_PROPERTY_NAMES
-    }
-
-    private static final String OVERWRITE = "overwrite";
-    private static final String PAIRS = "pairs";
-    private static final String USE_PACKAGE_PATH = "usePackagePath";
-    private static final String MODE = "mode";
-    private static final String OUTPUT_PATTERN = "outputPattern";
-    private static final String CREATE_PROPERTY_NAMES = "createPropertyNames";
-
-    private Map<DataMap, DataMapDefaults> mapPreferences;
-
-
-    public CustomPreferencesUpdater(Map<DataMap, DataMapDefaults> mapPreferences) {
-        this.mapPreferences = mapPreferences;
-    }
-
-    public String getMode() {
-        return (String) getProperty(Property.MODE);
-    }
-
-    public void setMode(String mode) {
-        updatePreferences(Property.MODE, mode);
-    }
-
-    public String getSubclassTemplate() {
-        return (String) getProperty(Property.SUBCLASS_TEMPLATE);
-    }
-
-    public void setSubclassTemplate(String subclassTemplate) {
-        updatePreferences(Property.SUBCLASS_TEMPLATE, subclassTemplate);
-    }
-
-    public String getSuperclassTemplate() {
-        return (String) getProperty(Property.SUPERCLASS_TEMPLATE);
-    }
-
-    public void setSuperclassTemplate(String superclassTemplate) {
-        updatePreferences(Property.SUPERCLASS_TEMPLATE, superclassTemplate);
-    }
-
-    public Boolean getOverwrite() {
-        return (Boolean) getProperty(Property.OVERWRITE);
-    }
-
-    public void setOverwrite(Boolean overwrite) {
-        updatePreferences(Property.OVERWRITE, overwrite);
-    }
-
-    public Boolean getPairs() {
-        return (Boolean) getProperty(Property.PAIRS);
-    }
-
-    public void setPairs(Boolean pairs) {
-        updatePreferences(Property.PAIRS, pairs);
-    }
-
-    public Boolean getUsePackagePath() {
-        return (Boolean) getProperty(Property.USE_PACKAGE_PATH);
-    }
-
-    public void setUsePackagePath(Boolean usePackagePath) {
-        updatePreferences(Property.USE_PACKAGE_PATH, usePackagePath);
-    }
-
-    public String getOutputPattern() {
-        return (String) getProperty(Property.OUTPUT_PATTERN);
-    }
-
-    public void setOutputPattern(String outputPattern) {
-        updatePreferences(Property.OUTPUT_PATTERN, outputPattern);
-    }
-
-    public Boolean getCreatePropertyNames() {
-        return (Boolean) getProperty(Property.CREATE_PROPERTY_NAMES);
-    }
-
-    public void setCreatePropertyNames(Boolean createPropertyNames) {
-        updatePreferences(Property.CREATE_PROPERTY_NAMES, createPropertyNames);
-    }
-
-    private Object getProperty(Property property) {
-        Object obj = null;
-
-        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-
-            switch (property) {
-                case MODE:
-                    obj = entry.getValue().getProperty(MODE);
-                    break;
-                case OUTPUT_PATTERN:
-                    obj = entry.getValue().getProperty(OUTPUT_PATTERN);
-                    break;
-                case SUBCLASS_TEMPLATE:
-                    obj = entry.getValue().getSubclassTemplate();
-                    break;
-                case SUPERCLASS_TEMPLATE:
-                    obj = entry.getValue().getSuperclassTemplate();
-                    break;
-                case OVERWRITE:
-                    obj = entry.getValue().getBooleanProperty(OVERWRITE);
-                    break;
-                case PAIRS:
-                    obj = entry.getValue().getBooleanProperty(PAIRS);
-                    break;
-                case USE_PACKAGE_PATH:
-                    obj = entry.getValue().getBooleanProperty(USE_PACKAGE_PATH);
-                    break;
-                case CREATE_PROPERTY_NAMES:
-                    obj = entry.getValue().getBooleanProperty(CREATE_PROPERTY_NAMES);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Bad type property: " + property);
-            }
-
-        }
-        return obj;
-    }
-
-    private void updatePreferences(Property property, Object value) {
-        Set<Entry<DataMap, DataMapDefaults>> entities = mapPreferences.entrySet();
-        for (Entry<DataMap, DataMapDefaults> entry : entities) {
-
-            switch (property) {
-                case MODE:
-                    entry.getValue().setProperty(MODE, (String) value);
-                    break;
-                case OUTPUT_PATTERN:
-                    entry.getValue().setProperty(OUTPUT_PATTERN, (String) value);
-                    break;
-                case SUBCLASS_TEMPLATE:
-                    entry.getValue().setSubclassTemplate((String) value);
-                    break;
-                case SUPERCLASS_TEMPLATE:
-                    entry.getValue().setSuperclassTemplate((String) value);
-                    break;
-                case OVERWRITE:
-                    entry.getValue().setBooleanProperty(OVERWRITE, (Boolean) value);
-                    break;
-                case PAIRS:
-                    entry.getValue().setBooleanProperty(PAIRS, (Boolean) value);
-                    break;
-                case USE_PACKAGE_PATH:
-                    entry.getValue().setBooleanProperty(USE_PACKAGE_PATH, (Boolean) value);
-                    break;
-                case CREATE_PROPERTY_NAMES:
-                    entry.getValue().setBooleanProperty(CREATE_PROPERTY_NAMES, (Boolean) value);
-                    break;
-                default:
-                    throw new IllegalArgumentException("Bad type property: " + property);
-            }
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 7a62efc..7e8087f 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
@@ -29,6 +29,7 @@ import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CodeValidationUtil;
+import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.BeanValidationFailure;
@@ -56,10 +57,6 @@ public abstract class GeneratorController extends CayenneController {
         super(parent);
     }
 
-    public String getOutputPath() {
-        return outputPath;
-    }
-
     public void setOutputPath(String path) {
         String old = this.outputPath;
         this.outputPath = path;
@@ -79,14 +76,6 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    public void setMapPreferences(Map<DataMap, DataMapDefaults> mapPreferences) {
-        this.mapPreferences = mapPreferences;
-    }
-
-    public Map<DataMap, DataMapDefaults> getMapPreferences() {
-        return this.mapPreferences;
-    }
-
     protected void initBindings(BindingBuilder bindingBuilder) {
         JButton outputSelect = ((GeneratorControllerPanel) getView()).getSelectOutputFolder();
         bindingBuilder.bindToAction(outputSelect, "selectOutputFolderAction()");
@@ -113,8 +102,6 @@ public abstract class GeneratorController extends CayenneController {
         if(generator != null){
             getParentController().addToSelectedEntities(generator.getEntities());
             getParentController().addToSelectedEmbeddables(generator.getEmbeddables());
-            generator.getEntities().clear();
-            generator.getEmbeddables().clear();
             return generator;
         }
 
@@ -451,20 +438,14 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    public File getOutputDir() {
-        String dir = ((GeneratorControllerPanel) getView()).getOutputFolder().getText();
-        return dir != null ? new File(dir) : new File(System.getProperty("user.dir"));
-    }
-
     /**
      * An action method that pops up a file chooser dialog to pick the
      * generation directory.
      */
     public void selectOutputFolderAction() {
+        TextAdapter outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder();
 
-        JTextField outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder();
-
-        String currentDir = outputFolder.getText();
+        String currentDir = outputFolder.getComponent().getText();
 
         JFileChooser chooser = new JFileChooser();
         chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
@@ -484,8 +465,8 @@ public abstract class GeneratorController extends CayenneController {
 
             // update model
             String path = selected.getAbsolutePath();
-            outputFolder.setText(path);
-//            setOutputPath(path);
+            ((GeneratorControllerPanel) getView()).getOutputFolder().setText(path);
+            ((GeneratorControllerPanel) getView()).getOutputFolder().updateModel();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 7f1f689..7536a01 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
@@ -19,6 +19,11 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.TextAdapter;
+
 import javax.swing.*;
 import java.io.File;
 
@@ -28,27 +33,32 @@ import java.io.File;
  */
 public class GeneratorControllerPanel extends JPanel {
 
-    protected JTextField outputFolder;
+    protected TextAdapter outputFolder;
     protected JButton selectOutputFolder;
 
-    public GeneratorControllerPanel() {
-        this.outputFolder = new JTextField();
+    ProjectController projectController;
+
+    public GeneratorControllerPanel(ProjectController projectController) {
+        this.projectController = projectController;
+        JTextField outputFolderField = new JTextField();
+        this.outputFolder = new TextAdapter(outputFolderField) {
+            protected void updateModel(String text) {
+                getCgenByDataMap().setDestDir(new File(text));
+                projectController.setDirty(true);
+            }
+        };
         this.selectOutputFolder = new JButton("Select");
     }
 
-    public JTextField getOutputFolder() {
-        return outputFolder;
+    public ClassGenerationAction getCgenByDataMap() {
+        DataMap dataMap = projectController.getCurrentDataMap();
+        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
     }
-
-    public File getOutputDir(){
-        return new File(outputFolder.getText());
+    public TextAdapter getOutputFolder() {
+        return outputFolder;
     }
 
     public JButton getSelectOutputFolder() {
         return selectOutputFolder;
     }
-
-    public void setOutputFolder(String folder) {
-        this.outputFolder.setText(folder);
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/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 fc3f567..53000da 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
@@ -20,7 +20,6 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.pref.PreferenceDetail;
 
@@ -43,10 +42,6 @@ public class GeneratorTabController extends CayenneController {
         this.view = new GeneratorTabPanel(customModeController.getView());
     }
 
-    public void startup(DataMap dataMap){
-//        customModeController.startup(dataMap);
-    }
-
     public Component getView() {
         return view;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
index 40249f4..4082f36 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -23,6 +23,7 @@ import javax.swing.*;
 import java.awt.*;
 
 /**
+ * @since 4.1
  */
 public class GeneratorTabPanel extends JPanel {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/0e19c961/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
new file mode 100644
index 0000000..2a7fd79
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
@@ -0,0 +1,72 @@
+/*****************************************************************
+ *   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.util;
+
+import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
+import org.apache.cayenne.validation.ValidationException;
+
+import javax.swing.*;
+import java.awt.event.ActionListener;
+
+/**
+ * @since 4.1
+ */
+public abstract class ComboBoxAdapter {
+
+    private JComboBox comboBox;
+    private ActionListener listener;
+
+    private JComboBoxUndoListener undoListener;
+
+    protected ComboBoxAdapter(JComboBox comboBox) {
+        this.comboBox = comboBox;
+        listener = e -> updateModel();
+
+        undoListener = new JComboBoxUndoListener();
+
+        comboBox.addActionListener(listener);
+        comboBox.addItemListener(undoListener);
+    }
+
+    public void setItem(Object item) {
+        comboBox.removeActionListener(listener);
+        comboBox.removeItemListener(undoListener);
+
+        try{
+            comboBox.setSelectedItem(item);
+        }
+        finally {
+            comboBox.addActionListener(listener);
+            comboBox.addItemListener(undoListener);
+        }
+    }
+
+    public JComboBox getComboBox() {
+        return comboBox;
+    }
+
+    /**
+     * Updates bound model with document text.
+     */
+    protected abstract void updateModel(Object item) throws ValidationException;
+
+    public void updateModel() {
+        updateModel(comboBox.getSelectedItem());
+    }
+}


[11/32] cayenne git commit: Add cgen tab.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 2824685..ef290a6 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
@@ -21,25 +21,47 @@ package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.pref.CayenneProjectPreferences;
 import org.apache.cayenne.pref.PreferenceDetail;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.util.Util;
 
-import java.awt.Component;
+import java.awt.*;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  */
 public class GeneratorTabController extends CayenneController {
 
+    private static final String STANDARD_OBJECTS_MODE = "Standard Persistent Objects";
+    private static final String CLIENT_OBJECTS_MODE = "Client Persistent Objects";
+    private static final String ADVANCED_MODE = "Advanced";
+
     public static final String GENERATOR_PROPERTY = "generator";
 
+    private static final String[] GENERATION_MODES = new String[] {
+            STANDARD_OBJECTS_MODE, CLIENT_OBJECTS_MODE, ADVANCED_MODE
+    };
+
     protected GeneratorTabPanel view;
+    protected Map<String, GeneratorController> controllers;
     protected PreferenceDetail preferences;
 
-    protected CustomModeController customModeController;
-
     public GeneratorTabController(CodeGeneratorControllerBase parent) {
         super(parent);
-        customModeController = new CustomModeController(parent);
-        this.view = new GeneratorTabPanel(customModeController.getView());
+        this.controllers = new HashMap<>(3);
+        controllers.put(STANDARD_OBJECTS_MODE, new StandardModeController(parent));
+        controllers.put(CLIENT_OBJECTS_MODE, new ClientModeController(parent));
+        controllers.put(ADVANCED_MODE, new CustomModeController(parent));
+        Component[] modePanels = new Component[GENERATION_MODES.length];
+        for (int i = 0; i < GENERATION_MODES.length; i++) {
+            modePanels[i] = controllers.get(GENERATION_MODES[i])
+                    .getView();
+        }
+        this.view = new GeneratorTabPanel(GENERATION_MODES, modePanels);
+        initBindings();
+        view.setPreferredSize(new Dimension(600, 480));
     }
 
     public Component getView() {
@@ -54,8 +76,36 @@ public class GeneratorTabController extends CayenneController {
         return preferences;
     }
 
-    public GeneratorController getGeneratorController() {
-        return customModeController;
+    protected void initBindings() {
+
+        // bind actions
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        CayenneProjectPreferences cayPrPref = application.getCayenneProjectPreferences();
+
+        this.preferences = (PreferenceDetail) cayPrPref.getProjectDetailObject(
+                PreferenceDetail.class,
+                getViewPreferences().node("controller"));
+
+        if (Util.isEmptyString(preferences.getProperty("mode"))) {
+            preferences.setProperty("mode", STANDARD_OBJECTS_MODE);
+        }
+
+        builder.bindToComboSelection(
+                view.getGenerationMode(),
+                "preferences.property['mode']").updateView();
+
+        view.getGenerationMode().addActionListener(action -> {
+            String name = (String)view.getGenerationMode().getSelectedItem();
+            controllers.get(name).initForm(getGenerator());
+        });
+    }
+
+    GeneratorController getGeneratorController() {
+        String name = (String)view.getGenerationMode().getSelectedItem();
+        return controllers.get(name);
     }
 
     public ClassGenerationAction getGenerator() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
index ab25218..9cfd542 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabPanel.java
@@ -19,17 +19,77 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.JPanel;
-import java.awt.BorderLayout;
-import java.awt.Component;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+import org.apache.cayenne.swing.components.TopBorder;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.Objects;
 
 /**
  * @since 4.1
  */
 public class GeneratorTabPanel extends JPanel {
 
-    public GeneratorTabPanel(Component modePanels) {
+    private JComboBox<String> generationMode;
+    private CardLayout modeLayout;
+    private JPanel modesPanel;
+
+    private JButton generateButton;
+    private JLabel classesCount;
+
+    public GeneratorTabPanel(String[] modeNames, Component[] modePanels) {
         setLayout(new BorderLayout());
-        add(modePanels, BorderLayout.CENTER);
+        this.generateButton = new JButton("Generate");
+        generateButton.setIcon(ModelerUtil.buildIcon("icon-gen_java.png"));
+        generateButton.setPreferredSize(new Dimension(180, 30));
+        this.classesCount = new JLabel("No classes selected");
+        classesCount.setFont(classesCount.getFont().deriveFont(10f));
+        JPanel messages = new JPanel(new BorderLayout());
+        messages.add(classesCount, BorderLayout.WEST);
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.setBorder(TopBorder.create());
+        buttons.add(classesCount);
+        buttons.add(Box.createHorizontalStrut(50));
+        buttons.add(generateButton);
+        add(buttons, BorderLayout.NORTH);
+
+        JPanel panel = new JPanel();
+        this.generationMode = new JComboBox<>(modeNames);
+        this.modeLayout = new CardLayout();
+        this.modesPanel = new JPanel(modeLayout);
+
+        generationMode.addItemListener(e -> modeLayout.show(modesPanel, Objects.requireNonNull(generationMode.getSelectedItem()).toString()));
+
+        // assemble
+        FormLayout layout = new FormLayout("right:77dlu, 3dlu, fill:300, fill:300dlu:grow", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+        builder.append("Type:", generationMode, 1);
+        builder.appendSeparator();
+
+        for (int i = 0; i < modeNames.length; i++) {
+            modesPanel.add(modePanels[i], modeNames[i]);
+        }
+
+        panel.setLayout(new BorderLayout());
+        panel.add(builder.getPanel(), BorderLayout.NORTH);
+        panel.add(modesPanel, BorderLayout.CENTER);
+
+        add(panel, BorderLayout.CENTER);
+    }
+
+    public JComboBox getGenerationMode() {
+        return generationMode;
+    }
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JLabel getClassesCount() {
+        return classesCount;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
new file mode 100644
index 0000000..6985896
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -0,0 +1,61 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.modeler.pref.DataMapDefaults;
+
+import java.awt.*;
+
+public class StandardModeController extends GeneratorController {
+
+    protected StandardModePanel view;
+    protected DataMapDefaults preferences;
+
+    public StandardModeController(CodeGeneratorControllerBase parent) {
+        super(parent);
+    }
+
+    protected GeneratorControllerPanel createView() {
+        this.view = new StandardModePanel();
+        return view;
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    @Override
+    protected ClassGenerationAction newGenerator() {
+        ClassGenerationAction action = new ClassGenerationAction();
+        getApplication().getInjector().injectMembers(action);
+        return action;
+    }
+
+    @Override
+    protected void initForm(ClassGenerationAction classGenerationAction) {
+        super.initForm(classGenerationAction);
+    }
+
+    @Override
+    public ClassGenerationAction createGenerator() {
+        return super.createGenerator();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
new file mode 100644
index 0000000..0ddf1e2
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModePanel.java
@@ -0,0 +1,42 @@
+/*****************************************************************
+ *   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.modeler.Application;
+
+import java.awt.*;
+
+public class StandardModePanel extends GeneratorControllerPanel {
+
+    public StandardModePanel() {
+        super(Application.getInstance().getFrameController().getProjectController());
+        FormLayout layout = new FormLayout(
+                "right:88dlu, 1dlu, fill:300:grow, 1dlu, left:100dlu, 100dlu", "");
+
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.append("Output Directory:", outputFolder.getComponent(), selectOutputFolder);
+        builder.nextLine();
+
+        setLayout(new BorderLayout());
+        add(builder.getPanel(), BorderLayout.CENTER);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/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
new file mode 100644
index 0000000..8170548
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java
@@ -0,0 +1,63 @@
+/*****************************************************************
+ *   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;
+
+    public StandardPanelComponent() {
+        super();
+
+        FormLayout layout = new FormLayout(
+                "right:77dlu, 3dlu, fill:100:grow, 3dlu", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.nextLine();
+
+        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;
+    }
+
+}


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

Posted by nt...@apache.org.
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;


[24/32] cayenne git commit: Add replacement to datamap generation mode.

Posted by nt...@apache.org.
Add replacement to datamap generation mode.


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

Branch: refs/heads/master
Commit: ac6819f330415205cb6ccacc6bdf3013937ef13e
Parents: 3ae4973
Author: Arseni Bulatski <an...@gmail.com>
Authored: Mon Nov 12 15:58:58 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Mon Nov 12 16:01:26 2018 +0300

----------------------------------------------------------------------
 UPGRADE.txt                                     |  4 --
 .../cayenne/tools/CayenneGeneratorTask.java     | 22 +++++---
 .../cayenne/tools/CgenWithConfigTest.java       | 38 +++++++++++++-
 .../java/org/apache/cayenne/tools/CgenTask.java | 23 ++++++---
 .../org/apache/cayenne/tools/CgenTaskIT.java    | 35 +++++++++++++
 .../tools/cgen_replaceDatamapMode.gradle        | 31 ++++++++++++
 .../cayenne/tools/CayenneGeneratorMojo.java     | 22 +++++---
 .../cayenne/tools/CayenneGeneratorMojoTest.java | 26 +++++++++-
 .../cgen/project-to-test/datamap-and-pom.xml    |  1 -
 .../project-to-test/replaceDatamapMode-pom.xml  | 53 ++++++++++++++++++++
 10 files changed, 227 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/UPGRADE.txt b/UPGRADE.txt
index 83bcc5a..bd660d3 100644
--- a/UPGRADE.txt
+++ b/UPGRADE.txt
@@ -4,10 +4,6 @@ Apache Cayenne Upgrade Information
 IMPORTANT: be sure to read all notes for the intermediate releases between your
            current release and the release you are upgrading to.
 -------------------------------------------------------------------------------
-UPGRADING TO 4.1.M3
-
-* Per CAY-2493 'datamap' generation mode in cgen replaced with 'all' generation mode with
-      <excludeEntities>*</excludeEntities> and <excludeEmbeddables>*</excludeEmbeddables> patterns.
 
 UPGRADING TO 4.1.M2
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index 6291a6d..8d5a151 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
@@ -108,17 +109,16 @@ public class CayenneGeneratorTask extends CayenneTask {
 
         loadAction.setMainDataMapFile(map);
         loadAction.setAdditionalDataMapFiles(additionalMaps);
-
-        CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-        filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntitiesPattern, excludeEntitiesPattern));
-
-        CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
-        filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddablesPattern));
         try {
 
             DataMap dataMap = loadAction.getMainDataMap();
 
             ClassGenerationAction generatorAction = createGenerator(dataMap);
+            CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+            filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntitiesPattern, excludeEntitiesPattern));
+
+            CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+            filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddablesPattern));
             filterEntityAction.setClient(generatorAction.getCgenConfiguration().isClient());
             generatorAction.setLogger(logger);
             if(force) {
@@ -177,6 +177,9 @@ public class CayenneGeneratorTask extends CayenneTask {
         cgenConfiguration.setRelPath(destDir != null ? destDir.toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
         cgenConfiguration.setMakePairs(makepairs != null ? makepairs : cgenConfiguration.isMakePairs());
+        if(mode != null && mode.equals("datamap")) {
+            replaceDatamapGenerationMode();
+        }
         cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
         cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
         cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
@@ -205,6 +208,13 @@ public class CayenneGeneratorTask extends CayenneTask {
         return cgenConfiguration;
     }
 
+    private void replaceDatamapGenerationMode() {
+        this.mode = ArtifactsGenerationMode.ALL.getLabel();
+        this.excludeEntitiesPattern = "*";
+        this.excludeEmbeddablesPattern = "*";
+        this.includeEntitiesPattern = "";
+    }
+
     /**
      * Validates attributes that are not related to internal DefaultClassGenerator. Throws
      * BuildException if attributes are invalid.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
index b51a1e0..ce8fd10 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
@@ -79,7 +79,7 @@ public class CgenWithConfigTest {
         File notIncludedEntity = new File(mapDir, "ObjEntity.txt");
         assertFalse(notIncludedEntity.exists());
 
-        File notIncludeSuperDatamap = new File("_Antmap_cgen_xml.txt");
+        File notIncludeSuperDatamap = new File(mapDir, convertPath("auto/_Antmap_cgen_xml.txt"));
         assertFalse(notIncludeSuperDatamap.exists());
     }
 
@@ -111,13 +111,47 @@ public class CgenWithConfigTest {
         File notIncludedEntity = new File(mapDir, "ObjEntity1.txt");
         assertFalse(notIncludedEntity.exists());
 
-        File notIncludeSuperDatamap = new File("_Antmap_cgen_xml.txt");
+        File notIncludeSuperDatamap = new File(mapDir, convertPath("_Antmap_cgen_xml.txt"));
         assertFalse(notIncludeSuperDatamap.exists());
 
         File notIncludedSuperEntity = new File(mapDir, convertPath("_ObjEntity.txt"));
         assertFalse(notIncludedSuperEntity.exists());
     }
 
+    @Test
+    public void testReplaceDatamapMode() {
+        File mapDir = new File(baseDir, "cgenReplaceMode");
+        assertTrue(mapDir.mkdirs());
+
+        task.setDestDir(mapDir);
+        task.setMap(map);
+        task.setMode("datamap");
+        task.setMakepairs(true);
+        task.setOutputPattern("*.txt");
+
+        // run task
+        task.execute();
+
+        // check results
+        File notIncludedEntity = new File(mapDir, convertPath("ObjEntity.txt"));
+        assertFalse(notIncludedEntity.isFile());
+
+        File notIncludedEmbeddable = new File(mapDir, convertPath("Embeddable.txt"));
+        assertFalse(notIncludedEmbeddable.isFile());
+
+        File datamap = new File(mapDir, convertPath("Antmap_cgen_xml.txt"));
+        assertTrue(datamap.exists());
+
+        File notIncludedEntity1 = new File(mapDir, "ObjEntity1.txt");
+        assertFalse(notIncludedEntity1.exists());
+
+        File includeSuperDatamap = new File(mapDir, convertPath("auto/_Antmap_cgen_xml.txt"));
+        assertTrue(includeSuperDatamap.exists());
+
+        File notIncludedSuperEntity = new File(mapDir, convertPath("auto/_ObjEntity.txt"));
+        assertFalse(notIncludedSuperEntity.exists());
+    }
+
     private String convertPath(String unixPath) {
         return unixPath.replace('/', File.separatorChar);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index 0e63c53..818b592 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -31,6 +31,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
@@ -166,18 +167,16 @@ public class CgenTask extends BaseCayenneTask {
 
         CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
         loaderAction.setMainDataMapFile(dataMapFile);
-
-        CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-        filterEntityAction.setNameFilter(NamePatternMatcher.build(getLogger(), includeEntities, excludeEntities));
-
-        CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
-        filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(getLogger(), null, excludeEmbeddables));
-
         try {
             loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
 
             DataMap dataMap = loaderAction.getMainDataMap();
             ClassGenerationAction generator = this.createGenerator(dataMap);
+            CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+            filterEntityAction.setNameFilter(NamePatternMatcher.build(getLogger(), includeEntities, excludeEntities));
+
+            CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+            filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(getLogger(), null, excludeEmbeddables));
             filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
             generator.setLogger(getLogger());
 
@@ -241,6 +240,9 @@ public class CgenTask extends BaseCayenneTask {
         cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
         cgenConfiguration.setMakePairs(makePairs != null ? makePairs : cgenConfiguration.isMakePairs());
+        if(mode != null && mode.equals("datamap")) {
+            replaceDatamapGenerationMode();
+        }
         cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
         cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
         cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
@@ -269,6 +271,13 @@ public class CgenTask extends BaseCayenneTask {
         return cgenConfiguration;
     }
 
+    private void replaceDatamapGenerationMode() {
+        this.mode = ArtifactsGenerationMode.ALL.getLabel();
+        this.excludeEntities = "*";
+        this.excludeEmbeddables = "*";
+        this.includeEntities = "";
+    }
+
     private boolean hasConfig() {
         return destDir != null || destDirName != null || encoding != null || client != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
                 makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
index c3879ac..9758e51 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
@@ -146,4 +146,39 @@ public class CgenTaskIT extends BaseTaskIT {
 
         assertEquals(TaskOutcome.SUCCESS, result.task(":cgen").getOutcome());
     }
+
+    @Test
+    public void testReplaceDatamapMode() throws Exception {
+        GradleRunner runner = createRunner(
+                "cgen_replaceDatamapMode",
+                "cgen",
+                "-PdataMap=cgenMap.map.xml"
+        );
+
+        BuildResult result = runner.forwardOutput().build();
+
+        String generatedDirectoryPath = projectDir.getAbsolutePath() + "/customDirectory/";
+
+        String notIncludedEntity = generatedDirectoryPath + "ObjEntity.txt";
+        Path generatedNotIncludedEntity = Paths.get(notIncludedEntity);
+        assertFalse(Files.exists(generatedNotIncludedEntity));
+
+        String notIncludedEntity1 = generatedDirectoryPath + "ObjEntity1.txt";
+        Path generatedNotIncludedEntity1 = Paths.get(notIncludedEntity1);
+        assertFalse(Files.exists(generatedNotIncludedEntity1));
+
+        String notIncludedEmbeddable = generatedDirectoryPath + "Embeddable.txt";
+        Path generatedNotIncludedEmbeddable = Paths.get(notIncludedEmbeddable);
+        assertFalse(Files.exists(generatedNotIncludedEmbeddable));
+
+        String includedDataMap = generatedDirectoryPath + "CgenMap.txt";
+        Path generatedIncludedDataMap = Paths.get(includedDataMap);
+        assertTrue(Files.exists(generatedIncludedDataMap));
+
+        String includedSuperDataMap = generatedDirectoryPath + "auto/_CgenMap.txt";
+        Path generatedIncludedSuperDataMap = Paths.get(includedSuperDataMap);
+        assertTrue(Files.exists(generatedIncludedSuperDataMap));
+
+        assertEquals(TaskOutcome.SUCCESS, result.task(":cgen").getOutcome());
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_replaceDatamapMode.gradle
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_replaceDatamapMode.gradle b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_replaceDatamapMode.gradle
new file mode 100644
index 0000000..6486a95
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_replaceDatamapMode.gradle
@@ -0,0 +1,31 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+
+plugins {
+    id 'org.apache.cayenne'
+}
+
+cgen {
+    map dataMap
+    destDir = './customDirectory'
+    makePairs true
+    outputPattern = '*.txt'
+    overwrite = false
+    mode = "datamap"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/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 647f363..f3abbe5 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
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
@@ -241,17 +242,16 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		CayenneGeneratorMapLoaderAction loaderAction = new CayenneGeneratorMapLoaderAction(injector);
 		loaderAction.setMainDataMapFile(map);
 
-		CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-		filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntities, excludeEntities));
-
-		CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
-		filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddables));
-
 		try {
 			loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
 
 			DataMap dataMap = loaderAction.getMainDataMap();
 			ClassGenerationAction generator = createGenerator(dataMap);
+			CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+			filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntities, excludeEntities));
+
+			CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+			filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddables));
 			filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
 			generator.setLogger(logger);
 
@@ -333,6 +333,9 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : defaultDir.getPath());
 		cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
 		cgenConfiguration.setMakePairs(makePairs != null ? makePairs : cgenConfiguration.isMakePairs());
+		if(mode != null && mode.equals("datamap")) {
+			replaceDatamapGenerationMode();
+		}
 		cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
 		cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
 		cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
@@ -360,4 +363,11 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		}
 		return cgenConfiguration;
 	}
+
+	private void replaceDatamapGenerationMode() {
+		this.mode = ArtifactsGenerationMode.ALL.getLabel();
+		this.excludeEntities = "*";
+		this.excludeEmbeddables = "*";
+		this.includeEntities = "";
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
index 8454c32..ef1e1c9 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
@@ -108,9 +108,31 @@ public class CayenneGeneratorMojoTest extends AbstractMojoTestCase {
 
         File objEntity = new File("target/resultClasses/ObjEntity.txt");
         assertFalse(objEntity.exists());
-        File superObjEntity1 = new File("target/resultClasses/superPkg/_ObjEntity.txt");
+        File superObjEntity1 = new File("target/resultClasses/auto/_ObjEntity.txt");
         assertFalse(superObjEntity1.exists());
-        File superDataMap = new File("target/resultClasses/superPkg/_TestCgen.txt");
+        File superDataMap = new File("target/resultClasses/auto/_TestCgen.txt");
         assertFalse(superDataMap.exists());
     }
+
+    public void testDatamapModeReplace() throws Exception {
+        File pom = getTestFile("src/test/resources/cgen/project-to-test/replaceDatamapMode-pom.xml");
+        assertNotNull(pom);
+        assertTrue(pom.exists());
+
+        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen", pom);
+        assertNotNull(myMojo);
+        myMojo.execute();
+
+        File objEntity1 = new File("target/testForMode/ObjEntity1.txt");
+        assertFalse(objEntity1.exists());
+        File embeddable = new File("target/testForMode/Embeddable.txt");
+        assertFalse(embeddable.exists());
+        File objEntity = new File("target/testForMode/ObjEntity.txt");
+        assertFalse(objEntity.exists());
+        File dataMap = new File("target/testForMode/TestCgen.txt");
+        assertTrue(dataMap.exists());
+
+        File superDataMap = new File("target/testForMode/superPkg/_TestCgen.txt");
+        assertTrue(superDataMap.exists());
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
index 620a6d0..a5b90fd 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/datamap-and-pom.xml
@@ -42,7 +42,6 @@
                     <outputPattern>*.txt</outputPattern>
                     <makePairs>false</makePairs>
                     <usePkgPath>true</usePkgPath>
-                    <superPkg>superPkg</superPkg>
                     <encoding>UTF-8</encoding>
                     <excludeEntities>ObjEntity</excludeEntities>
                     <mode>all</mode>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/ac6819f3/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/replaceDatamapMode-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/replaceDatamapMode-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/replaceDatamapMode-pom.xml
new file mode 100644
index 0000000..8480f85
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/replaceDatamapMode-pom.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <name>Test CayenneGeneratorMojo</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>cayenne-maven-plugin</artifactId>
+                <configuration>
+                    <map>src/test/resources/cgen/testCgen.map.xml</map>
+                    <destDir>target/testForMode</destDir>
+                    <outputPattern>*.txt</outputPattern>
+                    <makePairs>true</makePairs>
+                    <usePkgPath>true</usePkgPath>
+                    <superPkg>superPkg</superPkg>
+                    <encoding>UTF-8</encoding>
+                    <mode>datamap</mode>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>


[31/32] cayenne git commit: Generation all selection fix

Posted by nt...@apache.org.
Generation all selection fix


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

Branch: refs/heads/master
Commit: d20a03f88c3b0f40d12644ae2a66d9a93aadb63e
Parents: 51803e4
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Nov 14 17:09:44 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Nov 14 17:09:44 2018 +0300

----------------------------------------------------------------------
 .../apache/cayenne/modeler/editor/cgen/CustomModeController.java | 4 ----
 .../apache/cayenne/modeler/editor/cgen/GeneratorController.java  | 4 ++++
 2 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/d20a03f8/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 07f7828..e2d8408 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
@@ -177,10 +177,6 @@ public class CustomModeController extends GeneratorController {
         view.getOverwrite().setSelected(cgenConfiguration.isOverwrite());
         view.getCreatePropertyNames().setSelected(cgenConfiguration.isCreatePropertyNames());
         view.getPkProperties().setSelected(cgenConfiguration.isCreatePKProperties());
-        if(cgenConfiguration.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
-            ((CodeGeneratorControllerBase) parent).setCurrentClass(cgenConfiguration.getDataMap());
-            ((CodeGeneratorControllerBase) parent).setSelected(true);
-        }
         updateComboBoxes();
         getParentController().setInitFromModel(false);
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/d20a03f8/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 1b49a46..58bc85e 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
@@ -74,6 +74,10 @@ public abstract class GeneratorController extends CayenneController {
     protected void initForm(CgenConfiguration cgenConfiguration) {
         this.cgenConfiguration = cgenConfiguration;
         ((GeneratorControllerPanel)getView()).getOutputFolder().setText(cgenConfiguration.buildPath().toString());
+        if(cgenConfiguration.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
+            ((CodeGeneratorControllerBase) parent).setCurrentClass(cgenConfiguration.getDataMap());
+            ((CodeGeneratorControllerBase) parent).setSelected(true);
+        }
     }
 
     public abstract void updateConfiguration(CgenConfiguration cgenConfiguration);


[12/32] cayenne git commit: Add cgen tab.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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
deleted file mode 100644
index 9242f21..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalController.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-
-import java.awt.Component;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalController extends CayenneController{
-
-    protected CgenDialog view;
-
-    private 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/6a43436a/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
deleted file mode 100644
index c234d70..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanel.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.modeler.ProjectController;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalPanel extends JPanel {
-
-    private JButton generateButton;
-
-    private JTextField outputFolder;
-    private JButton selectOutputFolder;
-    private JComboBox<String> generationMode;
-    private JComboBox<String> subclassTemplate;
-    private JComboBox<String> superclassTemplate;
-    private JComboBox<String> embeddableTemplate;
-    private JComboBox<String> embeddableSuperTemplate;
-    private JComboBox<String> dataMapTemplate;
-    private JComboBox<String> dataMapSuperTemplate;
-    private JCheckBox pairs;
-    private JCheckBox overwrite;
-    private JCheckBox usePackagePath;
-    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;
-
-    CgenGlobalPanel(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<String> getGenerationMode() { return generationMode; }
-
-    public JComboBox<String> getSubclassTemplate() {
-        return subclassTemplate;
-    }
-
-    public JComboBox<String> getSuperclassTemplate() {
-        return superclassTemplate;
-    }
-
-    public JComboBox<String> getEmbeddableTemplate() {
-        return embeddableTemplate;
-    }
-
-    public JComboBox<String> getEmbeddableSuperTemplate() {
-        return embeddableSuperTemplate;
-    }
-
-    public JComboBox<String> getDataMapTemplate() {
-        return dataMapTemplate;
-    }
-
-    public JComboBox<String> 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/6a43436a/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
deleted file mode 100644
index f694b73..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/cgen/CgenGlobalPanelController.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.dialog.codegen.cgen;
-
-import org.apache.cayenne.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;
-
-/**
- * @since 4.1
- */
-public class CgenGlobalPanelController extends CayenneController{
-
-    private static final String ALL_MODE_LABEL = "Generate all";
-    private static final Map<String, String> modesByLabel = new HashMap<>();
-    // correspond to non-public constants on MapClassGenerator.
-    private static final String MODE_DATAMAP = "datamap";
-    private static final String MODE_ENTITY = "entity";
-    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;
-
-    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() {
-        String[] modeChoices = new String[]{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(new String[0])));
-        this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-
-        this.view.getEmbeddableTemplate().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
-        this.view.getEmbeddableSuperTemplate().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
-
-        this.view.getDataMapTemplate().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
-        this.view.getDataMapSuperTemplate().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
-
-        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/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index 770c713..388e087 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -23,8 +23,7 @@ import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
+import javax.swing.*;
 
 
 /**
@@ -33,6 +32,7 @@ import javax.swing.JTabbedPane;
  */
 public class DataMapTabbedView extends JTabbedPane {
     ProjectController mediator;
+    private CodeGeneratorController codeGeneratorController;
 
     /**
      * constructor
@@ -41,7 +41,6 @@ public class DataMapTabbedView extends JTabbedPane {
      */
     public DataMapTabbedView(ProjectController mediator) {
         this.mediator = mediator;
-
         initView();
     }
 
@@ -57,11 +56,27 @@ public class DataMapTabbedView extends JTabbedPane {
         // must be wrapped in a scroll pane
         JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
         JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
-        CodeGeneratorController codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
+        this.codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
         JScrollPane cgenView = new JScrollPane(codeGeneratorController.getView());
         addTab("DataMap", dataMapView);
         addTab("DbImport", dbImportView);
-        addTab("Cgen", cgenView);
+        addTab("Class Generation", cgenView);
+
+        addChangeListener(tab -> {
+            if(isCgenTabActive()) {
+                codeGeneratorController.startup(mediator.getCurrentDataMap());
+            }
+        });
+        mediator.addDataMapDisplayListener(e -> {
+            if(isCgenTabActive()) {
+                fireStateChanged();
+            }
+        });
     }
+
+    private boolean isCgenTabActive() {
+        return getSelectedIndex() == 2;
+    }
+
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 a83ef3d..cfa6a57 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java
@@ -25,13 +25,11 @@ import org.apache.cayenne.swing.ImageRendererColumn;
 import org.apache.cayenne.swing.ObjectBinding;
 import org.apache.cayenne.swing.TableBindingBuilder;
 
-import javax.swing.JLabel;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
 
 public class ClassesTabController extends CayenneController {
 
-    public static final String GENERATE_PROPERTY = "generate";
-
     protected ClassesTabPanel view;
     protected ObjectBinding tableBinding;
 
@@ -48,6 +46,7 @@ public class ClassesTabController extends CayenneController {
 
     public void startup(){
         initBindings();
+        classSelectedAction();
     }
 
     protected CodeGeneratorControllerBase getParentController() {
@@ -98,9 +97,11 @@ public class ClassesTabController extends CayenneController {
      * A callback action that updates the state of Select All checkbox.
      */
     public void classSelectedAction() {
-        int selectedCount = getParentController().getSelectedEntitiesSize() + getParentController().getSelectedEmbeddablesSize() ;
+        int selectedCount = getParentController().getSelectedEntitiesSize()
+                + getParentController().getSelectedEmbeddablesSize()
+                + (getParentController().isDataMapSelected() ? 1 : 0);
 
-        if (selectedCount == 0) {
+        if (selectedCount < getParentController().getClasses().size()) {
             view.getCheckAll().setSelected(false);
         }
         else if (selectedCount == getParentController().getClasses().size()) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
index 7b5776c..403058f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabPanel.java
@@ -19,16 +19,8 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.UIManager;
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 /**
  * @since 4.1

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
new file mode 100644
index 0000000..9f217f0
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
@@ -0,0 +1,40 @@
+/*****************************************************************
+ *   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 org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.ClientClassGenerationAction;
+
+public class ClientModeController extends StandardModeController {
+
+    public ClientModeController(CodeGeneratorControllerBase parent) {
+        super(parent);
+    }
+
+    protected GeneratorControllerPanel createView() {
+        this.view = new StandardModePanel();
+        return view;
+    }
+
+    @Override
+    protected ClassGenerationAction newGenerator() {
+        return new ClientClassGenerationAction();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 35aa8d6..db6edb4 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
@@ -20,6 +20,7 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
 import org.apache.cayenne.modeler.util.CayenneController;
@@ -27,8 +28,9 @@ import org.apache.cayenne.swing.BindingBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.JOptionPane;
-import java.awt.Component;
+import javax.swing.*;
+import java.awt.*;
+import java.util.Collections;
 import java.util.function.Predicate;
 
 /**
@@ -47,22 +49,25 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
 
     public CodeGeneratorController(CayenneController parent, ProjectController projectController) {
         super(parent, projectController);
-        initListeners();
         this.classesSelector = new ClassesTabController(this);
         this.generatorSelector = new GeneratorTabController(this);
         view = new CodeGeneratorPane(generatorSelector.getView(), classesSelector.getView());
         initBindings();
+        initListeners();
+    }
+
+    public void startup(DataMap dataMap) {
+        super.startup(dataMap);
+        classesSelectedAction();
+        GeneratorController modeController = generatorSelector.getGeneratorController();
+        ClassGenerationAction classGenerationAction = modeController.createGenerator();
+        modeController.initForm(classGenerationAction);
+        classesSelector.startup();
     }
 
     private void initListeners(){
-        projectController.addDataMapDisplayListener(e -> {
-            super.startup(e.getDataMap());
-            classesSelector.startup();
-
-            GeneratorController modeController = generatorSelector.getGeneratorController();
-            ClassGenerationAction classGenerationAction = modeController.createGenerator();
-            ((CustomModeController)modeController).initForm(classGenerationAction);
-        });
+        projectController.addObjEntityDisplayListener(e -> super.addToSelectedEntities(e.getEntity().getDataMap(), Collections.singleton(e.getEntity().getName())));
+        projectController.addEmbeddableDisplayListener(e -> super.addToSelectedEmbeddables(e.getEmbeddable().getDataMap(), Collections.singleton(e.getEmbeddable().getClassName())));
     }
 
     @Override
@@ -75,7 +80,7 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
                 getApplication().getBindingFactory(),
                 this);
 
-        builder.bindToAction(view.getGenerateButton(), "generateAction()");
+        builder.bindToAction(((GeneratorTabPanel)generatorSelector.getView()).getGenerateButton(), "generateAction()");
         builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
         builder.bindToAction(generatorSelector, "generatorSelectedAction()",
                 GeneratorTabController.GENERATOR_PROPERTY);
@@ -120,26 +125,35 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
             label = label + "One embeddable selected";
         }
         else {
-            label =label + sizeEmb + " embeddables selected";
+            label = label + sizeEmb + " embeddables selected";
         }
-        
-        view.getClassesCount().setText(label);
+
+        label = label.concat("; ");
+
+        if(isDataMapSelected()) {
+            label = label + "DataMap selected";
+        } else {
+            label = label + "No dataMap selected";
+        }
+
+        ((GeneratorTabPanel)generatorSelector.getView()).getClassesCount().setText(label);
         projectController.setDirty(true);
     }
 
     public void generateAction() {
         ClassGenerationAction generator = generatorSelector.getGenerator();
+
         if (generator != null) {
             try {
                 generator.prepareArtifacts();
                 generator.execute();
                 JOptionPane.showMessageDialog(
-                        getView(),
+                        this.getView(),
                         "Class generation finished");
             } catch (Exception e) {
                 logObj.error("Error generating classes", e);
                 JOptionPane.showMessageDialog(
-                        getView(),
+                        this.getView(),
                         "Error generating classes - " + e.getMessage());
             }
         }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 0642fb9..e9c2965 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
@@ -44,35 +44,44 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     public static final String SELECTED_PROPERTY = "selected";
 
-    protected Collection<DataMap> dataMaps;
-
     protected DataMap dataMap;
-
     protected ValidationResult validation;
-
     protected List<Object> classes;
-
-    protected Set<String> selectedEntities;
-    protected Set<String> selectedEmbeddables;
-
+    private Set<String> selectedEntities;
+    private Set<String> selectedEmbeddables;
+    private Set<String> isDataMapSelected;
+    private Map<DataMap, Set<String>> selectedEntitiesForDataMap;
+    private Map<DataMap, Set<String>> selectedEmbeddablesForDataMap;
+    private Map<DataMap, Set<String>> selectedDataMaps;
     protected transient Object currentClass;
-
     protected ProjectController projectController;
 
     public CodeGeneratorControllerBase(CayenneController parent, ProjectController projectController) {
         super(parent);
         this.projectController = projectController;
         this.classes = new ArrayList<>();
-
-        this.selectedEntities = new HashSet<>();
-        this.selectedEmbeddables = new HashSet<>();
+        this.selectedEntitiesForDataMap = new HashMap<>();
+        this.selectedEmbeddablesForDataMap = new HashMap<>();
+        this.selectedDataMaps = new HashMap<>();
     }
 
     public void startup(DataMap dataMap){
         this.dataMap = dataMap;
         classes.clear();
+        this.classes.add(dataMap);
         this.classes.addAll(dataMap.getObjEntities());
         this.classes.addAll(dataMap.getEmbeddables());
+
+        initCollectionsForSelection(dataMap);
+    }
+
+    private void initCollectionsForSelection(DataMap dataMap) {
+        selectedEntities = selectedEntitiesForDataMap.compute(dataMap, (key,value) ->
+                value == null ? new HashSet<>() : value);
+        selectedEmbeddables = selectedEmbeddablesForDataMap.compute(dataMap, (key, value) ->
+                value == null ? new HashSet<>() : value);
+        isDataMapSelected = selectedDataMaps.compute(dataMap, (key, value) ->
+                value == null ? new HashSet<>() : value);
     }
 
     public List<Object> getClasses() {
@@ -104,7 +113,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
     }
 
     public boolean updateSelection(Predicate<Object> predicate) {
-
         boolean modified = false;
 
         for (Object classObj : classes) {
@@ -112,25 +120,35 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
             if (classObj instanceof ObjEntity) {
 
                 if (select) {
-                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+                    if(selectedEntities.add(((ObjEntity) classObj).getName())) {
                         modified = true;
                     }
                 }
                 else {
-                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+                    if(selectedEntities.remove(((ObjEntity) classObj).getName())) {
                         modified = true;
                     }
                 }
             }
             else if (classObj instanceof Embeddable) {
                 if (select) {
-                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+                    if(selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
                         modified = true;
                     }
                 }
                 else {
-                    if (selectedEmbeddables
-                            .remove(((Embeddable) classObj).getClassName())) {
+                    if(selectedEmbeddables.remove(((Embeddable) classObj).getClassName())) {
+                        modified = true;
+                    }
+                }
+            } else if (classObj instanceof DataMap) {
+                updateArtifactGenerationMode(classObj, select);
+                if(select) {
+                    if(isDataMapSelected.add(((DataMap) classObj).getName())) {
+                        modified = true;
+                    }
+                } else {
+                    if(isDataMapSelected.remove(((DataMap) classObj).getName())) {
                         modified = true;
                     }
                 }
@@ -208,8 +226,11 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
             return selectedEmbeddables
                     .contains(((Embeddable) currentClass).getClassName());
         }
+        if(currentClass instanceof DataMap) {
+            return isDataMapSelected
+                    .contains(((DataMap) currentClass).getName());
+        }
         return false;
-
     }
 
     public void setSelected(boolean selectedFlag) {
@@ -221,8 +242,7 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                 if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
-            }
-            else {
+            } else {
                 if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
@@ -233,14 +253,36 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                 if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
-            }
-            else {
+            } else {
                 if (selectedEmbeddables
                         .remove(((Embeddable) currentClass).getClassName())) {
                     firePropertyChange(SELECTED_PROPERTY, null, null);
                 }
             }
         }
+        if(currentClass instanceof DataMap) {
+            updateArtifactGenerationMode(currentClass, selectedFlag);
+            if(selectedFlag) {
+                if(isDataMapSelected.add(dataMap.getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            } else {
+                if(isDataMapSelected
+                        .remove(((DataMap) currentClass).getName())) {
+                    firePropertyChange(SELECTED_PROPERTY, null, null);
+                }
+            }
+        }
+    }
+
+    private void updateArtifactGenerationMode(Object classObj, boolean selected) {
+        DataMap dataMap = (DataMap) classObj;
+        ClassGenerationAction generator = projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+        if(selected) {
+            generator.setArtifactsGenerationMode("all");
+        } else {
+            generator.setArtifactsGenerationMode("entity");
+        }
     }
 
     public JLabel getItemName(Object obj) {
@@ -249,9 +291,12 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
         if (obj instanceof Embeddable) {
             className = ((Embeddable) obj).getClassName();
             icon = CellRenderers.iconForObject(new Embeddable());
-        } else {
+        } else if(obj instanceof ObjEntity) {
             className = ((ObjEntity) obj).getName();
             icon = CellRenderers.iconForObject(new ObjEntity());
+        } else {
+            className = ((DataMap) obj).getName();
+            icon = CellRenderers.iconForObject(new DataMap());
         }
         JLabel labelIcon = new JLabel();
         labelIcon.setIcon(icon);
@@ -270,27 +315,36 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
                     generator.loadEntity(entity.getName());
                 }
             }
-
             for(Embeddable embeddable : getSelectedEmbeddables()) {
                 generator.loadEmbeddable(embeddable.getClassName());
             }
         }
     }
 
-    public void addToSelectedEntities(Collection<String> entities) {
+    public void addToSelectedEntities(DataMap dataMap, Collection<String> entities) {
+        if(selectedEntities == null) {
+            initCollectionsForSelection(dataMap);
+        }
         selectedEntities.addAll(entities);
     }
 
-    public void addToSelectedEmbeddables(Collection<String> embeddables) {
+    public void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
+        if(selectedEmbeddables == null) {
+            initCollectionsForSelection(dataMap);
+        }
         selectedEmbeddables.addAll(embeddables);
     }
 
     public int getSelectedEntitiesSize() {
-        return selectedEntities.size();
+        return selectedEntities != null ? selectedEntities.size() : 0;
     }
 
     public int getSelectedEmbeddablesSize() {
-        return selectedEmbeddables.size();
+        return selectedEmbeddables != null ? selectedEmbeddables.size() : 0;
+    }
+
+    public boolean isDataMapSelected() {
+        return isDataMapSelected != null && isDataMapSelected.size() == 1;
     }
 
     public DataMap getDataMap() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
index cac063c..859cb2d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorPane.java
@@ -19,38 +19,17 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.swing.components.TopBorder;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 /**
  */
 public class CodeGeneratorPane extends JSplitPane {
 
-    protected JSplitPane splitPane;
-
-    protected JButton generateButton;
-    protected JLabel classesCount;
-
     public CodeGeneratorPane(Component generatorPanel, Component entitySelectorPanel) {
         super();
 
-        splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-
-        this.generateButton = new JButton("Generate");
-        this.classesCount = new JLabel("No classes selected");
-        classesCount.setFont(classesCount.getFont().deriveFont(10f));
-
+        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
         JScrollPane scrollPane = new JScrollPane(
                 generatorPanel,
                 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
@@ -61,25 +40,7 @@ public class CodeGeneratorPane extends JSplitPane {
         splitPane.setRightComponent(scrollPane);
         splitPane.setLeftComponent(entitySelectorPanel);
 
-        JPanel messages = new JPanel(new BorderLayout());
-        messages.add(classesCount, BorderLayout.WEST);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.setBorder(TopBorder.create());
-        buttons.add(classesCount);
-        buttons.add(Box.createHorizontalStrut(50));
-        buttons.add(generateButton);
-
         setLayout(new BorderLayout());
         add(splitPane, BorderLayout.CENTER);
-        add(buttons, BorderLayout.SOUTH);
-    }
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JLabel getClassesCount() {
-        return classesCount;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 029f92e..6a081a5 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,7 +26,8 @@ import org.apache.cayenne.swing.BindingBuilder;
 
 import javax.swing.*;
 import java.awt.*;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -34,41 +35,21 @@ import java.util.List;
  */
 public class CustomModeController extends GeneratorController {
 
-    // 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";
-    static final String ALL_MODE_LABEL = "Generate all";
-
-    static final Map<String, String> modesByLabel = new HashMap<>();
-
-    private 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;
 
-    private ClassGenerationAction classGenerationAction;
-
     public CustomModeController(CodeGeneratorControllerBase parent) {
         super(parent);
-        this.view = new CustomModePanel(parent.getProjectController());
         bind();
         initListeners();
     }
 
+    @Override
+    protected GeneratorControllerPanel createView() {
+        this.view = new CustomModePanel(getApplication().getFrameController().getProjectController());
+        return view;
+    }
+
     private void bind() {
-        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
         BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
         builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
 
@@ -76,9 +57,6 @@ public class CustomModeController extends GeneratorController {
     }
 
     protected void updateTemplates() {
-        String[] modeChoices = new String[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL};
-        view.getGenerationMode().getComboBox().setModel(new DefaultComboBoxModel<>(modeChoices));
-
         CodeTemplateManager templateManager = getApplication().getCodeTemplateManager();
 
         List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
@@ -92,30 +70,8 @@ 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);
-
-        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().getComboBox().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
         this.view.getSuperclassTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-
-        this.view.getEmbeddableTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableTemplates.toArray(new String[0])));
-        this.view.getEmbeddableSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(embeddableSuperTemplates.toArray(new String[0])));
-
-        this.view.getDataMapTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapTemplates.toArray(new String[0])));
-        this.view.getDataMapSuperTemplate().getComboBox().setModel(new DefaultComboBoxModel<>(dataMapSuperTemplates.toArray(new String[0])));
     }
 
     public Component getView() {
@@ -129,21 +85,14 @@ public class CustomModeController extends GeneratorController {
     }
 
     private void updateComboBoxes() {
-        view.getEmbeddableTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableTemplate()));
-        view.getEmbeddableSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getEmbeddableSuperTemplate()));
         view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate()));
         view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate()));
-        view.getGenerationMode().setItem(labelByMode.get(classGenerationAction.getArtifactsGenerationMode()));
-        view.getDataMapTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQueryTemplate()));
-        view.getDataMapSuperTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getQuerySuperTemplate()));
-
         view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
     @Override
     protected ClassGenerationAction newGenerator() {
         ClassGenerationAction action = new ClassGenerationAction();
-        action.setDefaults();
         getApplication().getInjector().injectMembers(action);
         return action;
     }
@@ -168,19 +117,25 @@ public class CustomModeController extends GeneratorController {
             classGenerationAction.setUsePkgPath(view.getUsePackagePath().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
+
+        view.getPkProperties().addActionListener(val -> {
+            classGenerationAction.setCreatePKProperties(view.getPkProperties().isSelected());
+            getParentController().getProjectController().setDirty(true);
+        });
     }
 
     public void initForm(ClassGenerationAction classGenerationAction){
-        this.classGenerationAction = classGenerationAction;
-        view.getOutputFolder().setText(classGenerationAction.getDir());
-        view.setDataMapName(classGenerationAction.getDataMap().getName());
+        super.initForm(classGenerationAction);
         view.getOutputPattern().setText(classGenerationAction.getOutputPattern());
         view.getPairs().setSelected(classGenerationAction.isMakePairs());
         view.getUsePackagePath().setSelected(classGenerationAction.isUsePkgPath());
         view.getOverwrite().setSelected(classGenerationAction.isOverwrite());
         view.getCreatePropertyNames().setSelected(classGenerationAction.isCreatePropertyNames());
-        view.getSuperclassPackage().setText(classGenerationAction.getSuperPkg());
-        view.getEncoding().setText(classGenerationAction.getEncoding());
+        view.getPkProperties().setSelected(classGenerationAction.isCreatePKProperties());
+        if(classGenerationAction.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
+            ((CodeGeneratorControllerBase)parent).setCurrentClass(classGenerationAction.getDataMap());
+            ((CodeGeneratorControllerBase)parent).setSelected(true);
+        }
         updateComboBoxes();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 9213a86..a8c0183 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java
@@ -29,48 +29,24 @@ import org.apache.cayenne.swing.components.JCayenneCheckBox;
 import org.apache.cayenne.swing.control.ActionLink;
 import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
+import javax.swing.*;
+import java.awt.*;
 
 public class CustomModePanel extends GeneratorControllerPanel {
 
-    private ComboBoxAdapter<String> generationMode;
     private ComboBoxAdapter<String> subclassTemplate;
     private ComboBoxAdapter<String> superclassTemplate;
-    private ComboBoxAdapter<String> embeddableTemplate;
-    private ComboBoxAdapter<String> embeddableSuperTemplate;
-    private ComboBoxAdapter<String> dataMapTemplate;
-    private ComboBoxAdapter<String> dataMapSuperTemplate;
     private JCheckBox pairs;
     private JCheckBox overwrite;
     private JCheckBox usePackagePath;
     private TextAdapter outputPattern;
     private JCheckBox createPropertyNames;
-    private TextAdapter superclassPackage;
-
-    private TextAdapter encoding;
-
-    private JLabel dataMapName;
+    private JCheckBox pkProperties;
 
     private ActionLink manageTemplatesLink;
 
     CustomModePanel(ProjectController projectController) {
         super(projectController);
-
-        JComboBox<String> modeField = new JComboBox<>();
-        this.generationMode = new ComboBoxAdapter<String>(modeField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setArtifactsGenerationMode(CustomModeController.modesByLabel.get(item));
-                projectController.setDirty(true);
-            }
-        };
-
         JComboBox<String> superclassField = new JComboBox<>();
         this.superclassTemplate = new ComboBoxAdapter<String>(superclassField) {
             @Override
@@ -89,24 +65,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
             }
         };
 
-        JComboBox<String> dataMapField = new JComboBox<>();
-        this.dataMapTemplate = new ComboBoxAdapter<String>(dataMapField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setQueryTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> dataMapSuperField = new JComboBox<>();
-        this.dataMapSuperTemplate = new ComboBoxAdapter<String>(dataMapSuperField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setQuerySuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
         this.pairs = new JCayenneCheckBox();
         this.overwrite = new JCayenneCheckBox();
         this.usePackagePath = new JCayenneCheckBox();
@@ -114,52 +72,15 @@ public class CustomModePanel extends GeneratorControllerPanel {
         JTextField outputPatternField = new JTextField();
         this.outputPattern = new TextAdapter(outputPatternField) {
             protected void updateModel(String text) {
-                getCgenByDataMap().setOutputPattern(text);
-                projectController.setDirty(true);
+
             }
         };
 
         this.createPropertyNames = new JCayenneCheckBox();
+        this.pkProperties = new JCayenneCheckBox();
         this.manageTemplatesLink = new ActionLink("Customize Templates...");
         this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
 
-        JTextField superclassPackageField = new JTextField();
-        this.superclassPackage = new TextAdapter(superclassPackageField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setSuperPkg(text);
-                projectController.setDirty(true);
-            }
-        };
-
-        JTextField encodingField = new JTextField();
-        this.encoding = new TextAdapter(encodingField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setEncoding(text);
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> embeddableField = new JComboBox<>();
-        this.embeddableTemplate = new ComboBoxAdapter<String>(embeddableField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setEmbeddableTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        JComboBox<String> embeddableSuperclassField = new JComboBox<>();
-        this.embeddableSuperTemplate = new ComboBoxAdapter<String>(embeddableSuperclassField) {
-            @Override
-            protected void updateModel(String item) throws ValidationException {
-                getCgenByDataMap().setEmbeddableSuperTemplate(Application.getInstance().getCodeTemplateManager().getTemplatePath(String.valueOf(item)));
-                projectController.setDirty(true);
-            }
-        };
-
-        this.dataMapName = new JLabel();
-        this.dataMapName.setFont(dataMapName.getFont().deriveFont(1));
-
         pairs.addChangeListener(e -> {
            setDisableSuperComboBoxes(pairs.isSelected());
             overwrite.setEnabled(!pairs.isSelected());
@@ -167,40 +88,22 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
         // assemble
         FormLayout layout = new FormLayout(
-                "right:100dlu, 3dlu, fill:100:grow, 6dlu, fill:50dlu, 3dlu", "");
+                "right:79dlu, 1dlu, fill:300:grow, 1dlu, left:100dlu, 100dlu", "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
 
         builder.append("Output Directory:", outputFolder.getComponent(), selectOutputFolder);
         builder.nextLine();
 
-        builder.append("Generation Mode:", generationMode.getComboBox());
-        builder.nextLine();
-
-        builder.append("DataMap Template:", dataMapTemplate.getComboBox());
-        builder.nextLine();
-
-        builder.append("DataMap Superclass Template", dataMapSuperTemplate.getComboBox());
-        builder.nextLine();
-
         builder.append("Subclass Template:", subclassTemplate.getComboBox());
         builder.nextLine();
 
         builder.append("Superclass Template:", superclassTemplate.getComboBox());
         builder.nextLine();
 
-        builder.append("Embeddable Template", embeddableTemplate.getComboBox());
-        builder.nextLine();
-
-        builder.append("Embeddable Super Template", embeddableSuperTemplate.getComboBox());
-        builder.nextLine();
-
         builder.append("Output Pattern:", outputPattern.getComponent());
         builder.nextLine();
 
-        builder.append("Encoding", encoding.getComponent());
-        builder.nextLine();
-
         builder.append("Make Pairs:", pairs);
         builder.nextLine();
 
@@ -213,11 +116,9 @@ public class CustomModePanel extends GeneratorControllerPanel {
         builder.append("Create Property Names:", createPropertyNames);
         builder.nextLine();
 
-        builder.append(dataMapName);
+        builder.append("Create PK properties:", pkProperties);
         builder.nextLine();
 
-        builder.append("Superclass package", superclassPackage.getComponent());
-
         setLayout(new BorderLayout());
         add(builder.getPanel(), BorderLayout.CENTER);
 
@@ -230,12 +131,6 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     public void setDisableSuperComboBoxes(boolean val){
         superclassTemplate.getComboBox().setEnabled(val);
-        embeddableSuperTemplate.getComboBox().setEnabled(val);
-        dataMapSuperTemplate.getComboBox().setEnabled(val);
-    }
-
-    public ComboBoxAdapter<String> getGenerationMode() {
-        return generationMode;
     }
 
     public ActionLink getManageTemplatesLink() {
@@ -244,18 +139,10 @@ public class CustomModePanel extends GeneratorControllerPanel {
 
     public ComboBoxAdapter<String> getSubclassTemplate() { return subclassTemplate; }
 
-    public ComboBoxAdapter<String> getEmbeddableTemplate() { return embeddableTemplate; }
-
-    public ComboBoxAdapter<String> getEmbeddableSuperTemplate() { return embeddableSuperTemplate; }
-
     public ComboBoxAdapter<String> getSuperclassTemplate() {
         return superclassTemplate;
     }
 
-    public ComboBoxAdapter<String> getDataMapTemplate() { return dataMapTemplate; }
-
-    public ComboBoxAdapter<String> getDataMapSuperTemplate() { return dataMapSuperTemplate; }
-
     public JCheckBox getOverwrite() {
         return overwrite;
     }
@@ -276,13 +163,7 @@ public class CustomModePanel extends GeneratorControllerPanel {
         return createPropertyNames;
     }
 
-    public TextAdapter getSuperclassPackage() {
-        return superclassPackage;
-    }
-
-    public TextAdapter getEncoding() { return encoding; }
-
-    public void setDataMapName(String mapName){
-        dataMapName.setText(mapName);
+    public JCheckBox getPkProperties() {
+        return pkProperties;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 7a8b5cb..6b8db21 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
@@ -19,19 +19,11 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
 import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.*;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CodeValidationUtil;
@@ -43,14 +35,15 @@ import org.apache.cayenne.validation.SimpleValidationFailure;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
+import javax.swing.*;
 import java.io.File;
-import java.util.Map;
-import java.util.Set;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.function.Predicate;
 import java.util.prefs.Preferences;
+import java.util.stream.Collectors;
 
 /**
  * A mode-specific part of the code generation dialog.
@@ -59,30 +52,13 @@ import java.util.prefs.Preferences;
 public abstract class GeneratorController extends CayenneController {
 
     protected String mode = ArtifactsGenerationMode.ENTITY.getLabel();
-    protected Map<DataMap, DataMapDefaults> mapPreferences;
-    private String outputPath;
+    protected ClassGenerationAction classGenerationAction;
 
     public GeneratorController(CodeGeneratorControllerBase parent) {
         super(parent);
-    }
 
-    public void setOutputPath(String path) {
-        String old = this.outputPath;
-        this.outputPath = path;
-        if (this.outputPath != null && !this.outputPath.equals(old)) {
-            updatePreferences(path);
-        }
-    }
-
-    public void updatePreferences(String path) {
-        if (mapPreferences == null)
-            return;
-        Set<DataMap> keys = mapPreferences.keySet();
-        for (DataMap key : keys) {
-            mapPreferences
-                    .get(key)
-                    .setOutputPath(path);
-        }
+        createView();
+        initBindings(new BindingBuilder(getApplication().getBindingFactory(), this));
     }
 
     protected void initBindings(BindingBuilder bindingBuilder) {
@@ -94,6 +70,8 @@ public abstract class GeneratorController extends CayenneController {
         return (CodeGeneratorControllerBase) getParent();
     }
 
+    protected abstract GeneratorControllerPanel createView();
+
     /**
      * Creates an appropriate subclass of {@link ClassGenerationAction},
      * returning it in an unconfigured state. Configuration is performed by
@@ -101,55 +79,64 @@ public abstract class GeneratorController extends CayenneController {
      */
     protected abstract ClassGenerationAction newGenerator();
 
+    protected void initForm(ClassGenerationAction classGenerationAction) {
+        this.classGenerationAction = classGenerationAction;
+        classGenerationAction.setRootPath(Paths.get(initOutputFolder()));
+        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(classGenerationAction.getDir());
+    }
+
     /**
      * Creates a class generator for provided selections.
      */
     public ClassGenerationAction createGenerator() {
         DataMap map = getParentController().getProjectController().getCurrentDataMap();
-
         ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
         if(generator != null){
-            getParentController().addToSelectedEntities(generator.getEntities());
-            getParentController().addToSelectedEmbeddables(generator.getEmbeddables());
+            getParentController().addToSelectedEntities(generator.getDataMap(), generator.getEntities());
+            getParentController().addToSelectedEmbeddables(generator.getDataMap(), generator.getEmbeddables());
             return generator;
         }
 
         try {
             generator = newGenerator();
             generator.setDataMap(map);
-            initOutputFolder();
-            File outputDir = new File(outputPath);
+
+            Path basePath = Paths.get(initOutputFolder());
 
             // no destination folder
-            if (outputDir == null) {
+            if (basePath == null) {
                 JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
                 return null;
             }
 
             // no such folder
-            if (!outputDir.exists() && !outputDir.mkdirs()) {
-                JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir
-                        + ". Select a different one.");
-                return null;
+            if (!Files.exists(basePath)) {
+                Files.createDirectories(basePath);
             }
 
             // not a directory
-            if (!outputDir.isDirectory()) {
-                JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory.");
+            if (!Files.isDirectory(basePath)) {
+                JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
                 return null;
             }
 
-            generator.setDestDir(outputDir);
-
+            generator.setRootPath(basePath);
             Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
-
             if (preferences != null) {
                 generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
             }
-
+            getParentController().addToSelectedEntities(map, map.getObjEntities()
+                    .stream()
+                    .map(Entity::getName)
+                    .collect(Collectors.toList()));
+            getParentController().addToSelectedEmbeddables(map, map.getEmbeddables()
+                    .stream()
+                    .map(Embeddable::getClassName)
+                    .collect(Collectors.toList()));
             getParentController().projectController.getApplication().getMetaData().add(map, generator);
-        } catch (CayenneRuntimeException exception) {
-            JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage());
+        } catch (IOException exception) {
+            JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
+                    ". Select a different one.");
             return null;
         }
 
@@ -202,7 +189,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateEmbeddable(Embeddable embeddable) {
+    private ValidationFailure validateEmbeddable(Embeddable embeddable) {
 
         String name = embeddable.getClassName();
 
@@ -258,7 +245,7 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    protected ValidationFailure validateEntity(ObjEntity entity) {
+    private ValidationFailure validateEntity(ObjEntity entity) {
 
         String name = entity.getName();
 
@@ -288,7 +275,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateAttribute(ObjAttribute attribute) {
+    private ValidationFailure validateAttribute(ObjAttribute attribute) {
 
         String name = attribute.getEntity().getName();
 
@@ -319,7 +306,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
+    private ValidationFailure validateEmbeddedAttribute(ObjAttribute attribute) {
 
         String name = attribute.getEntity().getName();
 
@@ -368,7 +355,7 @@ public abstract class GeneratorController extends CayenneController {
         return null;
     }
 
-    protected ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
+    private ValidationFailure validateRelationship(ObjRelationship relationship, boolean clientValidation) {
 
         String name = relationship.getSourceEntity().getName();
 
@@ -417,34 +404,17 @@ public abstract class GeneratorController extends CayenneController {
      * Returns a predicate for default entity selection in a given mode.
      */
     public Predicate getDefaultClassFilter() {
-        final ObjEntity selectedEntity = Application.getInstance().getFrameController().getProjectController()
-                .getCurrentObjEntity();
-
-        final Embeddable selectedEmbeddable = Application.getInstance().getFrameController().getProjectController()
-                .getCurrentEmbeddable();
-
-        if (selectedEntity != null) {
-            // select a single entity
-            final boolean hasProblem = getParentController().getProblem(selectedEntity.getName()) != null;
-            return object -> !hasProblem && object == selectedEntity;
-        } else if (selectedEmbeddable != null) {
-            // select a single embeddable
-            final boolean hasProblem = getParentController().getProblem(selectedEmbeddable.getClassName()) != null;
-            return object -> !hasProblem && object == selectedEmbeddable;
-        } else {
-            // select all entities
-            return object -> {
-                if (object instanceof ObjEntity) {
-                    return getParentController().getProblem(((ObjEntity) object).getName()) == null;
-                }
+        return object -> {
+            if (object instanceof ObjEntity) {
+                return getParentController().getProblem(((ObjEntity) object).getName()) == null;
+            }
 
-                if (object instanceof Embeddable) {
-                    return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
-                }
+            if (object instanceof Embeddable) {
+                return getParentController().getProblem(((Embeddable) object).getClassName()) == null;
+            }
 
-                return false;
-            };
-        }
+            return false;
+        };
     }
 
     /**
@@ -452,6 +422,7 @@ public abstract class GeneratorController extends CayenneController {
      * generation directory.
      */
     public void selectOutputFolderAction() {
+
         TextAdapter outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder();
 
         String currentDir = outputFolder.getComponent().getText();
@@ -479,9 +450,23 @@ public abstract class GeneratorController extends CayenneController {
         }
     }
 
-    private void initOutputFolder() {
-        String pathString = System.getProperty("user.home");
-        setOutputPath(pathString);
+    private String initOutputFolder() {
+        String path;
+        if (System.getProperty("cayenne.cgen.destdir") != null) {
+            return 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) {
+                return path;
+            } else {
+                File lastDir = lastPath.getExistingDirectory(false);
+                return lastDir != null ? lastDir.getAbsolutePath() : ".";
+            }
+        }
     }
 
     private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/6a43436a/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 281046d..98e7841 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
@@ -23,11 +23,11 @@ import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.validation.ValidationException;
 
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.io.File;
+import javax.swing.*;
+import java.util.ArrayList;
+import java.util.Collection;
 
 /**
  * A generic panel that is a superclass of generator panels, defining common fields.
@@ -35,27 +35,24 @@ import java.io.File;
  */
 public class GeneratorControllerPanel extends JPanel {
 
+    protected Collection<StandardPanelComponent> dataMapLines;
     protected TextAdapter outputFolder;
     protected JButton selectOutputFolder;
-
-    ProjectController projectController;
+    protected ProjectController projectController;
 
     public GeneratorControllerPanel(ProjectController projectController) {
+        this.dataMapLines = new ArrayList<>();
         this.projectController = projectController;
-        JTextField outputFolderField = new JTextField();
-        this.outputFolder = new TextAdapter(outputFolderField) {
-            protected void updateModel(String text) {
-                getCgenByDataMap().setDestDir(new File(text));
+        this.outputFolder = new TextAdapter(new JTextField()) {
+            @Override
+            protected void updateModel(String text) throws ValidationException {
+                getCgenByDataMap().setRelPath(text);
                 projectController.setDirty(true);
             }
         };
         this.selectOutputFolder = new JButton("Select");
     }
 
-    public ClassGenerationAction getCgenByDataMap() {
-        DataMap dataMap = projectController.getCurrentDataMap();
-        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
-    }
     public TextAdapter getOutputFolder() {
         return outputFolder;
     }
@@ -63,4 +60,9 @@ public class GeneratorControllerPanel extends JPanel {
     public JButton getSelectOutputFolder() {
         return selectOutputFolder;
     }
+
+    public ClassGenerationAction getCgenByDataMap() {
+        DataMap dataMap = projectController.getCurrentDataMap();
+        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+    }
 }


[09/32] cayenne git commit: Create tests for maven, ant and gradle

Posted by nt...@apache.org.
Create tests for maven, ant and gradle


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

Branch: refs/heads/master
Commit: 93da6be17b9b8cd5ad9c4cb5184565b426991393
Parents: d9db6e3
Author: Arseni Bulatski <an...@gmail.com>
Authored: Fri Jun 29 13:42:55 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Wed Oct 24 13:44:26 2018 +0300

----------------------------------------------------------------------
 .../cayenne/tools/CgenWithConfigTest.java       | 91 ++++++++++++++++++++
 cayenne-ant/src/test/resources/cgenTest.map.xml | 27 ++++++
 .../cayenne/tools/CgenTaskWithConfigIT.java     | 71 +++++++++++++++
 .../org/apache/cayenne/tools/cgenMap.map.xml    | 27 ++++++
 .../cayenne/tools/cgen_with_config.gradle       | 28 ++++++
 .../cayenne/tools/CayenneGeneratorMojo.java     |  2 +
 .../cayenne/tools/CgenWithConfigMojoTest.java   | 51 +++++++++++
 .../resources/cgen/project-to-test/cgen-pom.xml | 48 +++++++++++
 .../src/test/resources/cgen/testCgenMap.map.xml | 27 ++++++
 9 files changed, 372 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
new file mode 100644
index 0000000..cdccd49
--- /dev/null
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
@@ -0,0 +1,91 @@
+/*****************************************************************
+ *   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.tools;
+
+import org.apache.cayenne.test.file.FileUtil;
+import org.apache.cayenne.test.resource.ResourceUtil;
+import org.apache.tools.ant.Location;
+import org.apache.tools.ant.Project;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @since 4.1
+ */
+public class CgenWithConfigTest {
+
+    private static final File baseDir;
+    private static final File map;
+
+    static {
+        baseDir = FileUtil.baseTestDirectory();
+        map = new File(baseDir, "antmap-cgen.xml");
+
+        ResourceUtil.copyResourceToFile("cgenTest.map.xml", map);
+    }
+
+    protected CayenneGeneratorTask task;
+
+    @Before
+    public void setUp() {
+
+        Project project = new Project();
+        project.setBaseDir(baseDir);
+
+        task = new CayenneGeneratorTask();
+        task.setProject(project);
+        task.setTaskName("Test");
+        task.setLocation(Location.UNKNOWN_LOCATION);
+    }
+
+    @Test
+    public void testCgen() throws Exception {
+        File mapDir = new File(baseDir, "cgenConfigTest");
+        assertTrue(mapDir.mkdirs());
+
+        task.setDestDir(mapDir);
+        task.setMap(map);
+        task.setMode("entity");
+
+        // run task
+        task.execute();
+
+        // check results
+        File entity = new File(mapDir, convertPath("ObjEntity1.txt"));
+        assertTrue(entity.isFile());
+
+        File datamap = new File(mapDir, convertPath("TestCgenMap.txt"));
+        assertFalse(datamap.exists());
+
+        File notIncludedEntity = new File(mapDir, "ObjEntity.txt");
+        assertFalse(notIncludedEntity.exists());
+
+        File notIncludeSuperDatamap = new File("_TestCgenMap.txt");
+        assertFalse(notIncludeSuperDatamap.exists());
+    }
+
+    private String convertPath(String unixPath) {
+        return unixPath.replace('/', File.separatorChar);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/cayenne-ant/src/test/resources/cgenTest.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/resources/cgenTest.map.xml b/cayenne-ant/src/test/resources/cgenTest.map.xml
new file mode 100644
index 0000000..930acbc
--- /dev/null
+++ b/cayenne-ant/src/test/resources/cgenTest.map.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <objEntity>
+            <name>ObjEntity1</name>
+        </objEntity>
+        <generationMode>all</generationMode>
+        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
+        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
+        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
+        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
+        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
+        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>false</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwriteSubclasses>false</overwriteSubclasses>
+        <createPropertyNames>false</createPropertyNames>
+        <encoding>UTF-8</encoding>
+    </cgen>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
new file mode 100644
index 0000000..bf981ec
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskWithConfigIT.java
@@ -0,0 +1,71 @@
+/*****************************************************************
+ *   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.tools;
+
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.gradle.testkit.runner.TaskOutcome;
+import org.junit.Test;
+
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @since 4.1
+ */
+public class CgenTaskWithConfigIT extends BaseTaskIT{
+
+    @Test
+    public void cgenWithConfig() throws Exception {
+        GradleRunner runner = createRunner(
+                "cgen_with_config",
+                "cgen",
+                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenMap.map.xml").getFile(), "UTF-8")
+        );
+
+        BuildResult result = runner.forwardOutput().build();
+
+        String generatedDirectoryPath = projectDir.getAbsolutePath() + "/customDirectory/";
+
+        String generatedClassPath = generatedDirectoryPath + "ObjEntity1.txt";
+        String datamap = generatedDirectoryPath + "TestCgenMap.txt";
+        String notIncludedEntity = generatedDirectoryPath + "ObjEntity.txt";
+        String notIncludedSuperDatamap = generatedDirectoryPath + "_TestCgenMap.txt";
+
+        File notIncludeSuperDatamap = new File("_TestCgenMap.txt");
+        assertFalse(notIncludeSuperDatamap.exists());
+
+        File generatedClass = new File(generatedClassPath);
+        File generatedDatamap = new File(datamap);
+        File generatedNotIncludedEntity = new File(notIncludedEntity);
+        File generatedNotIncludedSuperDatamap = new File(notIncludedSuperDatamap);
+
+        assertTrue(generatedClass.exists());
+        assertFalse(generatedDatamap.exists());
+        assertFalse(generatedNotIncludedEntity.exists());
+        assertFalse(generatedNotIncludedSuperDatamap.exists());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
new file mode 100644
index 0000000..930acbc
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenMap.map.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <objEntity>
+            <name>ObjEntity1</name>
+        </objEntity>
+        <generationMode>all</generationMode>
+        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
+        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
+        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
+        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
+        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
+        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>false</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwriteSubclasses>false</overwriteSubclasses>
+        <createPropertyNames>false</createPropertyNames>
+        <encoding>UTF-8</encoding>
+    </cgen>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
new file mode 100644
index 0000000..3cad46e
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.gradle
@@ -0,0 +1,28 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+
+plugins {
+    id 'org.apache.cayenne'
+}
+
+cgen {
+    map dataMap
+    destDir = './customDirectory'
+    mode = 'entity'
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/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 e57d306..3bdf08b 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
@@ -217,6 +217,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		// Create the destination directory if necessary.
 		// TODO: (KJM 11/2/06) The destDir really should be added as a
 		// compilation resource for maven.
+
 		if (!destDir.exists()) {
 			destDir.mkdirs();
 		}
@@ -238,6 +239,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 
 			ClassGenerationAction generator = createGenerator(dataMap);
 			generator.setLogger(logger);
+
 			if(force) {
 				// will (re-)generate all files
 				generator.setForce(true);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
new file mode 100644
index 0000000..2532db5
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CgenWithConfigMojoTest.java
@@ -0,0 +1,51 @@
+/*****************************************************************
+ *   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.tools;
+
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+
+import java.io.File;
+
+/**
+ * @since 4.1
+ */
+public class CgenWithConfigMojoTest extends AbstractMojoTestCase {
+
+    public void testCgen() throws Exception {
+        File pom = getTestFile("src/test/resources/cgen/project-to-test/cgen-pom.xml");
+        assertNotNull(pom);
+        assertTrue(pom.exists());
+
+        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen", pom);
+        assertNotNull(myMojo);
+        myMojo.execute();
+
+        File testEntity = new File("target/cgenClasses/ObjEntity1.txt");
+        File notIncludedDataMapEntity = new File("target/cgenClasses/TestCgenMap.txt");
+
+        File notIncludedEntity = new File("target/cgenClasses/ObjEntity.txt");
+        File notIncludedSuperDataMap = new File("target/cgenClasses/_TestCgenMap.txt");
+
+        assertTrue(testEntity.exists());
+        assertFalse(notIncludedDataMapEntity.exists());
+
+        assertFalse(notIncludedEntity.exists());
+        assertFalse(notIncludedSuperDataMap.exists());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
new file mode 100644
index 0000000..eadddc6
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/project-to-test/cgen-pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+	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.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+	http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <name>Test CayenneCgenMojo</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>cayenne-maven-plugin</artifactId>
+                <configuration>
+                    <map>src/test/resources/cgen/testCgenMap.map.xml</map>
+                    <destDir>target/cgenClasses</destDir>
+                    <mode>entity</mode>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/93da6be1/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
new file mode 100644
index 0000000..930acbc
--- /dev/null
+++ b/maven-plugins/cayenne-maven-plugin/src/test/resources/cgen/testCgenMap.map.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <objEntity>
+            <name>ObjEntity1</name>
+        </objEntity>
+        <generationMode>all</generationMode>
+        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
+        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
+        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
+        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
+        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
+        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>false</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwriteSubclasses>false</overwriteSubclasses>
+        <createPropertyNames>false</createPropertyNames>
+        <encoding>UTF-8</encoding>
+    </cgen>
+</data-map>


[27/32] cayenne git commit: Some fixes

Posted by nt...@apache.org.
Some fixes


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

Branch: refs/heads/master
Commit: 3225c39e18631e663395fea5a59b399d6fbc77d0
Parents: 397d29f
Author: Arseni Bulatski <an...@gmail.com>
Authored: Tue Nov 13 17:20:53 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Tue Nov 13 17:20:53 2018 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/modeler/CodeTemplateManager.java     | 2 +-
 .../apache/cayenne/modeler/editor/cgen/CustomModeController.java | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3225c39e/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 7579d5d..a5d2fb6 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
@@ -169,7 +169,7 @@ public class CodeTemplateManager {
 	}
 
 	public String getNameByPath(String name, Path rootPath) {
-		String fullPath = rootPath.resolve(Paths.get(name)).toString();
+		String fullPath = rootPath.resolve(Paths.get(name)).normalize().toString();
 		if(reverseCustomTemplate.containsKey(fullPath)){
 			return reverseCustomTemplate.get(fullPath);
 		} else {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3225c39e/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 a6be13b..07f7828 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
@@ -103,8 +103,8 @@ public class CustomModeController extends GeneratorController {
                 cgenConfiguration.getTemplate(), cgenConfiguration.getRootPath());
         String superTemplateName = getApplication().getCodeTemplateManager().getNameByPath(
                 cgenConfiguration.getSuperTemplate(), cgenConfiguration.getRootPath());
-        String path = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getTemplate())).toString();
-        String superPath = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getSuperTemplate())).toString();
+        String path = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getTemplate())).normalize().toString();
+        String superPath = cgenConfiguration.getRootPath().resolve(Paths.get(cgenConfiguration.getSuperTemplate())).normalize().toString();
         if(templateName == null && superTemplateName == null) {
             view.getSubclassTemplate().setItem(null);
             view.getSuperclassTemplate().setItem(null);


[22/32] cayenne git commit: Cgen task refactoring

Posted by nt...@apache.org.
Cgen task refactoring


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

Branch: refs/heads/master
Commit: b30e5eb5d9e22f7ff0c7d3e8763d9b990bd8cb4d
Parents: a5c2ceb
Author: Arseni Bulatski <an...@gmail.com>
Authored: Fri Nov 9 15:23:06 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Fri Nov 9 16:40:51 2018 +0300

----------------------------------------------------------------------
 RELEASE-NOTES.txt                               |   1 +
 .../cayenne/tools/CayenneGeneratorTask.java     |  42 +-
 .../cayenne/tools/CgenWithConfigTest.java       |   4 +-
 .../apache/cayenne/gen/CgenConfiguration.java   |  71 ++-
 .../cayenne/gen/ClassGenerationAction.java      |  24 +-
 .../apache/cayenne/gen/EmbeddableArtifact.java  |  12 +-
 .../org/apache/cayenne/gen/EntityArtifact.java  |  12 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      |  14 +
 .../cayenne/gen/xml/CgenSaverDelegate.java      |   2 +-
 .../CayenneGeneratorEmbeddableFilterAction.java |   5 +
 .../CayenneGeneratorEntityFilterAction.java     |  13 -
 .../java/org/apache/cayenne/tools/CgenTask.java |  44 +-
 .../org/apache/cayenne/tools/BaseTaskIT.java    |  15 +
 .../org/apache/cayenne/tools/CgenTaskIT.java    |  12 +-
 .../apache/cayenne/tools/DbGenerateTaskIT.java  |   4 +-
 .../apache/cayenne/tools/GradlePluginIT.java    |   2 +-
 .../org/apache/cayenne/tools/cgenConfig.map.xml |  22 -
 .../cayenne/tools/cgen_with_config.map.xml      |  22 +
 .../cayenne/project/CompoundSaverDelegate.java  |  13 +-
 .../main/java/org/apache/cayenne/util/Util.java |  33 +-
 .../org/apache/cayenne/schema/10/cgen.xsd       |  47 ++
 .../cayenne/tools/CayenneGeneratorMojo.java     |  46 +-
 .../cayenne/tools/CayenneGeneratorMojoTest.java |   2 +-
 .../cayenne/modeler/CayenneModelerFrame.java    |  79 ++-
 .../dialog/codegen/ClassesTabController.java    | 203 -------
 .../modeler/dialog/codegen/ClassesTabPanel.java | 141 -----
 .../dialog/codegen/ClientModeController.java    |  81 ---
 .../dialog/codegen/CodeGeneratorController.java | 169 ------
 .../codegen/CodeGeneratorControllerBase.java    | 380 -------------
 .../dialog/codegen/CodeGeneratorDialog.java     |  99 ----
 .../dialog/codegen/CustomModeController.java    | 235 --------
 .../modeler/dialog/codegen/CustomModePanel.java | 137 -----
 .../codegen/CustomPreferencesUpdater.java       | 209 -------
 .../dialog/codegen/GeneratorController.java     | 561 -------------------
 .../codegen/GeneratorControllerPanel.java       |  55 --
 .../dialog/codegen/GeneratorTabController.java  | 115 ----
 .../dialog/codegen/GeneratorTabPanel.java       |  65 ---
 .../dialog/codegen/StandardModeController.java  |  82 ---
 .../dialog/codegen/StandardModePanel.java       |  42 --
 .../dialog/codegen/StandardPanelComponent.java  |  81 ---
 .../modeler/editor/DataDomainTabbedView.java    |   4 +-
 .../modeler/editor/DataMapTabbedView.java       |  40 +-
 .../editor/cgen/ClassesTabController.java       |  11 +-
 .../editor/cgen/ClientModeController.java       |   7 +-
 .../editor/cgen/CodeGeneratorController.java    |  21 +-
 .../cgen/CodeGeneratorControllerBase.java       |  82 +++
 .../editor/cgen/CustomModeController.java       |  28 +-
 .../modeler/editor/cgen/CustomModePanel.java    |  17 +-
 .../editor/cgen/GeneratorController.java        |  69 +--
 .../editor/cgen/GeneratorControllerPanel.java   |  10 +-
 .../editor/cgen/GeneratorTabController.java     |   7 +-
 .../modeler/editor/cgen/GeneratorTabPanel.java  |   1 +
 .../editor/cgen/StandardModeController.java     |   8 +-
 .../modeler/editor/cgen/StandardModePanel.java  |   4 +-
 .../editor/cgen/StandardPanelComponent.java     |  63 ---
 .../modeler/editor/cgen/domain/CgenPanel.java   |  19 +
 .../modeler/editor/cgen/domain/CgenTab.java     |  19 +
 .../editor/cgen/domain/CgenTabController.java   |  28 +-
 .../cayenne/modeler/util/ModelerUtil.java       |   3 +
 59 files changed, 592 insertions(+), 3045 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index fd08cdc..d701e29 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -25,6 +25,7 @@ CAY-2485 Compact Slf4j Logger
 CAY-2487 Removed usage of CayenneException.
 CAY-2489 Add validation to the case of not to PK relationships
 CAY-2491 Remaster Db Import View
+CAY-2493 Save cgen configuration with datamap XML
 
 Bug Fixes:
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index 02cc0bf..6291a6d 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -35,8 +35,6 @@ import org.apache.velocity.VelocityContext;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.nio.file.Files;
-import java.nio.file.Paths;
 
 /**
  * An Ant task to perform class generation based on CayenneDataMap.
@@ -47,12 +45,15 @@ public class CayenneGeneratorTask extends CayenneTask {
 
     protected String includeEntitiesPattern;
     protected String excludeEntitiesPattern;
+    /**
+     * @since 4.1
+     */
     protected String excludeEmbeddablesPattern;
     protected VPPConfig vppConfig;
 
     protected File map;
     protected File additionalMaps[];
-    protected boolean client;
+    protected Boolean client;
     protected File destDir;
     protected String encoding;
     protected Boolean makepairs;
@@ -67,8 +68,11 @@ public class CayenneGeneratorTask extends CayenneTask {
     protected String querytemplate;
     protected String querysupertemplate;
     protected Boolean usepkgpath;
-    protected boolean createpropertynames;
+    protected Boolean createpropertynames;
 
+    /**
+     * @since 4.1
+     */
     private boolean force;
 
     private boolean useConfigFromDataMap;
@@ -80,7 +84,7 @@ public class CayenneGeneratorTask extends CayenneTask {
      *
      * @since 4.1
      */
-    protected boolean createpkproperties;
+    protected Boolean createpkproperties;
 
     public CayenneGeneratorTask() {
     }
@@ -106,7 +110,6 @@ public class CayenneGeneratorTask extends CayenneTask {
         loadAction.setAdditionalDataMapFiles(additionalMaps);
 
         CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-        filterEntityAction.setClient(client);
         filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntitiesPattern, excludeEntitiesPattern));
 
         CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
@@ -116,6 +119,7 @@ public class CayenneGeneratorTask extends CayenneTask {
             DataMap dataMap = loadAction.getMainDataMap();
 
             ClassGenerationAction generatorAction = createGenerator(dataMap);
+            filterEntityAction.setClient(generatorAction.getCgenConfiguration().isClient());
             generatorAction.setLogger(logger);
             if(force) {
                 // will (re-)generate all files
@@ -146,11 +150,11 @@ public class CayenneGeneratorTask extends CayenneTask {
     }
 
     private boolean hasConfig() {
-        return destDir != null || encoding != null || client || excludeEntitiesPattern != null || excludeEmbeddablesPattern != null || includeEntitiesPattern != null ||
+        return destDir != null || encoding != null || client != null || excludeEntitiesPattern != null || excludeEmbeddablesPattern != null || includeEntitiesPattern != null ||
                 makepairs != null || mode != null || outputPattern != null || overwrite != null || superpkg != null ||
                 supertemplate != null || template != null || embeddabletemplate != null || embeddablesupertemplate != null ||
-                usepkgpath != null || createpropertynames || querytemplate != null ||
-                querysupertemplate != null || createpkproperties || force;
+                usepkgpath != null || createpropertynames != null || querytemplate != null ||
+                querysupertemplate != null || createpkproperties != null || force;
     }
 
     private CgenConfiguration buildConfiguration(DataMap dataMap) {
@@ -159,11 +163,6 @@ public class CayenneGeneratorTask extends CayenneTask {
             return cgenConfigFromPom(dataMap);
         } else if(cgenConfiguration != null) {
             useConfigFromDataMap = true;
-            java.nio.file.Path resourcePath = Paths.get(map.getPath());
-            if(Files.isRegularFile(resourcePath)) {
-                resourcePath = resourcePath.getParent();
-            }
-            cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
             return cgenConfiguration;
         } else {
             cgenConfiguration = new CgenConfiguration();
@@ -175,7 +174,7 @@ public class CayenneGeneratorTask extends CayenneTask {
     private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
         CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
-        cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : cgenConfiguration.getRelPath());
+        cgenConfiguration.setRelPath(destDir != null ? destDir.toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
         cgenConfiguration.setMakePairs(makepairs != null ? makepairs : cgenConfiguration.isMakePairs());
         cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
@@ -187,20 +186,20 @@ public class CayenneGeneratorTask extends CayenneTask {
         cgenConfiguration.setEmbeddableSuperTemplate(embeddablesupertemplate != null ? embeddablesupertemplate : cgenConfiguration.getEmbeddableSuperTemplate());
         cgenConfiguration.setEmbeddableTemplate(embeddabletemplate != null ? embeddabletemplate : cgenConfiguration.getEmbeddableTemplate());
         cgenConfiguration.setUsePkgPath(usepkgpath != null ? usepkgpath : cgenConfiguration.isUsePkgPath());
-        cgenConfiguration.setCreatePropertyNames(createpropertynames);
+        cgenConfiguration.setCreatePropertyNames(createpropertynames != null ? createpropertynames : cgenConfiguration.isCreatePropertyNames());
         cgenConfiguration.setQueryTemplate(querytemplate != null ? querytemplate : cgenConfiguration.getQueryTemplate());
         cgenConfiguration.setQuerySuperTemplate(querysupertemplate != null ? querysupertemplate : cgenConfiguration.getQuerySuperTemplate());
-        cgenConfiguration.setCreatePKProperties(createpkproperties);
-        cgenConfiguration.setClient(client);
+        cgenConfiguration.setCreatePKProperties(createpkproperties != null ? createpkproperties : cgenConfiguration.isCreatePKProperties());
+        cgenConfiguration.setClient(client != null ? client : cgenConfiguration.isClient());
         if(!cgenConfiguration.isMakePairs()) {
             if(template == null) {
-                cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
             }
             if(embeddabletemplate == null) {
                 cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
             }
             if(querytemplate == null) {
-                cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
             }
         }
         return cgenConfiguration;
@@ -331,6 +330,9 @@ public class CayenneGeneratorTask extends CayenneTask {
         this.includeEntitiesPattern = includeEntitiesPattern;
     }
 
+    /**
+     * Sets <code>excludeEmbeddablesPattern</code> property.
+     */
     public void setExcludeEmbeddablesPattern(String excludeEmbeddablesPattern) {
         this.excludeEmbeddablesPattern = excludeEmbeddablesPattern;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
index 4241105..b51a1e0 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
@@ -60,7 +60,7 @@ public class CgenWithConfigTest {
     }
 
     @Test
-    public void testCgen() throws Exception {
+    public void testCgenWithDmConfig() {
         File mapDir = new File(baseDir, "cgenConfigTest");
         assertTrue(mapDir.mkdirs());
 
@@ -84,7 +84,7 @@ public class CgenWithConfigTest {
     }
 
     @Test
-    public void testCgenWithDmAndPomConfigs() throws Exception {
+    public void testCgenWithDmAndPomConfigs() {
         File mapDir = new File(baseDir, "cgenDmPomTest");
         assertTrue(mapDir.mkdirs());
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
index 8d4157d..15bc435 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
@@ -1,3 +1,22 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
@@ -16,6 +35,13 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
+/**
+ * Used to keep config of class generation action.
+ * Previously was the part of ClassGeneretionAction class.
+ * Now CgenConfiguration is saved in dataMap file.
+ * You can reuse it in next cgen actions.
+ * @since 4.1
+ */
 public class CgenConfiguration implements Serializable, XMLSerializable {
 
     private Collection<Artifact> artifacts;
@@ -58,6 +84,7 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         this.timestamp = 0L;
         this.usePkgPath = true;
         this.makePairs = true;
+        setArtifactsGenerationMode("entity");
 
         this.artifacts = new ArrayList<>();
         this.entityArtifacts = new ArrayList<>();
@@ -244,18 +271,18 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         this.createPKProperties = createPKProperties;
     }
 
-    public String getRelPath() {
+    public Path getRelPath() {
+        return relPath;
+    }
+
+    public String buildRelPath() {
         if(relPath == null || relPath.toString().isEmpty()) {
             return ".";
         }
         return relPath.toString();
     }
 
-    public String getDir(){
-        return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize().toString() : rootPath.toString() : null;
-    }
-
-    public Collection<Artifact> getArtifacts() {
+    Collection<Artifact> getArtifacts() {
         return artifacts;
     }
 
@@ -267,20 +294,26 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
         return embeddableArtifacts;
     }
 
+    public boolean isClient() {
+        return client;
+    }
+
+    public void setClient(boolean client) {
+        this.client = client;
+    }
+
+    void addArtifact(Artifact artifact) {
+        artifacts.add(artifact);
+    }
+
     public Path buildPath() {
 		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : relPath;
 	}
 
-    /**
-     * @since 4.1
-     */
     public void loadEntity(String name) {
         entityArtifacts.add(name);
     }
 
-    /**
-     * @since 4.1
-     */
     public void loadEmbeddable(String name) {
         embeddableArtifacts.add(name);
     }
@@ -327,25 +360,13 @@ public class CgenConfiguration implements Serializable, XMLSerializable {
 				.collect(Collectors.toList());
 	}
 
-    public boolean isClient() {
-        return client;
-    }
-
-    public void setClient(boolean client) {
-        this.client = client;
-    }
-
-    public void addArtifact(Artifact artifact) {
-        artifacts.add(artifact);
-    }
-
     @Override
     public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
         encoder.start("cgen")
                 .attribute("xmlns", CgenExtension.NAMESPACE)
                 .simpleTag("excludeEntities", getExcludeEntites())
                 .simpleTag("excludeEmbeddables",getExcludeEmbeddables())
-                .simpleTag("destDir", getRelPath())
+                .simpleTag("destDir", buildRelPath())
                 .simpleTag("mode", this.artifactsGenerationMode.getLabel())
                 .simpleTag("template", this.template)
                 .simpleTag("superTemplate", this.superTemplate)

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 36ba514..68897ef 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
@@ -28,10 +28,18 @@ import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 import org.slf4j.Logger;
 
-import java.io.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Properties;
 import java.util.stream.Collectors;
 
 public class ClassGenerationAction {
@@ -53,6 +61,9 @@ public class ClassGenerationAction {
 	public static final String SUPERCLASS_PREFIX = "_";
 	private static final String WILDCARD = "*";
 
+	/**
+	 * @since 4.1
+	 */
 	protected CgenConfiguration cgenConfiguration;
 	protected Logger logger;
 
@@ -197,6 +208,9 @@ public class ClassGenerationAction {
 		}
 	}
 
+	/**
+	 * @since 4.1
+	 */
 	public void prepareArtifacts() {
 		cgenConfiguration.getArtifacts().clear();
 		addEntities(cgenConfiguration.getEntities().stream()
@@ -439,6 +453,9 @@ public class ClassGenerationAction {
 		this.logger = logger;
 	}
 
+	/**
+	 * @since 4.1
+	 */
 	public CgenConfiguration getCgenConfiguration() {
 		return cgenConfiguration;
 	}
@@ -451,6 +468,9 @@ public class ClassGenerationAction {
 		this.context = context;
 	}
 
+	/**
+	 * @since 4.1
+	 */
 	public void setCgenConfiguration(CgenConfiguration cgenConfiguration) {
 		this.cgenConfiguration = cgenConfiguration;
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 fec8dae..8e6ea43 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,10 +18,7 @@
  ****************************************************************/
 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;
 
 /**
@@ -29,7 +26,7 @@ import org.apache.velocity.VelocityContext;
  * 
  * @since 3.0
  */
-public class EmbeddableArtifact implements Artifact, XMLSerializable {
+public class EmbeddableArtifact implements Artifact {
 
     protected Embeddable embeddable;
 
@@ -68,11 +65,4 @@ public class EmbeddableArtifact implements Artifact, XMLSerializable {
     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/b30e5eb5/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 b53ee46..3f70f53 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,10 +19,7 @@
 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;
 
 /**
@@ -30,7 +27,7 @@ import org.apache.velocity.VelocityContext;
  * 
  * @since 3.0
  */
-public class EntityArtifact implements Artifact, XMLSerializable {
+public class EntityArtifact implements Artifact {
 
     public static String ENTITY_UTILS_KEY = "entityUtils";
 
@@ -97,11 +94,4 @@ public class EntityArtifact implements Artifact, XMLSerializable {
 
         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/b30e5eb5/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 1f4dd5e..754aac6 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
@@ -21,9 +21,13 @@ package org.apache.cayenne.gen.xml;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
 import org.apache.cayenne.gen.CgenConfiguration;
+import org.apache.cayenne.map.DataMap;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 
 /**
@@ -271,9 +275,19 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         configuration = new CgenConfiguration();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
+            configuration.setRootPath(buildRootPath(dataMap));
             configuration.resolveExcludeEntities();
             configuration.resolveExcludeEmbeddables();
             CgenConfigHandler.this.metaData.add(dataMap, configuration);
         });
     }
+
+    private Path buildRootPath(DataMap dataMap) {
+        URL url = dataMap.getConfigurationSource().getURL();
+        Path resourcePath = Paths.get(url.getPath());
+        if(Files.isRegularFile(resourcePath)) {
+            resourcePath = resourcePath.getParent();
+        }
+        return resourcePath;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 aa008b1..b31a8b0 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
@@ -60,7 +60,7 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
             if(Files.isRegularFile(resourcePath)) {
                 resourcePath = resourcePath.getParent();
             }
-
+            cgenConfiguration.setRootPath(resourcePath);
             if(prevPath != null && resourcePath.compareTo(prevPath) != 0) {
                 Path relPath = resourcePath.relativize(prevPath);
                 cgenConfiguration.setRelPath(relPath);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
index 00ab16a..dba3ab7 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
@@ -7,6 +7,11 @@ import org.apache.cayenne.map.Embeddable;
 import java.util.ArrayList;
 import java.util.Collection;
 
+/**
+ *  Performs embeddable filtering to build a collection of embedables that should be used in
+ *  class generation.
+ * @since 4.1
+ */
 class CayenneGeneratorEmbeddableFilterAction {
 
     private NameFilter nameFilter;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
index 7d53536..64a11e8 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
@@ -20,7 +20,6 @@ package org.apache.cayenne.tools;
 
 import org.apache.cayenne.dbsync.filter.NameFilter;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
 
 import java.net.MalformedURLException;
@@ -38,18 +37,6 @@ class CayenneGeneratorEntityFilterAction {
     private NameFilter nameFilter;
     private boolean client;
 
-    Collection<Embeddable> getFilteredEmbeddables(DataMap mainDataMap) {
-        Collection<Embeddable> embeddables = new ArrayList<>(mainDataMap.getEmbeddables());
-
-        // filter out excluded entities...
-
-        // note that unlike entity, embeddable is matched by class name as it doesn't
-        // have a symbolic name...
-        embeddables.removeIf(e -> !nameFilter.isIncluded(e.getClassName()));
-
-        return embeddables;
-    }
-
     Collection<ObjEntity> getFilteredEntities(DataMap mainDataMap)
             throws MalformedURLException {
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index 3b339df..bfafc1f 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -59,7 +59,8 @@ public class CgenTask extends BaseCayenneTask {
     private File additionalMaps;
 
     @Input
-    private boolean client;
+    @Optional
+    private String client;
 
     private File destDir;
 
@@ -75,6 +76,9 @@ public class CgenTask extends BaseCayenneTask {
     @Optional
     private String includeEntities;
 
+    /**
+     * @since 4.1
+     */
     @Input
     @Optional
     private String excludeEmbeddables;
@@ -143,7 +147,9 @@ public class CgenTask extends BaseCayenneTask {
      * Default is <code>false</code>.
      * @since 4.1
      */
-    private boolean createPKProperties;
+    @Input
+    @Optional
+    private String createPKProperties;
 
     private String destDirName;
 
@@ -162,7 +168,6 @@ public class CgenTask extends BaseCayenneTask {
         loaderAction.setMainDataMapFile(dataMapFile);
 
         CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-        filterEntityAction.setClient(client);
         filterEntityAction.setNameFilter(NamePatternMatcher.build(getLogger(), includeEntities, excludeEntities));
 
         CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
@@ -173,7 +178,7 @@ public class CgenTask extends BaseCayenneTask {
 
             DataMap dataMap = loaderAction.getMainDataMap();
             ClassGenerationAction generator = this.createGenerator(dataMap);
-
+            filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
             generator.setLogger(getLogger());
 
             if(this.force || getProject().hasProperty("force")) {
@@ -183,8 +188,6 @@ public class CgenTask extends BaseCayenneTask {
 
             if(!hasConfig() && useConfigFromDataMap) {
                 generator.prepareArtifacts();
-                setDestDir(generator.getCgenConfiguration().getRelPath());
-                generator.getCgenConfiguration().setRelPath(getDestDirFile().toPath());
             } else {
                 generator.addEntities(filterEntityAction.getFilteredEntities(dataMap));
                 generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
@@ -223,11 +226,6 @@ public class CgenTask extends BaseCayenneTask {
         } else if(metaData != null && metaData.get(dataMap, CgenConfiguration.class) != null) {
             useConfigFromDataMap = true;
             cgenConfiguration = metaData.get(dataMap, CgenConfiguration.class);
-            Path resourcePath = Paths.get(getDataMapFile().getPath());
-            if(Files.isRegularFile(resourcePath)) {
-                resourcePath = resourcePath.getParent();
-            }
-            cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
             return cgenConfiguration;
         } else {
             cgenConfiguration = new CgenConfiguration();
@@ -240,7 +238,7 @@ public class CgenTask extends BaseCayenneTask {
     private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
         CgenConfiguration cgenConfiguration = new CgenConfiguration();
         cgenConfiguration.setDataMap(dataMap);
-        cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().getPath() : cgenConfiguration.getRelPath());
+        cgenConfiguration.setRelPath(getDestDirFile() != null ? getDestDirFile().toPath() : cgenConfiguration.getRelPath());
         cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
         cgenConfiguration.setMakePairs(makePairs != null ? Boolean.valueOf(makePairs) : cgenConfiguration.isMakePairs());
         cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
@@ -255,28 +253,28 @@ public class CgenTask extends BaseCayenneTask {
         cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? Boolean.valueOf(createPropertyNames) : cgenConfiguration.isCreatePropertyNames());
         cgenConfiguration.setQueryTemplate(queryTemplate != null ? queryTemplate : cgenConfiguration.getQueryTemplate());
         cgenConfiguration.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : cgenConfiguration.getQuerySuperTemplate());
-        cgenConfiguration.setCreatePKProperties(createPKProperties);
-        cgenConfiguration.setClient(client);
+        cgenConfiguration.setCreatePKProperties(createPKProperties != null ? Boolean.valueOf(createPKProperties) : cgenConfiguration.isCreatePKProperties());
+        cgenConfiguration.setClient(client != null ? Boolean.valueOf(client) : cgenConfiguration.isClient());
         if(!cgenConfiguration.isMakePairs()) {
             if(template == null) {
-                cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
             }
             if(embeddableTemplate == null) {
                 cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
             }
             if(queryTemplate == null) {
-                cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
             }
         }
         return cgenConfiguration;
     }
 
     private boolean hasConfig() {
-        return destDir != null || destDirName != null || encoding != null || client || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+        return destDir != null || destDirName != null || encoding != null || client != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
                 makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
                 superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
                 usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
-                querySuperTemplate != null || createPKProperties;
+                querySuperTemplate != null || createPKProperties != null;
     }
 
     @OutputDirectory
@@ -364,11 +362,11 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public boolean isClient() {
-        return client;
+        return Boolean.valueOf(client);
     }
 
     public void setClient(boolean client) {
-        this.client = client;
+        this.client = String.valueOf(client);
     }
 
     public void client(boolean client) {
@@ -419,6 +417,10 @@ public class CgenTask extends BaseCayenneTask {
         this.excludeEmbeddables = excludeEmbeddables;
     }
 
+    /**
+     * @since 4.1
+     * @param excludeEmbeddables
+     */
     public void excludeEmbeddables(String excludeEmbeddables) {
         setExcludeEmbeddables(excludeEmbeddables);
     }
@@ -568,7 +570,7 @@ public class CgenTask extends BaseCayenneTask {
     }
 
     public void setCreatePKProperties(boolean createPKProperties) {
-        this.createPKProperties = createPKProperties;
+        this.createPKProperties = String.valueOf(createPKProperties);
     }
 
     public void createPKProperties(boolean createPKProperties) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/BaseTaskIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/BaseTaskIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/BaseTaskIT.java
index 91118ca..b5c4a08 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/BaseTaskIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/BaseTaskIT.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.tools;
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URISyntaxException;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -51,6 +52,7 @@ public class BaseTaskIT {
 
     protected GradleRunner createRunner(String projectName, String... args) throws Exception {
         prepareBuildScript(projectName);
+        prepareDataMap(args);
 
         List<String> gradleArguments = new ArrayList<>();
         gradleArguments.addAll(Arrays.asList(args));
@@ -67,4 +69,17 @@ public class BaseTaskIT {
         Path dst = FileSystems.getDefault().getPath(projectDir.getAbsolutePath(), "build.gradle");
         Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
     }
+
+    private void prepareDataMap(String... args) throws Exception {
+        String pattern = "-PdataMap=";
+        for(String arg : args) {
+            if(arg.startsWith(pattern)) {
+                String path = arg.substring(pattern.length());
+                Path src = new File(getClass().getResource(path).toURI()).toPath();
+                Path dst = FileSystems.getDefault().getPath(projectDir.getAbsolutePath(), path);
+                Files.copy(src, dst, StandardCopyOption.REPLACE_EXISTING);
+            }
+        }
+
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
index b41c1d2..c3879ac 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/CgenTaskIT.java
@@ -45,7 +45,7 @@ public class CgenTaskIT extends BaseTaskIT {
         GradleRunner runner = createRunner(
                 "cgen_default_config",
                 "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("test_datamap.map.xml").getFile(), "UTF-8")
+                "-PdataMap=test_datamap.map.xml"
         );
 
         BuildResult result = runner.forwardOutput().build();
@@ -68,7 +68,7 @@ public class CgenTaskIT extends BaseTaskIT {
         GradleRunner runner = createRunner(
                 "cgen_custom_config",
                 "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("test_datamap.map.xml").getFile(), "UTF-8")
+                "-PdataMap=test_datamap.map.xml"
         );
         BuildResult result = runner.build();
 
@@ -92,11 +92,11 @@ public class CgenTaskIT extends BaseTaskIT {
     }
 
     @Test
-    public void cgenWithConfig() throws Exception {
+    public void cgenWithConfigInDm() throws Exception {
         GradleRunner runner = createRunner(
                 "cgen_with_config",
                 "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenConfig.map.xml").getFile(), "UTF-8")
+                "-PdataMap=cgen_with_config.map.xml"
         );
 
         BuildResult result = runner.forwardOutput().build();
@@ -121,11 +121,11 @@ public class CgenTaskIT extends BaseTaskIT {
     }
 
     @Test
-    public void testWithConfigs() throws Exception {
+    public void testWithConfigsInDmAndPom() throws Exception {
         GradleRunner runner = createRunner(
                 "cgen_with_configs",
                 "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("cgenMap.map.xml").getFile(), "UTF-8")
+                "-PdataMap=cgenMap.map.xml"
         );
 
         BuildResult result = runner.forwardOutput().build();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/DbGenerateTaskIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/DbGenerateTaskIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/DbGenerateTaskIT.java
index 87c1194..c88f1f7 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/DbGenerateTaskIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/DbGenerateTaskIT.java
@@ -58,7 +58,7 @@ public class DbGenerateTaskIT extends BaseTaskIT {
                 "cdbgen_simple",
                 "cdbgen",
                 "-PdbUrl=" + dbUrl,
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("test_datamap.map.xml").getFile(), "UTF-8"),
+                "-PdataMap=test_datamap.map.xml",
                 "--info"
         );
 
@@ -84,7 +84,7 @@ public class DbGenerateTaskIT extends BaseTaskIT {
         GradleRunner runner = createRunner(
                 "cdbgen_custom",
                 "customCdbgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("test_datamap.map.xml").getFile(), "UTF-8"),
+                "-PdataMap=test_datamap.map.xml",
                 "--info"
         );
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java
index 199c0a6..60f5749 100644
--- a/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java
+++ b/cayenne-gradle-plugin/src/test/java/org/apache/cayenne/tools/GradlePluginIT.java
@@ -43,7 +43,7 @@ public class GradlePluginIT extends BaseTaskIT {
         GradleRunner runner = createRunner(
                 "cgen_default_config",
                 "cgen",
-                "-PdataMap=" + URLDecoder.decode(getClass().getResource("test_datamap.map.xml").getFile(), "UTF-8")
+                "-PdataMap=test_datamap.map.xml"
         );
         runner.withGradleVersion(version);
         runner.build();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
deleted file mode 100644
index e3bfe55..0000000
--- a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgenConfig.map.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
-          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
-          project-version="10">
-    <embeddable className="Embeddable"/>
-    <obj-entity name="ObjEntity" className="ObjEntity"/>
-    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
-    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
-        <destDir>./customDirectory1</destDir>
-        <excludeEntities>ObjEntity</excludeEntities>
-        <excludeEmbeddables>Embeddable</excludeEmbeddables>
-        <mode>entity</mode>
-        <template>templates/v4_1/subclass.vm</template>
-        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
-        <outputPattern>*.txt</outputPattern>
-        <makePairs>false</makePairs>
-        <usePkgPath>true</usePkgPath>
-        <overwrite>false</overwrite>
-        <createPropertyNames>false</createPropertyNames>
-    </cgen>
-</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.map.xml b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.map.xml
new file mode 100644
index 0000000..e3bfe55
--- /dev/null
+++ b/cayenne-gradle-plugin/src/test/resources/org/apache/cayenne/tools/cgen_with_config.map.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/10/modelMap"
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://cayenne.apache.org/schema/10/modelMap http://cayenne.apache.org/schema/10/modelMap.xsd"
+          project-version="10">
+    <embeddable className="Embeddable"/>
+    <obj-entity name="ObjEntity" className="ObjEntity"/>
+    <obj-entity name="ObjEntity1" className="ObjEntity1"/>
+    <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
+        <destDir>./customDirectory1</destDir>
+        <excludeEntities>ObjEntity</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <mode>entity</mode>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
+        <outputPattern>*.txt</outputPattern>
+        <makePairs>false</makePairs>
+        <usePkgPath>true</usePkgPath>
+        <overwrite>false</overwrite>
+        <createPropertyNames>false</createPropertyNames>
+    </cgen>
+</data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
index 4745e38..7d446e3 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/CompoundSaverDelegate.java
@@ -21,7 +21,18 @@ package org.apache.cayenne.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.project.extension.SaverDelegate;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.util.XMLEncoder;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
index de280b4..08941b8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/util/Util.java
@@ -26,20 +26,45 @@ import org.apache.cayenne.Persistent;
 import org.apache.cayenne.di.AdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.reflect.*;
+import org.apache.cayenne.reflect.ArcProperty;
+import org.apache.cayenne.reflect.AttributeProperty;
+import org.apache.cayenne.reflect.PropertyVisitor;
+import org.apache.cayenne.reflect.ToManyProperty;
+import org.apache.cayenne.reflect.ToOneProperty;
 import org.w3c.dom.Document;
 import org.xml.sax.SAXException;
 import org.xml.sax.XMLReader;
 
-import javax.xml.parsers.*;
-import java.io.*;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
 import java.lang.reflect.Member;
 import java.lang.reflect.Modifier;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.sql.SQLException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
 /**

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/cayenne-server/src/main/resources/org/apache/cayenne/schema/10/cgen.xsd
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/resources/org/apache/cayenne/schema/10/cgen.xsd b/cayenne-server/src/main/resources/org/apache/cayenne/schema/10/cgen.xsd
new file mode 100644
index 0000000..7b26e92
--- /dev/null
+++ b/cayenne-server/src/main/resources/org/apache/cayenne/schema/10/cgen.xsd
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  ~   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.
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
+
+<xs:schema targetNamespace="http://cayenne.apache.org/schema/10/cgen"
+           elementFormDefault="qualified" version="10"
+           xmlns:cay="http://cayenne.apache.org/schema/10/cgen"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+    <xs:element name="cgen">
+        <xs:complexType>
+                <xs:sequence>
+                    <xs:element name="excludeEntities" minOccurs="0" type="xs:string"/>
+                    <xs:element name="excludeEmbeddables" minOccurs="0" type="xs:string"/>
+                    <xs:element name="destDir" minOccurs="0" type="xs:string"/>
+                    <xs:element name="mode" minOccurs="0" type="xs:string"/>
+                    <xs:element name="template" minOccurs="0" type="xs:string"/>
+                    <xs:element name="superTemplate" minOccurs="0" type="xs:string"/>
+                    <xs:element name="outputPattern" minOccurs="0" type="xs:string"/>
+                    <xs:element name="makePairs" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="skipRelationshipsLoading" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="usePkgPath" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="overwrite" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="createPropertyNames" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="createPKProperties" minOccurs="0" type="xs:boolean"/>
+                    <xs:element name="client" minOccurs="0" type="xs:boolean"/>
+                </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+</xs:schema>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 e936024..647f363 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
@@ -39,10 +39,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 
 /**
  * Maven mojo to perform class generation from data cgenConfiguration. This class is an Maven
@@ -65,13 +61,19 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	 * Whether we are generating classes for the client tier in a Remote Object
 	 * Persistence application. Default is <code>false</code>.
 	 */
-	@Parameter(defaultValue = "false")
-	private boolean client;
+	@Parameter
+	private Boolean client;
 
 	/**
-	 * Destination directory for Java classes (ignoring their package names).
+	 * Default destination directory for Java classes (ignoring their package names).
 	 */
 	@Parameter(defaultValue = "${project.build.sourceDirectory}")
+	private File defaultDir;
+
+	/**
+	 * Destination directory for Java classes (ignoring their package names).
+	 */
+	@Parameter
 	private File destDir;
 
 	/**
@@ -99,6 +101,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	private String includeEntities;
 
 	/**
+	 * @since 4.1
 	 * Embeddables (expressed as a perl5 regex) to exclude from template
 	 * generation. (Default is to include all embeddables in the DataMap).
 	 */
@@ -218,8 +221,8 @@ public class CayenneGeneratorMojo extends AbstractMojo {
      * Default is <code>false</code>.
      * @since 4.1
      */
-    @Parameter(defaultValue = "false")
-    private boolean createPKProperties;
+    @Parameter
+    private Boolean createPKProperties;
 
     private transient Injector injector;
 
@@ -239,7 +242,6 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		loaderAction.setMainDataMapFile(map);
 
 		CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
-		filterEntityAction.setClient(client);
 		filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntities, excludeEntities));
 
 		CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
@@ -249,8 +251,8 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 			loaderAction.setAdditionalDataMapFiles(convertAdditionalDataMaps());
 
 			DataMap dataMap = loaderAction.getMainDataMap();
-
 			ClassGenerationAction generator = createGenerator(dataMap);
+			filterEntityAction.setClient(generator.getCgenConfiguration().isClient());
 			generator.setLogger(logger);
 
 			if(force) {
@@ -265,7 +267,6 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 				generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
 				generator.addQueries(dataMap.getQueryDescriptors());
 			}
-			URL dataName = dataMap.getConfigurationSource().getURL();
 			generator.execute();
 		} catch (Exception e) {
 			throw new MojoExecutionException("Error generating classes: ", e);
@@ -291,11 +292,11 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	}
 
 	private boolean hasConfig() {
-		return encoding != null || client || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
+		return destDir != null || encoding != null || client != null || excludeEntities != null || excludeEmbeddables != null || includeEntities != null ||
 				makePairs != null || mode != null || outputPattern != null || overwrite != null || superPkg != null ||
 				superTemplate != null || template != null || embeddableTemplate != null || embeddableSuperTemplate != null ||
 				usePkgPath != null || createPropertyNames != null || force || queryTemplate != null ||
-				querySuperTemplate != null || createPKProperties;
+				querySuperTemplate != null || createPKProperties != null;
 	}
 
 	/**
@@ -317,16 +318,11 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 			return cgenConfigFromPom(dataMap);
 		} else if(cgenConfiguration != null) {
 			useConfigFromDataMap = true;
-			Path resourcePath = Paths.get(map.getPath());
-			if(Files.isRegularFile(resourcePath)) {
-				resourcePath = resourcePath.getParent();
-			}
-			cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
 			return cgenConfiguration;
 		} else {
 			cgenConfiguration = new CgenConfiguration();
 			cgenConfiguration.setDataMap(dataMap);
-			cgenConfiguration.setRelPath(destDir.getPath());
+			cgenConfiguration.setRelPath(defaultDir.getPath());
 			return cgenConfiguration;
 		}
 	}
@@ -334,7 +330,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 	private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
 		CgenConfiguration cgenConfiguration = new CgenConfiguration();
 		cgenConfiguration.setDataMap(dataMap);
-		cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : cgenConfiguration.getRelPath());
+		cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : defaultDir.getPath());
 		cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
 		cgenConfiguration.setMakePairs(makePairs != null ? makePairs : cgenConfiguration.isMakePairs());
 		cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
@@ -349,17 +345,17 @@ public class CayenneGeneratorMojo extends AbstractMojo {
 		cgenConfiguration.setCreatePropertyNames(createPropertyNames != null ? createPropertyNames : cgenConfiguration.isCreatePropertyNames());
 		cgenConfiguration.setQueryTemplate(queryTemplate != null ? queryTemplate : cgenConfiguration.getQueryTemplate());
 		cgenConfiguration.setQuerySuperTemplate(querySuperTemplate != null ? querySuperTemplate : cgenConfiguration.getQuerySuperTemplate());
-		cgenConfiguration.setCreatePKProperties(createPKProperties);
-		cgenConfiguration.setClient(client);
+		cgenConfiguration.setCreatePKProperties(createPKProperties != null ? createPKProperties : cgenConfiguration.isCreatePKProperties());
+		cgenConfiguration.setClient(client != null ? client : cgenConfiguration.isClient());
 		if(!cgenConfiguration.isMakePairs()) {
 			if(template == null) {
-				cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+				cgenConfiguration.setTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
 			}
 			if(embeddableTemplate == null) {
 				cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
 			}
 			if(queryTemplate == null) {
-				cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+				cgenConfiguration.setQueryTemplate(cgenConfiguration.isClient() ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
 			}
 		}
 		return cgenConfiguration;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
----------------------------------------------------------------------
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
index edad490..8454c32 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
@@ -90,7 +90,7 @@ public class CayenneGeneratorMojoTest extends AbstractMojoTestCase {
         assertFalse(notIncludedEmbeddable.exists());
     }
 
-    public void testDataMapPomCgen() throws Exception {
+    public void testCgenWithDmAndPomConfigs() throws Exception {
         File pom = getTestFile("src/test/resources/cgen/project-to-test/datamap-and-pom.xml");
         assertNotNull(pom);
         assertTrue(pom.exists());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/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 1af72ba..4ca815b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -19,12 +19,63 @@
 
 package org.apache.cayenne.modeler;
 
-import org.apache.cayenne.modeler.action.*;
+import org.apache.cayenne.modeler.action.AboutAction;
+import org.apache.cayenne.modeler.action.ActionManager;
+import org.apache.cayenne.modeler.action.ConfigurePreferencesAction;
+import org.apache.cayenne.modeler.action.CopyAction;
+import org.apache.cayenne.modeler.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.action.CreateNodeAction;
+import org.apache.cayenne.modeler.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.action.CreateQueryAction;
+import org.apache.cayenne.modeler.action.CutAction;
+import org.apache.cayenne.modeler.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.action.DocumentationAction;
+import org.apache.cayenne.modeler.action.ExitAction;
+import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.action.GenerateCodeAction;
+import org.apache.cayenne.modeler.action.GenerateDBAction;
+import org.apache.cayenne.modeler.action.ImportDataMapAction;
+import org.apache.cayenne.modeler.action.ImportEOModelAction;
+import org.apache.cayenne.modeler.action.InferRelationshipsAction;
+import org.apache.cayenne.modeler.action.MigrateAction;
+import org.apache.cayenne.modeler.action.NavigateBackwardAction;
+import org.apache.cayenne.modeler.action.NavigateForwardAction;
+import org.apache.cayenne.modeler.action.NewProjectAction;
+import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.action.PasteAction;
+import org.apache.cayenne.modeler.action.ProjectAction;
+import org.apache.cayenne.modeler.action.RedoAction;
+import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.action.RevertAction;
+import org.apache.cayenne.modeler.action.SaveAction;
+import org.apache.cayenne.modeler.action.SaveAsAction;
+import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
+import org.apache.cayenne.modeler.action.UndoAction;
+import org.apache.cayenne.modeler.action.ValidateAction;
 import org.apache.cayenne.modeler.action.dbimport.ReverseEngineeringToolMenuAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.dialog.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.editor.EditorView;
-import org.apache.cayenne.modeler.event.*;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.event.DataMapDisplayListener;
+import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.event.DataNodeDisplayListener;
+import org.apache.cayenne.modeler.event.DbEntityDisplayListener;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayListener;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayEvent;
+import org.apache.cayenne.modeler.event.MultipleObjectsDisplayListener;
+import org.apache.cayenne.modeler.event.ObjEntityDisplayListener;
+import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.event.ProcedureDisplayListener;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
+import org.apache.cayenne.modeler.event.QueryDisplayListener;
+import org.apache.cayenne.modeler.event.RecentFileListListener;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.RecentFileMenu;
@@ -32,8 +83,28 @@ import org.apache.cayenne.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.JTextField;
+import javax.swing.JToolBar;
+import java.awt.AWTEvent;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.Toolkit;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
deleted file mode 100644
index 8df07df..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabController.java
+++ /dev/null
@@ -1,203 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//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;
-//import org.apache.cayenne.swing.ObjectBinding;
-//import org.apache.cayenne.swing.TableBindingBuilder;
-//
-//import javax.swing.JCheckBox;
-//import javax.swing.JLabel;
-//import javax.swing.JTable;
-//import java.awt.Component;
-//import java.util.ArrayList;
-//import java.util.Collection;
-//import java.util.HashMap;
-//import java.util.Map;
-//import java.util.List;
-//
-//public class ClassesTabController extends CayenneController {
-//
-//    public static final String GENERATE_PROPERTY = "generate";
-//
-//    protected ClassesTabPanel view;
-//
-//    private Map<DataMap, ObjectBinding> objectBindings;
-//
-//    protected Collection<DataMap> dataMaps;
-//
-//    protected Map<DataMap, List<Object>> objectList;
-//
-//    private List<Object> currentCollection;
-//
-//    public ClassesTabController(CodeGeneratorControllerBase parent, Collection<DataMap> dataMaps) {
-//        super(parent);
-//
-//        currentCollection = new ArrayList<>();
-//
-//        this.objectList = new HashMap<>();
-//        for(DataMap dataMap : dataMaps) {
-//            List<Object> list = new ArrayList<>();
-//            list.add(dataMap);
-//            list.addAll(dataMap.getObjEntities());
-//            list.addAll(dataMap.getEmbeddables());
-//            objectList.put(dataMap, list);
-//        }
-//
-//        this.objectBindings = new HashMap<>();
-//        this.dataMaps = dataMaps;
-//        this.view = new ClassesTabPanel(dataMaps);
-//
-//        initBindings();
-//    }
-//
-//    protected CodeGeneratorControllerBase getParentController() {
-//        return (CodeGeneratorControllerBase) getParent();
-//    }
-//
-//    public Component getView() {
-//        return view;
-//    }
-//
-//    protected void initBindings() {
-//
-//        BindingBuilder builder = new BindingBuilder(
-//                getApplication().getBindingFactory(),
-//                this);
-//
-//        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-//
-//        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-//
-//        tableBuilder.addColumn(
-//                "",
-//                "parent.setCurrentClass(#item), selected",
-//                Boolean.class,
-//                true,
-//                Boolean.TRUE);
-//
-//        tableBuilder.addColumn(
-//                "Class",
-//                "parent.getItemName(#item)",
-//                JLabel.class,
-//                false,
-//                "XXXXXXXXXXXXXX");
-//
-//        tableBuilder.addColumn(
-//                "Comments, Warnings",
-//                "parent.getProblem(#item)",
-//                String.class,
-//                false,
-//                "XXXXXXXXXXXXXXXXXXXXXXXXXXX");
-//
-//        for(DataMap dataMap : dataMaps) {
-//            JTable table = view.getDataMapTables().get(dataMap);
-//            if(table != null) {
-//                currentCollection = objectList.get(dataMap);
-//                objectBindings.put(dataMap, tableBuilder.bindToTable(table, "currentCollection"));
-//                table.getColumnModel().getColumn(1).setCellRenderer(new ImageRendererColumn());
-//            }
-//            JCheckBox checkBox = view.getDataMapJCheckBoxMap().get(dataMap);
-//            if(checkBox != null) {
-//                checkBox.addActionListener(val -> checkDataMap(dataMap, ((JCheckBox)val.getSource()).isSelected()));
-//            }
-//        }
-//    }
-//
-//    public List<Object> getCurrentCollection() {
-//        return currentCollection;
-//    }
-//
-//    public boolean isSelected() {
-//        return getParentController().isSelected();
-//    }
-//
-//    public void setSelected(boolean selected) {
-//        getParentController().setSelected(selected);
-//        classSelectedAction();
-//
-//        for(DataMap dataMap : dataMaps) {
-//            if(view.isAllCheckBoxesFromDataMapSelected(dataMap)) {
-//                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(true);
-//            } else {
-//                view.getDataMapJCheckBoxMap().get(dataMap).setSelected(false);
-//            }
-//        }
-//    }
-//
-//    /**
-//     * A callback action that updates the state of Select All checkbox.
-//     */
-//    public void classSelectedAction() {
-//        int selectedCount = getParentController().getSelectedEntitiesSize()
-//                + getParentController().getSelectedEmbeddablesSize()
-//                + getParentController().getSelectedDataMapsSize();
-//
-//        if (selectedCount == 0) {
-//            view.getCheckAll().setSelected(false);
-//        }
-//        else if (selectedCount == getParentController().getClasses().size()) {
-//            view.getCheckAll().setSelected(true);
-//        }
-//    }
-//
-//    /**
-//     * An action that updates entity check boxes in response to the Select All state
-//     * change.
-//     */
-//    public void checkAllAction() {
-//        if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) {
-//            dataMaps.forEach(dataMap -> {
-//                ObjectBinding binding = objectBindings.get(dataMap);
-//                if(binding != null) {
-//                    currentCollection = objectList.get(dataMap);
-//                    binding.updateView();
-//                }
-//            });
-//        }
-//    }
-//
-//    private void checkDataMap(DataMap dataMap, boolean selected) {
-//        if (getParentController().updateDataMapSelection(selected ? o -> true : o -> false, dataMap)){
-//            ObjectBinding binding = objectBindings.get(dataMap);
-//            if(binding != null) {
-//                currentCollection = objectList.get(dataMap);
-//                binding.updateView();
-//            }
-//            if(isAllMapsSelected()) {
-//                view.getCheckAll().setSelected(true);
-//            }
-//        }
-//    }
-//
-//    private boolean isAllMapsSelected() {
-//        for(DataMap dataMap : dataMaps) {
-//            if(view.getDataMapJCheckBoxMap().get(dataMap) != null) {
-//                if(!view.getDataMapJCheckBoxMap().get(dataMap).isSelected()) {
-//                    return false;
-//                }
-//            }
-//        }
-//        return true;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
deleted file mode 100644
index 5d7e895..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClassesTabPanel.java
+++ /dev/null
@@ -1,141 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.map.DataMap;
-//
-//import javax.swing.BoxLayout;
-//import javax.swing.JCheckBox;
-//import javax.swing.JLabel;
-//import javax.swing.JPanel;
-//import javax.swing.JScrollPane;
-//import javax.swing.JTable;
-//import javax.swing.ScrollPaneConstants;
-//import javax.swing.UIManager;
-//import javax.swing.border.EmptyBorder;
-//import java.awt.BorderLayout;
-//import java.awt.Component;
-//import java.awt.Dimension;
-//import java.awt.FlowLayout;
-//import java.util.Collection;
-//import java.util.HashMap;
-//import java.util.Map;
-//
-///**
-// */
-//public class ClassesTabPanel extends JPanel {
-//
-//    protected JCheckBox checkAll;
-//    protected JLabel checkAllLabel;
-//
-//    private Map<DataMap, JTable> dataMapTables;
-//
-//    private Map<DataMap, JCheckBox> dataMapJCheckBoxMap;
-//
-//    public ClassesTabPanel(Collection<DataMap> dataMaps) {
-//        dataMapTables = new HashMap<>();
-//        dataMapJCheckBoxMap = new HashMap<>();
-//
-//        // TODO: andrus 04/07/2006 - is there an easy way to stick that checkbox in the
-//        // table header????
-//        this.checkAll = new JCheckBox();
-//        this.checkAllLabel = new JLabel("Check All Classes");
-//
-//        checkAll.addItemListener(event -> {
-//            if (checkAll.isSelected()) {
-//                checkAllLabel.setText("Uncheck All Classess");
-//                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(true));
-//            }
-//            else {
-//                checkAllLabel.setText("Check All Classes");
-//                dataMapJCheckBoxMap.keySet().forEach(val -> dataMapJCheckBoxMap.get(val).setSelected(false));
-//            }
-//        });
-//
-//        // assemble
-//        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
-//        topPanel.setBorder(UIManager.getBorder("ToolBar.border"));
-//        topPanel.add(checkAll);
-//        topPanel.add(checkAllLabel);
-//
-//        JPanel panel = new JPanel();
-//        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
-//        for(DataMap dataMap : dataMaps) {
-//            JTable table = new JTable();
-//            table.setRowHeight(22);
-//            dataMapTables.put(dataMap, table);
-//            JPanel scrollTable = new JPanel(new BorderLayout());
-//            scrollTable.add(dataMapTables.get(dataMap).getTableHeader(), BorderLayout.NORTH);
-//            scrollTable.add(dataMapTables.get(dataMap), BorderLayout.CENTER);
-//            scrollTable.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width,
-//                    (dataMap.getEmbeddables().size() + dataMap.getObjEntities().size()) * dataMapTables.get(dataMap).getRowHeight() + 45));
-//            JPanel labelPanel = new JPanel(new BorderLayout());
-//            labelPanel.setPreferredSize(new Dimension(dataMapTables.get(dataMap).getPreferredSize().width, 20));
-//            JLabel dataMapLabel = new JLabel(dataMap.getName());
-//            dataMapLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
-//            dataMapLabel.setBorder(new EmptyBorder(8, 8, 8, 0));
-//            labelPanel.add(dataMapLabel, BorderLayout.CENTER);
-//
-//            JCheckBox dataMapCheckBox = new JCheckBox();
-//            dataMapJCheckBoxMap.put(dataMap, dataMapCheckBox);
-//            labelPanel.add(dataMapCheckBox, BorderLayout.WEST);
-//
-//            JPanel currPanel = new JPanel(new BorderLayout());
-//            currPanel.add(labelPanel, BorderLayout.NORTH);
-//            currPanel.add(scrollTable, BorderLayout.CENTER);
-//
-//            panel.add(currPanel);
-//        }
-//
-//        JScrollPane tablePanel = new JScrollPane(
-//                panel,
-//                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-//                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
-//
-//        // set some minimal preferred size, so that it is smaller than other forms used in
-//        // the dialog... this way we get the right automated overall size
-//        tablePanel.setPreferredSize(new Dimension(450, 400));
-//        setLayout(new BorderLayout());
-//        add(topPanel, BorderLayout.NORTH);
-//        add(tablePanel, BorderLayout.CENTER);
-//    }
-//
-//    public boolean isAllCheckBoxesFromDataMapSelected(DataMap dataMap) {
-//        JTable table = dataMapTables.get(dataMap);
-//        for(int i = 0; i < table.getRowCount(); i++) {
-//            if(!(Boolean)table.getModel().getValueAt(i, 0)) {
-//                return false;
-//            }
-//        }
-//        return true;
-//    }
-//
-//    public Map<DataMap, JTable> getDataMapTables() {
-//        return dataMapTables;
-//    }
-//
-//    public Map<DataMap, JCheckBox> getDataMapJCheckBoxMap() {
-//        return dataMapJCheckBoxMap;
-//    }
-//
-//    public JCheckBox getCheckAll() {
-//        return checkAll;
-//    }
-//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/b30e5eb5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
deleted file mode 100644
index 0225d3b..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
+++ /dev/null
@@ -1,81 +0,0 @@
-///*****************************************************************
-// *   Licensed to the Apache Software Foundation (ASF) under one
-// *  or more contributor license agreements.  See the NOTICE file
-// *  distributed with this work for additional information
-// *  regarding copyright ownership.  The ASF licenses this file
-// *  to you under the Apache License, Version 2.0 (the
-// *  "License"); you may not use this file except in compliance
-// *  with the License.  You may obtain a copy of the License at
-// *
-// *    http://www.apache.org/licenses/LICENSE-2.0
-// *
-// *  Unless required by applicable law or agreed to in writing,
-// *  software distributed under the License is distributed on an
-// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// *  KIND, either express or implied.  See the License for the
-// *  specific language governing permissions and limitations
-// *  under the License.
-// ****************************************************************/
-//
-//package org.apache.cayenne.modeler.dialog.codegen;
-//
-//import org.apache.cayenne.gen.ClassGenerationAction;
-//import org.apache.cayenne.gen.ClientClassGenerationAction;
-//import org.apache.cayenne.map.DataMap;
-//import org.apache.cayenne.map.ObjEntity;
-//import org.apache.cayenne.modeler.pref.DataMapDefaults;
-//import org.apache.cayenne.validation.BeanValidationFailure;
-//import org.apache.cayenne.validation.ValidationResult;
-//
-//import java.util.ArrayList;
-//import java.util.TreeMap;
-//
-//public class ClientModeController extends StandardModeController {
-//
-//    public ClientModeController(CodeGeneratorControllerBase parent) {
-//        super(parent);
-//    }
-//
-//    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity) {
-//        if (!entity.isClientAllowed()) {
-//            validationBuffer.addFailure(new BeanValidationFailure(
-//                    entity.getName(),
-//                    "clientAllowed",
-//                    "Not a client entity"));
-//        } else {
-//            super.validateEntity(validationBuffer, entity, true);
-//        }
-//    }
-//
-//    protected void createDefaults() {
-//        TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
-//        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
-//        for (DataMap dataMap : dataMaps) {
-//            DataMapDefaults preferences = getApplication()
-//                    .getFrameController()
-//                    .getProjectController()
-//                    .getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);
-//
-//            preferences.setSuperclassPackage("");
-//            preferences.updateSuperclassPackage(dataMap, true);
-//
-//            map.put(dataMap, preferences);
-//
-//            if (getOutputPath() == null) {
-//                setOutputPath(preferences.getOutputPath());
-//            }
-//        }
-//
-//        setMapPreferences(map);
-//    }
-//
-//    protected GeneratorControllerPanel createView() {
-//        this.view = new StandardModePanel();
-//        return view;
-//    }
-//
-//    @Override
-//    protected ClassGenerationAction newGenerator() {
-//        return new ClientClassGenerationAction();
-//    }
-//}
\ No newline at end of file


[16/32] cayenne git commit: Cgen tab, cgen configuration, cgen in maven, ant, gradle.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
index 9e3897e..0225d3b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/ClientModeController.java
@@ -1,81 +1,81 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-import org.apache.cayenne.validation.BeanValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import java.util.ArrayList;
-import java.util.TreeMap;
-
-public class ClientModeController extends StandardModeController {
-
-    public ClientModeController(CodeGeneratorControllerBase parent) {
-        super(parent);
-    }
-
-    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity) {
-        if (!entity.isClientAllowed()) {
-            validationBuffer.addFailure(new BeanValidationFailure(
-                    entity.getName(),
-                    "clientAllowed",
-                    "Not a client entity"));
-        } else {
-            super.validateEntity(validationBuffer, entity, true);
-        }
-    }
-
-    protected void createDefaults() {
-        TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
-        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
-        for (DataMap dataMap : dataMaps) {
-            DataMapDefaults preferences = getApplication()
-                    .getFrameController()
-                    .getProjectController()
-                    .getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);
-
-            preferences.setSuperclassPackage("");
-            preferences.updateSuperclassPackage(dataMap, true);
-
-            map.put(dataMap, preferences);
-
-            if (getOutputPath() == null) {
-                setOutputPath(preferences.getOutputPath());
-            }
-        }
-
-        setMapPreferences(map);
-    }
-
-    protected GeneratorControllerPanel createView() {
-        this.view = new StandardModePanel();
-        return view;
-    }
-
-    @Override
-    protected ClassGenerationAction newGenerator() {
-        return new ClientClassGenerationAction();
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.gen.ClassGenerationAction;
+//import org.apache.cayenne.gen.ClientClassGenerationAction;
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.map.ObjEntity;
+//import org.apache.cayenne.modeler.pref.DataMapDefaults;
+//import org.apache.cayenne.validation.BeanValidationFailure;
+//import org.apache.cayenne.validation.ValidationResult;
+//
+//import java.util.ArrayList;
+//import java.util.TreeMap;
+//
+//public class ClientModeController extends StandardModeController {
+//
+//    public ClientModeController(CodeGeneratorControllerBase parent) {
+//        super(parent);
+//    }
+//
+//    public void validateEntity(ValidationResult validationBuffer, ObjEntity entity) {
+//        if (!entity.isClientAllowed()) {
+//            validationBuffer.addFailure(new BeanValidationFailure(
+//                    entity.getName(),
+//                    "clientAllowed",
+//                    "Not a client entity"));
+//        } else {
+//            super.validateEntity(validationBuffer, entity, true);
+//        }
+//    }
+//
+//    protected void createDefaults() {
+//        TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
+//        ArrayList<DataMap> dataMaps = (ArrayList<DataMap>) getParentController().getDataMaps();
+//        for (DataMap dataMap : dataMaps) {
+//            DataMapDefaults preferences = getApplication()
+//                    .getFrameController()
+//                    .getProjectController()
+//                    .getDataMapPreferences(this.getClass().getName().replace(".", "/"), dataMap);
+//
+//            preferences.setSuperclassPackage("");
+//            preferences.updateSuperclassPackage(dataMap, true);
+//
+//            map.put(dataMap, preferences);
+//
+//            if (getOutputPath() == null) {
+//                setOutputPath(preferences.getOutputPath());
+//            }
+//        }
+//
+//        setMapPreferences(map);
+//    }
+//
+//    protected GeneratorControllerPanel createView() {
+//        this.view = new StandardModePanel();
+//        return view;
+//    }
+//
+//    @Override
+//    protected ClassGenerationAction newGenerator() {
+//        return new ClientClassGenerationAction();
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
index 55817a6..a5ac549 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorController.java
@@ -1,169 +1,169 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.JOptionPane;
-import java.awt.Component;
-import java.util.Collection;
-import java.util.function.Predicate;
-
-/**
- * A controller for the class generator dialog.
- */
-public class CodeGeneratorController extends CodeGeneratorControllerBase {
-    /**
-     * Logger to print stack traces
-     */
-    private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);
-
-    protected CodeGeneratorDialog view;
-
-    protected ClassesTabController classesSelector;
-    protected GeneratorTabController generatorSelector;
-
-    public CodeGeneratorController(CayenneController parent, Collection<DataMap> dataMaps) {
-        super(parent, dataMaps);
-
-        this.classesSelector = new ClassesTabController(this, dataMaps);
-        this.generatorSelector = new GeneratorTabController(this);
-    }
-
-    @Override
-    public Component getView() {
-        return view;
-    }
-
-    public void startup() {
-        // show dialog even on empty DataMap, as custom generation may still take
-        // advantage of it
-
-        view = new CodeGeneratorDialog(generatorSelector.getView(), classesSelector.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()");
-        builder.bindToAction(view.getGenerateButton(), "generateAction()");
-        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
-        builder.bindToAction(generatorSelector, "generatorSelectedAction()",
-                GeneratorTabController.GENERATOR_PROPERTY);
-
-        generatorSelectedAction();
-    }
-
-    public void generatorSelectedAction() {
-        GeneratorController controller = generatorSelector.getGeneratorController();
-        validate(controller);
-
-        Predicate<Object> predicate = controller != null
-                ? controller.getDefaultClassFilter()
-                : o -> false;
-
-        updateSelection(predicate);
-        classesSelector.classSelectedAction();
-    }
-
-    public void classesSelectedAction() {
-        int size = getSelectedEntitiesSize();
-        String label;
-
-        if (size == 0) {
-            label = "No entities selected";
-        }
-        else if (size == 1) {
-            label = "One entity selected";
-        }
-        else {
-            label = size + " entities selected";
-        }
-
-        label = label.concat("; ");
-
-        int sizeEmb = getSelectedEmbeddablesSize();
-
-        if (sizeEmb == 0) {
-            label = label + "No embeddables selected";
-        }
-        else if (sizeEmb == 1) {
-            label = label + "One embeddable selected";
-        }
-        else {
-            label = label + sizeEmb + " embeddables selected";
-        }
-
-        label = label.concat("; ");
-
-        int sizeDataMap = getSelectedDataMapsSize();
-
-        if(sizeDataMap == 0) {
-            label = label + "No datamaps selected";
-        } else if(sizeDataMap == 1) {
-            label = label + "One datamap selected";
-        } else {
-            label = label + sizeDataMap + " datamaps selected";
-        }
-
-        view.getClassesCount().setText(label);
-    }
-
-    public void cancelAction() {
-        view.dispose();
-    }
-
-    public void generateAction() {
-        Collection<ClassGenerationAction> generators = generatorSelector.getGenerator();
-
-        if (generators != null) {
-            try {
-                for (ClassGenerationAction generator : generators) {
-                    generator.execute();
-                }
-                JOptionPane.showMessageDialog(
-                        this.getView(),
-                        "Class generation finished");
-            } catch (Exception e) {
-                logObj.error("Error generating classes", e);
-                JOptionPane.showMessageDialog(
-                        this.getView(),
-                        "Error generating classes - " + e.getMessage());
-            }
-        }
-
-        view.dispose();
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.gen.ClassGenerationAction;
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
+//import org.apache.cayenne.modeler.util.CayenneController;
+//import org.apache.cayenne.swing.BindingBuilder;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//
+//import javax.swing.JOptionPane;
+//import java.awt.Component;
+//import java.util.Collection;
+//import java.util.function.Predicate;
+//
+///**
+// * A controller for the class generator dialog.
+// */
+//public class CodeGeneratorController extends CodeGeneratorControllerBase {
+//    /**
+//     * Logger to print stack traces
+//     */
+//    private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);
+//
+//    protected CodeGeneratorDialog view;
+//
+//    protected ClassesTabController classesSelector;
+//    protected GeneratorTabController generatorSelector;
+//
+//    public CodeGeneratorController(CayenneController parent, Collection<DataMap> dataMaps) {
+//        super(parent, dataMaps);
+//
+//        this.classesSelector = new ClassesTabController(this, dataMaps);
+//        this.generatorSelector = new GeneratorTabController(this);
+//    }
+//
+//    @Override
+//    public Component getView() {
+//        return view;
+//    }
+//
+//    public void startup() {
+//        // show dialog even on empty DataMap, as custom generation may still take
+//        // advantage of it
+//
+//        view = new CodeGeneratorDialog(generatorSelector.getView(), classesSelector.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()");
+//        builder.bindToAction(view.getGenerateButton(), "generateAction()");
+//        builder.bindToAction(this, "classesSelectedAction()", SELECTED_PROPERTY);
+//        builder.bindToAction(generatorSelector, "generatorSelectedAction()",
+//                GeneratorTabController.GENERATOR_PROPERTY);
+//
+//        generatorSelectedAction();
+//    }
+//
+//    public void generatorSelectedAction() {
+//        GeneratorController controller = generatorSelector.getGeneratorController();
+//        validate(controller);
+//
+//        Predicate<Object> predicate = controller != null
+//                ? controller.getDefaultClassFilter()
+//                : o -> false;
+//
+//        updateSelection(predicate);
+//        classesSelector.classSelectedAction();
+//    }
+//
+//    public void classesSelectedAction() {
+//        int size = getSelectedEntitiesSize();
+//        String label;
+//
+//        if (size == 0) {
+//            label = "No entities selected";
+//        }
+//        else if (size == 1) {
+//            label = "One entity selected";
+//        }
+//        else {
+//            label = size + " entities selected";
+//        }
+//
+//        label = label.concat("; ");
+//
+//        int sizeEmb = getSelectedEmbeddablesSize();
+//
+//        if (sizeEmb == 0) {
+//            label = label + "No embeddables selected";
+//        }
+//        else if (sizeEmb == 1) {
+//            label = label + "One embeddable selected";
+//        }
+//        else {
+//            label = label + sizeEmb + " embeddables selected";
+//        }
+//
+//        label = label.concat("; ");
+//
+//        int sizeDataMap = getSelectedDataMapsSize();
+//
+//        if(sizeDataMap == 0) {
+//            label = label + "No datamaps selected";
+//        } else if(sizeDataMap == 1) {
+//            label = label + "One datamap selected";
+//        } else {
+//            label = label + sizeDataMap + " datamaps selected";
+//        }
+//
+//        view.getClassesCount().setText(label);
+//    }
+//
+//    public void cancelAction() {
+//        view.dispose();
+//    }
+//
+//    public void generateAction() {
+//        Collection<ClassGenerationAction> generators = generatorSelector.getConfiguration();
+//
+//        if (generators != null) {
+//            try {
+//                for (ClassGenerationAction generator : generators) {
+//                    generator.execute();
+//                }
+//                JOptionPane.showMessageDialog(
+//                        this.getView(),
+//                        "Class generation finished");
+//            } catch (Exception e) {
+//                logObj.error("Error generating classes", e);
+//                JOptionPane.showMessageDialog(
+//                        this.getView(),
+//                        "Error generating classes - " + e.getMessage());
+//            }
+//        }
+//
+//        view.dispose();
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
index 91d87e4..3848126 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorControllerBase.java
@@ -1,380 +1,380 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.CellRenderers;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import javax.swing.Icon;
-import javax.swing.JLabel;
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Predicate;
-
-/**
- * A base superclass of a top controller for the code generator. Defines all common model
- * parts used in class generation.
- *
- */
-public abstract class CodeGeneratorControllerBase extends CayenneController {
-
-    public static final String SELECTED_PROPERTY = "selected";
-
-    protected Collection<DataMap> dataMaps;
-
-    protected ValidationResult validation;
-
-    protected List<Object> classes;
-
-    private Set<String> selectedEntities;
-    private Set<String> selectedEmbeddables;
-    private Set<String> selectedDataMaps;
-
-    private transient Object currentClass;
-
-    public CodeGeneratorControllerBase(CayenneController parent, Collection<DataMap> dataMaps) {
-        super(parent);
-
-        this.dataMaps = dataMaps;
-        this.classes = new ArrayList<>();
-
-        for(DataMap dataMap:dataMaps){
-            this.classes.addAll(dataMap.getObjEntities());
-            this.classes.addAll(dataMap.getEmbeddables());
-            this.classes.add(dataMap);
-        }
-        this.selectedEntities = new HashSet<>();
-        this.selectedEmbeddables = new HashSet<>();
-        this.selectedDataMaps = new HashSet<>();
-    }
-
-    public List<Object> getClasses() {
-        return classes;
-    }
-
-    public abstract Component getView();
-
-    public void validate(GeneratorController validator) {
-
-        ValidationResult validationBuffer = new ValidationResult();
-
-        if (validator != null) {
-            for (Object classObj : classes) {
-                if (classObj instanceof ObjEntity) {
-                    validator.validateEntity(
-                            validationBuffer,
-                            (ObjEntity) classObj,
-                            false);
-                }
-                else if (classObj instanceof Embeddable) {
-                    validator.validateEmbeddable(validationBuffer, (Embeddable) classObj);
-                }
-            }
-
-        }
-
-        this.validation = validationBuffer;
-    }
-
-    public boolean updateSelection(Predicate<Object> predicate) {
-
-        boolean modified = false;
-
-        for (Object classObj : classes) {
-            boolean select = predicate.test(classObj);
-            if (classObj instanceof ObjEntity) {
-
-                if (select) {
-                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
-                        modified = true;
-                    }
-                }
-                else {
-                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
-                        modified = true;
-                    }
-                }
-            }
-            else if (classObj instanceof Embeddable) {
-                if (select) {
-                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
-                        modified = true;
-                    }
-                }
-                else {
-                    if (selectedEmbeddables
-                            .remove(((Embeddable) classObj).getClassName())) {
-                        modified = true;
-                    }
-                }
-            } else if(classObj instanceof DataMap) {
-                if(select) {
-                    if(selectedDataMaps.add(((DataMap) classObj).getName())) {
-                        modified = true;
-                    }
-                } else {
-                    if(selectedDataMaps.remove(((DataMap) classObj).getName())) {
-                        modified = true;
-                    }
-                }
-            }
-
-        }
-
-        if (modified) {
-            firePropertyChange(SELECTED_PROPERTY, null, null);
-        }
-
-        return modified;
-    }
-
-    public boolean updateDataMapSelection(Predicate<Object> predicate, DataMap dataMap) {
-
-        boolean modified = false;
-
-        for (Object classObj : classes) {
-            boolean select = predicate.test(classObj);
-            if (classObj instanceof ObjEntity) {
-                if(dataMap.getObjEntities().contains(classObj)) {
-                    if (select) {
-                        if (selectedEntities.add(((ObjEntity) classObj).getName())) {
-                            modified = true;
-                        }
-                    } else {
-                        if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
-                            modified = true;
-                        }
-                    }
-                }
-            }
-            else if (classObj instanceof Embeddable) {
-                if(dataMap.getEmbeddables().contains(classObj)) {
-                    if (select) {
-                        if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
-                            modified = true;
-                        }
-                    } else {
-                        if (selectedEmbeddables
-                                .remove(((Embeddable) classObj).getClassName())) {
-                            modified = true;
-                        }
-                    }
-                }
-            } else {
-                if(dataMap == classObj) {
-                    if (select) {
-                        if (selectedDataMaps.add(((DataMap) classObj).getName())) {
-                            modified = true;
-                        }
-                    } else {
-                        if (selectedDataMaps.remove(((DataMap) classObj).getName())) {
-                            modified = true;
-                        }
-                    }
-                }
-            }
-
-        }
-
-        if (modified) {
-            firePropertyChange(SELECTED_PROPERTY, null, null);
-        }
-
-        return modified;
-    }
-
-    public List<Embeddable> getSelectedEmbeddables() {
-
-        List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
-
-        for (Object classObj : classes) {
-            if (classObj instanceof Embeddable
-                    && selectedEmbeddables.contains(((Embeddable) classObj)
-                    .getClassName())) {
-                selected.add((Embeddable) classObj);
-            }
-        }
-
-        return selected;
-    }
-
-    public List<ObjEntity> getSelectedEntities() {
-        List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
-        for (Object classObj : classes) {
-            if (classObj instanceof ObjEntity
-                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
-                selected.add(((ObjEntity) classObj));
-            }
-        }
-
-        return selected;
-    }
-
-    public List<DataMap> getSelectedDataMaps() {
-        List<DataMap> selected = new ArrayList<>(selectedDataMaps.size());
-        for(Object classObj : classes) {
-            if(classObj instanceof DataMap
-                    && selectedDataMaps.contains(((DataMap) classObj).getName())) {
-                selected.add((DataMap) classObj);
-            }
-        }
-        return selected;
-    }
-
-    public int getSelectedEntitiesSize() {
-        return selectedEntities.size();
-    }
-
-    public int getSelectedEmbeddablesSize() {
-        return selectedEmbeddables.size();
-    }
-
-    public int getSelectedDataMapsSize() {
-        return selectedDataMaps.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.
-     */
-    public String getProblem(Object obj) {
-
-        String name = null;
-
-        if (obj instanceof ObjEntity) {
-            name = ((ObjEntity) obj).getName();
-        }
-        else if (obj instanceof Embeddable) {
-            name = ((Embeddable) obj).getClassName();
-        }
-
-        if (validation == null) {
-            return null;
-        }
-
-        List failures = validation.getFailures(name);
-        if (failures.isEmpty()) {
-            return null;
-        }
-
-        return ((ValidationFailure) failures.get(0)).getDescription();
-    }
-
-    public boolean isSelected() {
-        if (currentClass instanceof ObjEntity) {
-            return selectedEntities
-                    .contains(((ObjEntity) currentClass).getName());
-        }
-        if (currentClass instanceof Embeddable) {
-            return selectedEmbeddables
-                    .contains(((Embeddable) currentClass).getClassName());
-        }
-        if(currentClass instanceof DataMap) {
-            return selectedDataMaps
-                    .contains(((DataMap) currentClass).getName());
-        }
-        return false;
-
-    }
-
-    public void setSelected(boolean selectedFlag) {
-        if (currentClass == null) {
-            return;
-        }
-        if (currentClass instanceof ObjEntity) {
-            if (selectedFlag) {
-                if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            }
-            else {
-                if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            }
-        }
-        if (currentClass instanceof Embeddable) {
-            if (selectedFlag) {
-                if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            }
-            else {
-                if (selectedEmbeddables
-                        .remove(((Embeddable) currentClass).getClassName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            }
-        }
-        if(currentClass instanceof DataMap) {
-            if(selectedFlag) {
-                if(selectedDataMaps.add(((DataMap) currentClass).getName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            } else {
-                if(selectedDataMaps.remove(((DataMap) currentClass).getName())) {
-                    firePropertyChange(SELECTED_PROPERTY, null, null);
-                }
-            }
-        }
-    }
-
-    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;
-        if (obj instanceof Embeddable) {
-            className = ((Embeddable) obj).getClassName();
-            icon = CellRenderers.iconForObject(new Embeddable());
-        } else if(obj instanceof ObjEntity) {
-            className = ((ObjEntity) obj).getName();
-            icon = CellRenderers.iconForObject(new ObjEntity());
-        } else {
-            className = ((DataMap) obj).getName();
-            icon = CellRenderers.iconForObject(new DataMap());
-        }
-        JLabel labelIcon = new JLabel();
-        labelIcon.setIcon(icon);
-        labelIcon.setVisible(true);
-        labelIcon.setText(className);
-        return labelIcon;
-    }
-
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.map.DataMap;
+//import org.apache.cayenne.map.Embeddable;
+//import org.apache.cayenne.map.ObjEntity;
+//import org.apache.cayenne.modeler.util.CayenneController;
+//import org.apache.cayenne.modeler.util.CellRenderers;
+//import org.apache.cayenne.validation.ValidationFailure;
+//import org.apache.cayenne.validation.ValidationResult;
+//
+//import javax.swing.Icon;
+//import javax.swing.JLabel;
+//import java.awt.Component;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.HashSet;
+//import java.util.List;
+//import java.util.Set;
+//import java.util.function.Predicate;
+//
+///**
+// * A base superclass of a top controller for the code generator. Defines all common model
+// * parts used in class generation.
+// *
+// */
+//public abstract class CodeGeneratorControllerBase extends CayenneController {
+//
+//    public static final String SELECTED_PROPERTY = "selected";
+//
+//    protected Collection<DataMap> dataMaps;
+//
+//    protected ValidationResult validation;
+//
+//    protected List<Object> classes;
+//
+//    private Set<String> selectedEntities;
+//    private Set<String> selectedEmbeddables;
+//    private Set<String> selectedDataMaps;
+//
+//    private transient Object currentClass;
+//
+//    public CodeGeneratorControllerBase(CayenneController parent, Collection<DataMap> dataMaps) {
+//        super(parent);
+//
+//        this.dataMaps = dataMaps;
+//        this.classes = new ArrayList<>();
+//
+//        for(DataMap dataMap:dataMaps){
+//            this.classes.addAll(dataMap.getObjEntities());
+//            this.classes.addAll(dataMap.getEmbeddables());
+//            this.classes.add(dataMap);
+//        }
+//        this.selectedEntities = new HashSet<>();
+//        this.selectedEmbeddables = new HashSet<>();
+//        this.selectedDataMaps = new HashSet<>();
+//    }
+//
+//    public List<Object> getClasses() {
+//        return classes;
+//    }
+//
+//    public abstract Component getView();
+//
+//    public void validate(GeneratorController validator) {
+//
+//        ValidationResult validationBuffer = new ValidationResult();
+//
+//        if (validator != null) {
+//            for (Object classObj : classes) {
+//                if (classObj instanceof ObjEntity) {
+//                    validator.validateEntity(
+//                            validationBuffer,
+//                            (ObjEntity) classObj,
+//                            false);
+//                }
+//                else if (classObj instanceof Embeddable) {
+//                    validator.validateEmbeddable(validationBuffer, (Embeddable) classObj);
+//                }
+//            }
+//
+//        }
+//
+//        this.validation = validationBuffer;
+//    }
+//
+//    public boolean updateSelection(Predicate<Object> predicate) {
+//
+//        boolean modified = false;
+//
+//        for (Object classObj : classes) {
+//            boolean select = predicate.test(classObj);
+//            if (classObj instanceof ObjEntity) {
+//
+//                if (select) {
+//                    if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+//                        modified = true;
+//                    }
+//                }
+//                else {
+//                    if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+//                        modified = true;
+//                    }
+//                }
+//            }
+//            else if (classObj instanceof Embeddable) {
+//                if (select) {
+//                    if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+//                        modified = true;
+//                    }
+//                }
+//                else {
+//                    if (selectedEmbeddables
+//                            .remove(((Embeddable) classObj).getClassName())) {
+//                        modified = true;
+//                    }
+//                }
+//            } else if(classObj instanceof DataMap) {
+//                if(select) {
+//                    if(selectedDataMaps.add(((DataMap) classObj).getName())) {
+//                        modified = true;
+//                    }
+//                } else {
+//                    if(selectedDataMaps.remove(((DataMap) classObj).getName())) {
+//                        modified = true;
+//                    }
+//                }
+//            }
+//
+//        }
+//
+//        if (modified) {
+//            firePropertyChange(SELECTED_PROPERTY, null, null);
+//        }
+//
+//        return modified;
+//    }
+//
+//    public boolean updateDataMapSelection(Predicate<Object> predicate, DataMap dataMap) {
+//
+//        boolean modified = false;
+//
+//        for (Object classObj : classes) {
+//            boolean select = predicate.test(classObj);
+//            if (classObj instanceof ObjEntity) {
+//                if(dataMap.getObjEntities().contains(classObj)) {
+//                    if (select) {
+//                        if (selectedEntities.add(((ObjEntity) classObj).getName())) {
+//                            modified = true;
+//                        }
+//                    } else {
+//                        if (selectedEntities.remove(((ObjEntity) classObj).getName())) {
+//                            modified = true;
+//                        }
+//                    }
+//                }
+//            }
+//            else if (classObj instanceof Embeddable) {
+//                if(dataMap.getEmbeddables().contains(classObj)) {
+//                    if (select) {
+//                        if (selectedEmbeddables.add(((Embeddable) classObj).getClassName())) {
+//                            modified = true;
+//                        }
+//                    } else {
+//                        if (selectedEmbeddables
+//                                .remove(((Embeddable) classObj).getClassName())) {
+//                            modified = true;
+//                        }
+//                    }
+//                }
+//            } else {
+//                if(dataMap == classObj) {
+//                    if (select) {
+//                        if (selectedDataMaps.add(((DataMap) classObj).getName())) {
+//                            modified = true;
+//                        }
+//                    } else {
+//                        if (selectedDataMaps.remove(((DataMap) classObj).getName())) {
+//                            modified = true;
+//                        }
+//                    }
+//                }
+//            }
+//
+//        }
+//
+//        if (modified) {
+//            firePropertyChange(SELECTED_PROPERTY, null, null);
+//        }
+//
+//        return modified;
+//    }
+//
+//    public List<Embeddable> getSelectedEmbeddables() {
+//
+//        List<Embeddable> selected = new ArrayList<>(selectedEmbeddables.size());
+//
+//        for (Object classObj : classes) {
+//            if (classObj instanceof Embeddable
+//                    && selectedEmbeddables.contains(((Embeddable) classObj)
+//                    .getClassName())) {
+//                selected.add((Embeddable) classObj);
+//            }
+//        }
+//
+//        return selected;
+//    }
+//
+//    public List<ObjEntity> getSelectedEntities() {
+//        List<ObjEntity> selected = new ArrayList<>(selectedEntities.size());
+//        for (Object classObj : classes) {
+//            if (classObj instanceof ObjEntity
+//                    && selectedEntities.contains(((ObjEntity) classObj).getName())) {
+//                selected.add(((ObjEntity) classObj));
+//            }
+//        }
+//
+//        return selected;
+//    }
+//
+//    public List<DataMap> getSelectedDataMaps() {
+//        List<DataMap> selected = new ArrayList<>(selectedDataMaps.size());
+//        for(Object classObj : classes) {
+//            if(classObj instanceof DataMap
+//                    && selectedDataMaps.contains(((DataMap) classObj).getName())) {
+//                selected.add((DataMap) classObj);
+//            }
+//        }
+//        return selected;
+//    }
+//
+//    public int getSelectedEntitiesSize() {
+//        return selectedEntities.size();
+//    }
+//
+//    public int getSelectedEmbeddablesSize() {
+//        return selectedEmbeddables.size();
+//    }
+//
+//    public int getSelectedDataMapsSize() {
+//        return selectedDataMaps.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.
+//     */
+//    public String getProblem(Object obj) {
+//
+//        String name = null;
+//
+//        if (obj instanceof ObjEntity) {
+//            name = ((ObjEntity) obj).getName();
+//        }
+//        else if (obj instanceof Embeddable) {
+//            name = ((Embeddable) obj).getClassName();
+//        }
+//
+//        if (validation == null) {
+//            return null;
+//        }
+//
+//        List failures = validation.getFailures(name);
+//        if (failures.isEmpty()) {
+//            return null;
+//        }
+//
+//        return ((ValidationFailure) failures.get(0)).getDescription();
+//    }
+//
+//    public boolean isSelected() {
+//        if (currentClass instanceof ObjEntity) {
+//            return selectedEntities
+//                    .contains(((ObjEntity) currentClass).getName());
+//        }
+//        if (currentClass instanceof Embeddable) {
+//            return selectedEmbeddables
+//                    .contains(((Embeddable) currentClass).getClassName());
+//        }
+//        if(currentClass instanceof DataMap) {
+//            return selectedDataMaps
+//                    .contains(((DataMap) currentClass).getName());
+//        }
+//        return false;
+//
+//    }
+//
+//    public void setSelected(boolean selectedFlag) {
+//        if (currentClass == null) {
+//            return;
+//        }
+//        if (currentClass instanceof ObjEntity) {
+//            if (selectedFlag) {
+//                if (selectedEntities.add(((ObjEntity) currentClass).getName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            }
+//            else {
+//                if (selectedEntities.remove(((ObjEntity) currentClass).getName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            }
+//        }
+//        if (currentClass instanceof Embeddable) {
+//            if (selectedFlag) {
+//                if (selectedEmbeddables.add(((Embeddable) currentClass).getClassName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            }
+//            else {
+//                if (selectedEmbeddables
+//                        .remove(((Embeddable) currentClass).getClassName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            }
+//        }
+//        if(currentClass instanceof DataMap) {
+//            if(selectedFlag) {
+//                if(selectedDataMaps.add(((DataMap) currentClass).getName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            } else {
+//                if(selectedDataMaps.remove(((DataMap) currentClass).getName())) {
+//                    firePropertyChange(SELECTED_PROPERTY, null, null);
+//                }
+//            }
+//        }
+//    }
+//
+//    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;
+//        if (obj instanceof Embeddable) {
+//            className = ((Embeddable) obj).getClassName();
+//            icon = CellRenderers.iconForObject(new Embeddable());
+//        } else if(obj instanceof ObjEntity) {
+//            className = ((ObjEntity) obj).getName();
+//            icon = CellRenderers.iconForObject(new ObjEntity());
+//        } else {
+//            className = ((DataMap) obj).getName();
+//            icon = CellRenderers.iconForObject(new DataMap());
+//        }
+//        JLabel labelIcon = new JLabel();
+//        labelIcon.setIcon(icon);
+//        labelIcon.setVisible(true);
+//        labelIcon.setText(className);
+//        return labelIcon;
+//    }
+//
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
index 2bb635f..c4f4bd1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CodeGeneratorDialog.java
@@ -1,99 +1,99 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.swing.components.TopBorder;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.ScrollPaneConstants;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-/**
- */
-public class CodeGeneratorDialog extends JDialog {
-
-    private JButton generateButton;
-    protected JButton cancelButton;
-    private JLabel classesCount;
-
-    CodeGeneratorDialog(Component generatorPanel, Component entitySelectorPanel) {
-        super(Application.getFrame());
-
-        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
-        splitPane.setFocusable(false);
-
-        this.generateButton = new JButton("Generate");
-        getRootPane().setDefaultButton(generateButton);
-
-        this.cancelButton = new JButton("Cancel");
-        this.classesCount = new JLabel("No classes selected");
-        classesCount.setFont(classesCount.getFont().deriveFont(10f));
-
-
-        JScrollPane scrollPane = new JScrollPane(
-                generatorPanel,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        scrollPane.setPreferredSize(new Dimension(630, 500));
-
-        splitPane.setLeftComponent(entitySelectorPanel);
-        splitPane.setRightComponent(scrollPane);
-
-        JPanel messages = new JPanel(new BorderLayout());
-        messages.add(classesCount, BorderLayout.WEST);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.setBorder(TopBorder.create());
-        buttons.add(classesCount);
-        buttons.add(Box.createHorizontalStrut(50));
-        buttons.add(cancelButton);
-        buttons.add(generateButton);
-
-        Container contentPane = getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(splitPane, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-
-        setTitle("Code Generation");
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JLabel getClassesCount() {
-        return classesCount;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import org.apache.cayenne.modeler.Application;
+//import org.apache.cayenne.swing.components.TopBorder;
+//
+//import javax.swing.Box;
+//import javax.swing.JButton;
+//import javax.swing.JDialog;
+//import javax.swing.JLabel;
+//import javax.swing.JPanel;
+//import javax.swing.JScrollPane;
+//import javax.swing.JSplitPane;
+//import javax.swing.ScrollPaneConstants;
+//import java.awt.BorderLayout;
+//import java.awt.Component;
+//import java.awt.Container;
+//import java.awt.Dimension;
+//import java.awt.FlowLayout;
+//
+///**
+// */
+//public class CodeGeneratorDialog extends JDialog {
+//
+//    private JButton generateButton;
+//    protected JButton cancelButton;
+//    private JLabel classesCount;
+//
+//    CodeGeneratorDialog(Component generatorPanel, Component entitySelectorPanel) {
+//        super(Application.getFrame());
+//
+//        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
+//        splitPane.setFocusable(false);
+//
+//        this.generateButton = new JButton("Generate");
+//        getRootPane().setDefaultButton(generateButton);
+//
+//        this.cancelButton = new JButton("Cancel");
+//        this.classesCount = new JLabel("No classes selected");
+//        classesCount.setFont(classesCount.getFont().deriveFont(10f));
+//
+//
+//        JScrollPane scrollPane = new JScrollPane(
+//                generatorPanel,
+//                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+//                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+//        scrollPane.setPreferredSize(new Dimension(630, 500));
+//
+//        splitPane.setLeftComponent(entitySelectorPanel);
+//        splitPane.setRightComponent(scrollPane);
+//
+//        JPanel messages = new JPanel(new BorderLayout());
+//        messages.add(classesCount, BorderLayout.WEST);
+//
+//        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+//        buttons.setBorder(TopBorder.create());
+//        buttons.add(classesCount);
+//        buttons.add(Box.createHorizontalStrut(50));
+//        buttons.add(cancelButton);
+//        buttons.add(generateButton);
+//
+//        Container contentPane = getContentPane();
+//        contentPane.setLayout(new BorderLayout());
+//        contentPane.add(splitPane, BorderLayout.CENTER);
+//        contentPane.add(buttons, BorderLayout.SOUTH);
+//
+//        setTitle("Code Generation");
+//    }
+//
+//    public JButton getCancelButton() {
+//        return cancelButton;
+//    }
+//
+//    public JButton getGenerateButton() {
+//        return generateButton;
+//    }
+//
+//    public JLabel getClassesCount() {
+//        return classesCount;
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
index bb87006..344bd72 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModeController.java
@@ -1,235 +1,235 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-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;
-import org.apache.cayenne.util.Util;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import java.awt.Component;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.TreeMap;
-
-import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
-import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
-import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
-import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
-
-/**
- * A controller for the custom generation mode.
- */
-public class CustomModeController extends GeneratorController {
-
-	// correspond to non-public constants on MapClassGenerator.
-	private static final String MODE_ENTITY = "entity";
-
-	protected CustomModePanel view;
-	private CodeTemplateManager templateManager;
-
-	private ObjectBinding superTemplate;
-	private ObjectBinding subTemplate;
-
-	private CustomPreferencesUpdater preferencesUpdater;
-
-	public CustomPreferencesUpdater getCustomPreferencesUpdater() {
-		return preferencesUpdater;
-	}
-
-	public CustomModeController(CodeGeneratorControllerBase parent) {
-		super(parent);
-
-		// bind preferences and init defaults...
-
-		Set<Entry<DataMap, DataMapDefaults>> entities = getMapPreferences().entrySet();
-
-		for (Entry<DataMap, DataMapDefaults> entry : entities) {
-
-			if (Util.isEmptyString(entry.getValue().getSuperclassTemplate())) {
-				entry.getValue().setSuperclassTemplate(STANDARD_SERVER_SUPERCLASS);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getSubclassTemplate())) {
-				entry.getValue().setSubclassTemplate(STANDARD_SERVER_SUBCLASS);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getProperty("mode"))) {
-				entry.getValue().setProperty("mode", MODE_ENTITY);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getProperty("overwrite"))) {
-				entry.getValue().setBooleanProperty("overwrite", false);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getProperty("pairs"))) {
-				entry.getValue().setBooleanProperty("pairs", true);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getProperty("usePackagePath"))) {
-				entry.getValue().setBooleanProperty("usePackagePath", true);
-			}
-
-			if (Util.isEmptyString(entry.getValue().getProperty("outputPattern"))) {
-				entry.getValue().setProperty("outputPattern", "*.java");
-			}
-		}
-
-		BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
-
-		builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
-
-		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();
-
-		builder.bindToStateChange(view.getCreatePKProperties(), "customPreferencesUpdater.createPKProperties")
-				.updateView();
-
-		updateTemplates();
-	}
-
-	protected void createDefaults() {
-		TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
-		Collection<DataMap> dataMaps = getParentController().getDataMaps();
-		for (DataMap dataMap : dataMaps) {
-			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 GeneratorControllerPanel createView() {
-		this.view = new CustomModePanel();
-		return view;
-	}
-
-	private void updateTemplates() {
-		this.templateManager = getApplication().getCodeTemplateManager();
-
-		List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
-		Collections.sort(customTemplates);
-
-		List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
-		Collections.sort(superTemplates);
-		superTemplates.addAll(customTemplates);
-
-		List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
-		Collections.sort(subTemplates);
-		subTemplates.addAll(customTemplates);
-
-		this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
-		this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
-
-		JCheckBox pairs = this.view.getPairs();
-		updateView();
-		pairs.addItemListener(e -> updateView());
-
-		superTemplate.updateView();
-		subTemplate.updateView();
-	}
-
-	private void updateView() {
-		boolean selected = view.getPairs().isSelected();
-		JComboBox<String> subclassTemplate = view.getSubclassTemplate();
-		subclassTemplate.setSelectedItem(selected ? STANDARD_SERVER_SUBCLASS : SINGLE_SERVER_CLASS);
-		view.getSuperclassTemplate().setEnabled(selected);
-		view.getOverwrite().setEnabled(!selected);
-	}
-
-	public Component getView() {
-		return view;
-	}
-
-	public Collection<ClassGenerationAction> createGenerator() {
-
-		Collection<ClassGenerationAction> generators = super.createGenerator();
-
-		String superKey = Objects.requireNonNull(view.getSuperclassTemplate().getSelectedItem()).toString();
-		String superTemplate = templateManager.getTemplatePath(superKey);
-
-		String subKey = Objects.requireNonNull(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());
-			generator.setCreatePKProperties(view.getCreatePKProperties().isSelected());
-
-			if (!Util.isEmptyString(view.getOutputPattern().getText())) {
-				generator.setOutputPattern(view.getOutputPattern().getText());
-			}
-		}
-
-		return generators;
-	}
-
-	public void popPreferencesAction() {
-		new PreferenceDialog(getApplication().getFrameController()).startupAction(TEMPLATES_KEY);
-		updateTemplates();
-	}
-
-	@Override
-	protected ClassGenerationAction newGenerator() {
-		ClassGenerationAction action = new ClassGenerationAction();
-		getApplication().getInjector().injectMembers(action);
-		return action;
-	}
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//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;
+//import org.apache.cayenne.util.Util;
+//
+//import javax.swing.DefaultComboBoxModel;
+//import javax.swing.JCheckBox;
+//import javax.swing.JComboBox;
+//import java.awt.Component;
+//import java.util.List;
+//import java.util.ArrayList;
+//import java.util.Collection;
+//import java.util.Collections;
+//import java.util.Map.Entry;
+//import java.util.Objects;
+//import java.util.Set;
+//import java.util.TreeMap;
+//
+//import static org.apache.cayenne.modeler.CodeTemplateManager.SINGLE_SERVER_CLASS;
+//import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUBCLASS;
+//import static org.apache.cayenne.modeler.CodeTemplateManager.STANDARD_SERVER_SUPERCLASS;
+//import static org.apache.cayenne.modeler.dialog.pref.PreferenceDialog.TEMPLATES_KEY;
+//
+///**
+// * A controller for the custom generation mode.
+// */
+//public class CustomModeController extends GeneratorController {
+//
+//	// correspond to non-public constants on MapClassGenerator.
+//	private static final String MODE_ENTITY = "entity";
+//
+//	protected CustomModePanel view;
+//	private CodeTemplateManager templateManager;
+//
+//	private ObjectBinding superTemplate;
+//	private ObjectBinding subTemplate;
+//
+//	private CustomPreferencesUpdater preferencesUpdater;
+//
+//	public CustomPreferencesUpdater getCustomPreferencesUpdater() {
+//		return preferencesUpdater;
+//	}
+//
+//	public CustomModeController(CodeGeneratorControllerBase parent) {
+//		super(parent);
+//
+//		// bind preferences and init defaults...
+//
+//		Set<Entry<DataMap, DataMapDefaults>> entities = getMapPreferences().entrySet();
+//
+//		for (Entry<DataMap, DataMapDefaults> entry : entities) {
+//
+//			if (Util.isEmptyString(entry.getValue().getSuperclassTemplate())) {
+//				entry.getValue().setSuperclassTemplate(STANDARD_SERVER_SUPERCLASS);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getSubclassTemplate())) {
+//				entry.getValue().setSubclassTemplate(STANDARD_SERVER_SUBCLASS);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getProperty("mode"))) {
+//				entry.getValue().setProperty("mode", MODE_ENTITY);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getProperty("overwrite"))) {
+//				entry.getValue().setBooleanProperty("overwrite", false);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getProperty("pairs"))) {
+//				entry.getValue().setBooleanProperty("pairs", true);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getProperty("usePackagePath"))) {
+//				entry.getValue().setBooleanProperty("usePackagePath", true);
+//			}
+//
+//			if (Util.isEmptyString(entry.getValue().getProperty("outputPattern"))) {
+//				entry.getValue().setProperty("outputPattern", "*.java");
+//			}
+//		}
+//
+//		BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
+//
+//		builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()");
+//
+//		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();
+//
+//		builder.bindToStateChange(view.getCreatePKProperties(), "customPreferencesUpdater.createPKProperties")
+//				.updateView();
+//
+//		updateTemplates();
+//	}
+//
+//	protected void createDefaults() {
+//		TreeMap<DataMap, DataMapDefaults> map = new TreeMap<DataMap, DataMapDefaults>();
+//		Collection<DataMap> dataMaps = getParentController().getDataMaps();
+//		for (DataMap dataMap : dataMaps) {
+//			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 GeneratorControllerPanel createView() {
+//		this.view = new CustomModePanel();
+//		return view;
+//	}
+//
+//	private void updateTemplates() {
+//		this.templateManager = getApplication().getCodeTemplateManager();
+//
+//		List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet());
+//		Collections.sort(customTemplates);
+//
+//		List<String> superTemplates = new ArrayList<>(templateManager.getStandardSuperclassTemplates());
+//		Collections.sort(superTemplates);
+//		superTemplates.addAll(customTemplates);
+//
+//		List<String> subTemplates = new ArrayList<>(templateManager.getStandardSubclassTemplates());
+//		Collections.sort(subTemplates);
+//		subTemplates.addAll(customTemplates);
+//
+//		this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel<>(subTemplates.toArray(new String[0])));
+//		this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel<>(superTemplates.toArray(new String[0])));
+//
+//		JCheckBox pairs = this.view.getPairs();
+//		updateView();
+//		pairs.addItemListener(e -> updateView());
+//
+//		superTemplate.updateView();
+//		subTemplate.updateView();
+//	}
+//
+//	private void updateView() {
+//		boolean selected = view.getPairs().isSelected();
+//		JComboBox<String> subclassTemplate = view.getSubclassTemplate();
+//		subclassTemplate.setSelectedItem(selected ? STANDARD_SERVER_SUBCLASS : SINGLE_SERVER_CLASS);
+//		view.getSuperclassTemplate().setEnabled(selected);
+//		view.getOverwrite().setEnabled(!selected);
+//	}
+//
+//	public Component getView() {
+//		return view;
+//	}
+//
+//	public Collection<ClassGenerationAction> createConfiguration() {
+//
+//		Collection<ClassGenerationAction> generators = super.createConfiguration();
+//
+//		String superKey = Objects.requireNonNull(view.getSuperclassTemplate().getSelectedItem()).toString();
+//		String superTemplate = templateManager.getTemplatePath(superKey);
+//
+//		String subKey = Objects.requireNonNull(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());
+//			generator.setCreatePKProperties(view.getCreatePKProperties().isSelected());
+//
+//			if (!Util.isEmptyString(view.getOutputPattern().getText())) {
+//				generator.setOutputPattern(view.getOutputPattern().getText());
+//			}
+//		}
+//
+//		return generators;
+//	}
+//
+//	public void popPreferencesAction() {
+//		new PreferenceDialog(getApplication().getFrameController()).startupAction(TEMPLATES_KEY);
+//		updateTemplates();
+//	}
+//
+//	@Override
+//	protected ClassGenerationAction newGenerator() {
+//		ClassGenerationAction action = new ClassGenerationAction();
+//		getApplication().getInjector().injectMembers(action);
+//		return action;
+//	}
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
index 406e1d2..6396abd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/CustomModePanel.java
@@ -1,137 +1,137 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.swing.control.ActionLink;
-
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-public class CustomModePanel extends GeneratorControllerPanel {
-
-    private JComboBox<String> subclassTemplate;
-    private JComboBox<String> superclassTemplate;
-    protected JCheckBox pairs;
-    private JCheckBox overwrite;
-    private JCheckBox usePackagePath;
-    private JTextField outputPattern;
-    private JCheckBox createPropertyNames;
-    private JCheckBox createPKProperties;
-
-    private ActionLink manageTemplatesLink;
-
-    CustomModePanel() {
-
-        this.superclassTemplate = new JComboBox<>();
-        this.subclassTemplate = new JComboBox<>();
-        this.pairs = new JCheckBox();
-        this.overwrite = new JCheckBox();
-        this.usePackagePath = new JCheckBox();
-        this.outputPattern = new JTextField();
-        this.createPropertyNames = new JCheckBox();
-        this.createPKProperties = new JCheckBox();
-        this.manageTemplatesLink = new ActionLink("Customize Templates...");
-        manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
-
-        // assemble
-        FormLayout layout = new FormLayout(
-                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        builder.append("Output Directory:", outputFolder, selectOutputFolder);
-        builder.nextLine();
-
-        builder.append("Subclass Template:", subclassTemplate);
-        builder.nextLine();
-
-        builder.append("Superclass Template:", superclassTemplate);
-        builder.nextLine();
-
-        builder.append("Output Pattern:", outputPattern);
-        builder.nextLine();
-
-        builder.append("Make Pairs:", pairs);
-        builder.nextLine();
-
-        builder.append("Use Package Path:", usePackagePath);
-        builder.nextLine();
-
-        builder.append("Overwrite Subclasses:", overwrite);
-        builder.nextLine();
-
-        builder.append("Create Property Names:", createPropertyNames);
-        builder.nextLine();
-
-        builder.append("Create PK Properties:", createPKProperties);
-        builder.nextLine();
-
-        setLayout(new BorderLayout());
-        add(builder.getPanel(), BorderLayout.CENTER);
-
-        JPanel links = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        links.add(manageTemplatesLink);
-        add(links, BorderLayout.SOUTH);
-
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public ActionLink getManageTemplatesLink() {
-        return manageTemplatesLink;
-    }
-
-    public JComboBox<String> getSubclassTemplate() {
-        return subclassTemplate;
-    }
-
-    public JComboBox<String> getSuperclassTemplate() {
-        return superclassTemplate;
-    }
-
-    public JCheckBox getOverwrite() {
-        return overwrite;
-    }
-
-    public JCheckBox getPairs() {
-        return pairs;
-    }
-
-    public JCheckBox getUsePackagePath() {
-        return usePackagePath;
-    }
-
-    public JTextField getOutputPattern() {
-        return outputPattern;
-    }
-
-    public JCheckBox getCreatePropertyNames() {
-        return createPropertyNames;
-    }
-
-    public JCheckBox getCreatePKProperties() {
-        return createPKProperties;
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import com.jgoodies.forms.builder.DefaultFormBuilder;
+//import com.jgoodies.forms.layout.FormLayout;
+//import org.apache.cayenne.swing.control.ActionLink;
+//
+//import javax.swing.JCheckBox;
+//import javax.swing.JComboBox;
+//import javax.swing.JPanel;
+//import javax.swing.JTextField;
+//import java.awt.BorderLayout;
+//import java.awt.FlowLayout;
+//
+//public class CustomModePanel extends GeneratorControllerPanel {
+//
+//    private JComboBox<String> subclassTemplate;
+//    private JComboBox<String> superclassTemplate;
+//    protected JCheckBox pairs;
+//    private JCheckBox overwrite;
+//    private JCheckBox usePackagePath;
+//    private JTextField outputPattern;
+//    private JCheckBox createPropertyNames;
+//    private JCheckBox createPKProperties;
+//
+//    private ActionLink manageTemplatesLink;
+//
+//    CustomModePanel() {
+//
+//        this.superclassTemplate = new JComboBox<>();
+//        this.subclassTemplate = new JComboBox<>();
+//        this.pairs = new JCheckBox();
+//        this.overwrite = new JCheckBox();
+//        this.usePackagePath = new JCheckBox();
+//        this.outputPattern = new JTextField();
+//        this.createPropertyNames = new JCheckBox();
+//        this.createPKProperties = new JCheckBox();
+//        this.manageTemplatesLink = new ActionLink("Customize Templates...");
+//        manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f));
+//
+//        // assemble
+//        FormLayout layout = new FormLayout(
+//                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
+//        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+//        builder.setDefaultDialogBorder();
+//
+//        builder.append("Output Directory:", outputFolder, selectOutputFolder);
+//        builder.nextLine();
+//
+//        builder.append("Subclass Template:", subclassTemplate);
+//        builder.nextLine();
+//
+//        builder.append("Superclass Template:", superclassTemplate);
+//        builder.nextLine();
+//
+//        builder.append("Output Pattern:", outputPattern);
+//        builder.nextLine();
+//
+//        builder.append("Make Pairs:", pairs);
+//        builder.nextLine();
+//
+//        builder.append("Use Package Path:", usePackagePath);
+//        builder.nextLine();
+//
+//        builder.append("Overwrite Subclasses:", overwrite);
+//        builder.nextLine();
+//
+//        builder.append("Create Property Names:", createPropertyNames);
+//        builder.nextLine();
+//
+//        builder.append("Create PK Properties:", createPKProperties);
+//        builder.nextLine();
+//
+//        setLayout(new BorderLayout());
+//        add(builder.getPanel(), BorderLayout.CENTER);
+//
+//        JPanel links = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+//        links.add(manageTemplatesLink);
+//        add(links, BorderLayout.SOUTH);
+//
+//        add(builder.getPanel(), BorderLayout.CENTER);
+//    }
+//
+//    public ActionLink getManageTemplatesLink() {
+//        return manageTemplatesLink;
+//    }
+//
+//    public JComboBox<String> getSubclassTemplate() {
+//        return subclassTemplate;
+//    }
+//
+//    public JComboBox<String> getSuperclassTemplate() {
+//        return superclassTemplate;
+//    }
+//
+//    public JCheckBox getOverwrite() {
+//        return overwrite;
+//    }
+//
+//    public JCheckBox getPairs() {
+//        return pairs;
+//    }
+//
+//    public JCheckBox getUsePackagePath() {
+//        return usePackagePath;
+//    }
+//
+//    public JTextField getOutputPattern() {
+//        return outputPattern;
+//    }
+//
+//    public JCheckBox getCreatePropertyNames() {
+//        return createPropertyNames;
+//    }
+//
+//    public JCheckBox getCreatePKProperties() {
+//        return createPKProperties;
+//    }
+//}
\ No newline at end of file


[14/32] cayenne git commit: Cgen tab, cgen configuration, cgen in maven, ant, gradle.

Posted by nt...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
index cbb3f35..81bd599 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardModePanel.java
@@ -1,42 +1,42 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-import java.awt.BorderLayout;
-
-public class StandardModePanel extends GeneratorControllerPanel {
-
-    private DefaultFormBuilder builder;
-
-    public StandardModePanel() {
-        FormLayout layout = new FormLayout(
-                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
-
-        builder = new DefaultFormBuilder(layout);
-        builder.append("Output Directory:", outputFolder, selectOutputFolder);
-        builder.nextLine();
-
-        setLayout(new BorderLayout());
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//import com.jgoodies.forms.builder.DefaultFormBuilder;
+//import com.jgoodies.forms.layout.FormLayout;
+//
+//import java.awt.BorderLayout;
+//
+//public class StandardModePanel extends GeneratorControllerPanel {
+//
+//    private DefaultFormBuilder builder;
+//
+//    public StandardModePanel() {
+//        FormLayout layout = new FormLayout(
+//                "right:77dlu, 1dlu, fill:100:grow, 1dlu, left:80dlu, 1dlu", "");
+//
+//        builder = new DefaultFormBuilder(layout);
+//        builder.append("Output Directory:", outputFolder, selectOutputFolder);
+//        builder.nextLine();
+//
+//        setLayout(new BorderLayout());
+//        add(builder.getPanel(), BorderLayout.CENTER);
+//    }
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
index 425a0f2..c900728 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/codegen/StandardPanelComponent.java
@@ -1,81 +1,81 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.dialog.codegen;
-
-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.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JTextField;
-import java.awt.BorderLayout;
-
-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;
-    }
-
-}
\ No newline at end of file
+///*****************************************************************
+// *   Licensed to the Apache Software Foundation (ASF) under one
+// *  or more contributor license agreements.  See the NOTICE file
+// *  distributed with this work for additional information
+// *  regarding copyright ownership.  The ASF licenses this file
+// *  to you under the Apache License, Version 2.0 (the
+// *  "License"); you may not use this file except in compliance
+// *  with the License.  You may obtain a copy of the License at
+// *
+// *    http://www.apache.org/licenses/LICENSE-2.0
+// *
+// *  Unless required by applicable law or agreed to in writing,
+// *  software distributed under the License is distributed on an
+// *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// *  KIND, either express or implied.  See the License for the
+// *  specific language governing permissions and limitations
+// *  under the License.
+// ****************************************************************/
+//
+//package org.apache.cayenne.modeler.dialog.codegen;
+//
+//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.JComponent;
+//import javax.swing.JLabel;
+//import javax.swing.JTextField;
+//import java.awt.BorderLayout;
+//
+//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;
+//    }
+//
+//}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
index be3a0e8..96a195e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainTabbedView.java
@@ -1,84 +1,99 @@
-/*****************************************************************
- *   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;
-
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.event.DomainDisplayEvent;
-import org.apache.cayenne.modeler.event.DomainDisplayListener;
-import org.apache.cayenne.modeler.event.EntityDisplayEvent;
-import org.apache.cayenne.modeler.graph.DataDomainGraphTab;
-
-/**
- * DataDomain editing tabs container 
- */
-public class DataDomainTabbedView extends JTabbedPane 
-    implements ChangeListener, DomainDisplayListener {
-    
-    ProjectController mediator;
-    
-    DataDomainGraphTab graphTab;
-
-    /**
-     * constructor
-     * @param mediator mediator instance
-     */
-    public DataDomainTabbedView(ProjectController mediator) {
-        this.mediator = mediator;
-
-        initView();
-    }
-
-    /**
-     * create tabs
-     */
-    private void initView() {
-      
-        setTabPlacement(JTabbedPane.TOP);
-
-        // add panels to tabs
-        // note that those panels that have no internal scrollable tables
-        // must be wrapped in a scroll pane
-        JScrollPane domainView = new JScrollPane(new DataDomainView(mediator));
-        addTab("Main", domainView);
-
-        graphTab = new DataDomainGraphTab(mediator);
-        addTab("Graph", graphTab);
-        
-        addChangeListener(this);
-        mediator.addDomainDisplayListener(this);
-    }
-
-    public void stateChanged(ChangeEvent e) {
-        if (getSelectedComponent() == graphTab) {
-            graphTab.refresh();
-        }
-    }
-
-    public void currentDomainChanged(DomainDisplayEvent e) {
-        if (e instanceof EntityDisplayEvent) {
-            //need select an entity
-            setSelectedComponent(graphTab);
-        }
-    }
-}
+/*****************************************************************
+ *   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;
+
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.action.GenerateCodeAction;
+import org.apache.cayenne.modeler.editor.cgen.domain.CgenTabController;
+import org.apache.cayenne.modeler.event.DomainDisplayEvent;
+import org.apache.cayenne.modeler.event.DomainDisplayListener;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.graph.DataDomainGraphTab;
+
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+/**
+ * DataDomain editing tabs container 
+ */
+public class DataDomainTabbedView extends JTabbedPane 
+    implements ChangeListener, DomainDisplayListener {
+    
+    ProjectController mediator;
+    
+    DataDomainGraphTab graphTab;
+    JScrollPane cgenView;
+    CgenTabController cgenTabController;
+
+    /**
+     * constructor
+     * @param mediator mediator instance
+     */
+    public DataDomainTabbedView(ProjectController mediator) {
+        this.mediator = mediator;
+
+        initView();
+    }
+
+    /**
+     * create tabs
+     */
+    private void initView() {
+      
+        setTabPlacement(JTabbedPane.TOP);
+
+        // add panels to tabs
+        // note that those panels that have no internal scrollable tables
+        // must be wrapped in a scroll pane
+        JScrollPane domainView = new JScrollPane(new DataDomainView(mediator));
+        addTab("Main", domainView);
+
+        graphTab = new DataDomainGraphTab(mediator);
+        addTab("Graph", graphTab);
+
+        addChangeListener(this);
+        mediator.addDomainDisplayListener(this);
+
+        cgenTabController = new CgenTabController(mediator);
+        cgenView = new JScrollPane(cgenTabController.getView());
+        addTab("Class Generation", cgenView);
+    }
+
+    public void stateChanged(ChangeEvent e) {
+        if (getSelectedComponent() == graphTab) {
+            graphTab.refresh();
+        } else if(getSelectedComponent() == cgenView) {
+            cgenTabController.getView().initView();
+        }
+    }
+
+    public void currentDomainChanged(DomainDisplayEvent e) {
+        if (e instanceof EntityDisplayEvent) {
+            //need select an entity
+            setSelectedComponent(graphTab);
+        }
+        if(getSelectedComponent() == cgenView) {
+            fireStateChanged();
+        }
+        if(e.getSource() instanceof GenerateCodeAction) {
+            setSelectedComponent(cgenView);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
index 388e087..76cf573 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapTabbedView.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.editor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.editor.cgen.CodeGeneratorController;
+import org.apache.cayenne.modeler.editor.cgen.domain.CgenTab;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 
 import javax.swing.*;
@@ -30,9 +31,11 @@ import javax.swing.*;
  * Data map editing tabs container
  *
  */
-public class DataMapTabbedView extends JTabbedPane {
+public class DataMapTabbedView extends JTabbedPane{
     ProjectController mediator;
     private CodeGeneratorController codeGeneratorController;
+    JScrollPane cgenView;
+
 
     /**
      * constructor
@@ -57,7 +60,7 @@ public class DataMapTabbedView extends JTabbedPane {
         JScrollPane dataMapView = new JScrollPane(new DataMapView(mediator));
         JScrollPane dbImportView = new JScrollPane(new DbImportView(mediator));
         this.codeGeneratorController = new CodeGeneratorController(Application.getInstance().getFrameController(), mediator);
-        JScrollPane cgenView = new JScrollPane(codeGeneratorController.getView());
+        cgenView = new JScrollPane(codeGeneratorController.getView());
         addTab("DataMap", dataMapView);
         addTab("DbImport", dbImportView);
         addTab("Class Generation", cgenView);
@@ -70,13 +73,14 @@ public class DataMapTabbedView extends JTabbedPane {
         mediator.addDataMapDisplayListener(e -> {
             if(isCgenTabActive()) {
                 fireStateChanged();
+            } else if(e.getSource() instanceof CgenTab){
+                setSelectedComponent(cgenView);
             }
         });
     }
 
     private boolean isCgenTabActive() {
-        return getSelectedIndex() == 2;
+        return getSelectedComponent() == cgenView;
     }
-
 }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
index 9f217f0..87881f4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClientModeController.java
@@ -19,8 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.gen.ClassGenerationAction;
-import org.apache.cayenne.gen.ClientClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 
 public class ClientModeController extends StandardModeController {
 
@@ -34,7 +33,12 @@ public class ClientModeController extends StandardModeController {
     }
 
     @Override
-    protected ClassGenerationAction newGenerator() {
-        return new ClientClassGenerationAction();
+    public CgenConfiguration createConfiguration() {
+        return super.createConfiguration();
+    }
+
+    @Override
+    public void updateConfiguration(CgenConfiguration cgenConfiguration) {
+        cgenConfiguration.setClient(true);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 db6edb4..f4ab6bc 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
@@ -19,7 +19,9 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.ClientClassGenerationAction;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
@@ -31,6 +33,8 @@ import org.slf4j.LoggerFactory;
 import javax.swing.*;
 import java.awt.*;
 import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.function.Predicate;
 
 /**
@@ -46,12 +50,14 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
 
     protected ClassesTabController classesSelector;
     protected GeneratorTabController generatorSelector;
+    private ConcurrentMap<DataMap, GeneratorController> prevGeneratorController;
 
     public CodeGeneratorController(CayenneController parent, ProjectController projectController) {
         super(parent, projectController);
         this.classesSelector = new ClassesTabController(this);
         this.generatorSelector = new GeneratorTabController(this);
         view = new CodeGeneratorPane(generatorSelector.getView(), classesSelector.getView());
+        this.prevGeneratorController = new ConcurrentHashMap<>();
         initBindings();
         initListeners();
     }
@@ -59,10 +65,14 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     public void startup(DataMap dataMap) {
         super.startup(dataMap);
         classesSelectedAction();
-        GeneratorController modeController = generatorSelector.getGeneratorController();
-        ClassGenerationAction classGenerationAction = modeController.createGenerator();
-        modeController.initForm(classGenerationAction);
+        GeneratorController modeController = prevGeneratorController.get(dataMap) != null ? prevGeneratorController.get(dataMap) : generatorSelector.getStandartController();
+        CgenConfiguration cgenConfiguration = modeController.createConfiguration();
+        if(cgenConfiguration.isClient()) {
+            modeController = generatorSelector.getClientGeneratorController();
+        }
         classesSelector.startup();
+        prevGeneratorController.put(dataMap, modeController);
+        generatorSelector.setSelectedController(modeController);
     }
 
     private void initListeners(){
@@ -141,21 +151,26 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase {
     }
 
     public void generateAction() {
-        ClassGenerationAction generator = generatorSelector.getGenerator();
-
-        if (generator != null) {
-            try {
-                generator.prepareArtifacts();
-                generator.execute();
-                JOptionPane.showMessageDialog(
-                        this.getView(),
-                        "Class generation finished");
-            } catch (Exception e) {
-                logObj.error("Error generating classes", e);
-                JOptionPane.showMessageDialog(
-                        this.getView(),
-                        "Error generating classes - " + e.getMessage());
-            }
+        CgenConfiguration cgenConfiguration = generatorSelector.getConfiguration();
+        ClassGenerationAction generator = cgenConfiguration.isClient() ?
+                new ClientClassGenerationAction(cgenConfiguration) :
+                new ClassGenerationAction(cgenConfiguration);
+
+        try {
+            generator.prepareArtifacts();
+            generator.execute();
+            JOptionPane.showMessageDialog(
+                    this.getView(),
+                    "Class generation finished");
+        } catch (Exception e) {
+            logObj.error("Error generating classes", e);
+            JOptionPane.showMessageDialog(
+                    this.getView(),
+                    "Error generating classes - " + e.getMessage());
         }
     }
+
+    public ConcurrentMap<DataMap, GeneratorController> getPrevGeneratorController() {
+        return prevGeneratorController;
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 e9c2965..35ba15e 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,7 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
@@ -67,11 +67,14 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     public void startup(DataMap dataMap){
         this.dataMap = dataMap;
+        prepareClasses(dataMap);
+    }
+
+    private void prepareClasses(DataMap dataMap) {
         classes.clear();
         this.classes.add(dataMap);
         this.classes.addAll(dataMap.getObjEntities());
         this.classes.addAll(dataMap.getEmbeddables());
-
         initCollectionsForSelection(dataMap);
     }
 
@@ -277,11 +280,11 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     private void updateArtifactGenerationMode(Object classObj, boolean selected) {
         DataMap dataMap = (DataMap) classObj;
-        ClassGenerationAction generator = projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(dataMap, CgenConfiguration.class);
         if(selected) {
-            generator.setArtifactsGenerationMode("all");
+            cgenConfiguration.setArtifactsGenerationMode("all");
         } else {
-            generator.setArtifactsGenerationMode("entity");
+            cgenConfiguration.setArtifactsGenerationMode("entity");
         }
     }
 
@@ -307,32 +310,30 @@ public abstract class CodeGeneratorControllerBase extends CayenneController {
 
     public void updateEntities(){
         DataMap map = getProjectController().getCurrentDataMap();
-        ClassGenerationAction generator = projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
-        if(generator != null) {
-            generator.resetCollections();
+        CgenConfiguration cgenConfiguration = projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null) {
+            cgenConfiguration.resetCollections();
             for(ObjEntity entity: getSelectedEntities()) {
                 if(!entity.isGeneric()) {
-                    generator.loadEntity(entity.getName());
+                    cgenConfiguration.loadEntity(entity.getName());
                 }
             }
             for(Embeddable embeddable : getSelectedEmbeddables()) {
-                generator.loadEmbeddable(embeddable.getClassName());
+                cgenConfiguration.loadEmbeddable(embeddable.getClassName());
             }
         }
     }
 
-    public void addToSelectedEntities(DataMap dataMap, Collection<String> entities) {
-        if(selectedEntities == null) {
-            initCollectionsForSelection(dataMap);
-        }
+    void addToSelectedEntities(DataMap dataMap, Collection<String> entities) {
+        prepareClasses(dataMap);
         selectedEntities.addAll(entities);
+        updateEntities();
     }
 
-    public void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
-        if(selectedEmbeddables == null) {
-            initCollectionsForSelection(dataMap);
-        }
+    void addToSelectedEmbeddables(DataMap dataMap, Collection<String> embeddables) {
+        prepareClasses(dataMap);
         selectedEmbeddables.addAll(embeddables);
+        updateEntities();
     }
 
     public int getSelectedEntitiesSize() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 6a081a5..5626a38 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
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.modeler.CodeTemplateManager;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
@@ -85,57 +86,70 @@ public class CustomModeController extends GeneratorController {
     }
 
     private void updateComboBoxes() {
-        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate()));
-        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate()));
+        view.getSubclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(cgenConfiguration.getTemplate()));
+        view.getSuperclassTemplate().setItem(getApplication().getCodeTemplateManager().getNameByPath(cgenConfiguration.getSuperTemplate()));
         view.setDisableSuperComboBoxes(view.getPairs().isSelected());
     }
 
     @Override
-    protected ClassGenerationAction newGenerator() {
-        ClassGenerationAction action = new ClassGenerationAction();
-        getApplication().getInjector().injectMembers(action);
-        return action;
+    public CgenConfiguration createConfiguration() {
+        return super.createConfiguration();
     }
 
     private void initListeners(){
         view.getPairs().addActionListener(val -> {
-            classGenerationAction.setMakePairs(view.getPairs().isSelected());
+            cgenConfiguration.setMakePairs(view.getPairs().isSelected());
+            if(!view.getPairs().isSelected()) {
+                cgenConfiguration.setTemplate(ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+            } else {
+                cgenConfiguration.setTemplate(ClassGenerationAction.SUBCLASS_TEMPLATE);
+                cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE);
+                cgenConfiguration.setQueryTemplate(ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE);
+            }
+            initForm(cgenConfiguration);
             getParentController().getProjectController().setDirty(true);
         });
 
         view.getOverwrite().addActionListener(val -> {
-            classGenerationAction.setOverwrite(view.getOverwrite().isSelected());
+            cgenConfiguration.setOverwrite(view.getOverwrite().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
 
         view.getCreatePropertyNames().addActionListener(val -> {
-            classGenerationAction.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
+            cgenConfiguration.setCreatePropertyNames(view.getCreatePropertyNames().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
 
         view.getUsePackagePath().addActionListener(val -> {
-            classGenerationAction.setUsePkgPath(view.getUsePackagePath().isSelected());
+            cgenConfiguration.setUsePkgPath(view.getUsePackagePath().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
 
         view.getPkProperties().addActionListener(val -> {
-            classGenerationAction.setCreatePKProperties(view.getPkProperties().isSelected());
+            cgenConfiguration.setCreatePKProperties(view.getPkProperties().isSelected());
             getParentController().getProjectController().setDirty(true);
         });
     }
 
-    public void initForm(ClassGenerationAction classGenerationAction){
-        super.initForm(classGenerationAction);
-        view.getOutputPattern().setText(classGenerationAction.getOutputPattern());
-        view.getPairs().setSelected(classGenerationAction.isMakePairs());
-        view.getUsePackagePath().setSelected(classGenerationAction.isUsePkgPath());
-        view.getOverwrite().setSelected(classGenerationAction.isOverwrite());
-        view.getCreatePropertyNames().setSelected(classGenerationAction.isCreatePropertyNames());
-        view.getPkProperties().setSelected(classGenerationAction.isCreatePKProperties());
-        if(classGenerationAction.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
-            ((CodeGeneratorControllerBase)parent).setCurrentClass(classGenerationAction.getDataMap());
-            ((CodeGeneratorControllerBase)parent).setSelected(true);
+    public void initForm(CgenConfiguration cgenConfiguration){
+        super.initForm(cgenConfiguration);
+        view.getOutputPattern().setText(cgenConfiguration.getOutputPattern());
+        view.getPairs().setSelected(cgenConfiguration.isMakePairs());
+        view.getUsePackagePath().setSelected(cgenConfiguration.isUsePkgPath());
+        view.getOverwrite().setSelected(cgenConfiguration.isOverwrite());
+        view.getCreatePropertyNames().setSelected(cgenConfiguration.isCreatePropertyNames());
+        view.getPkProperties().setSelected(cgenConfiguration.isCreatePKProperties());
+        if(cgenConfiguration.getArtifactsGenerationMode().equalsIgnoreCase("all")) {
+            ((CodeGeneratorControllerBase) parent).setCurrentClass(cgenConfiguration.getDataMap());
+            ((CodeGeneratorControllerBase) parent).setSelected(true);
         }
         updateComboBoxes();
     }
+
+    @Override
+    public void updateConfiguration(CgenConfiguration cgenConfiguration) {
+        cgenConfiguration.setClient(false);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 6b8db21..31aec74 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
@@ -20,13 +20,14 @@
 package org.apache.cayenne.modeler.editor.cgen;
 
 import org.apache.cayenne.gen.ArtifactsGenerationMode;
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.*;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.modeler.util.CodeValidationUtil;
+import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.util.Util;
@@ -52,7 +53,7 @@ import java.util.stream.Collectors;
 public abstract class GeneratorController extends CayenneController {
 
     protected String mode = ArtifactsGenerationMode.ENTITY.getLabel();
-    protected ClassGenerationAction classGenerationAction;
+    protected CgenConfiguration cgenConfiguration;
 
     public GeneratorController(CodeGeneratorControllerBase parent) {
         super(parent);
@@ -72,36 +73,31 @@ public abstract class GeneratorController extends CayenneController {
 
     protected abstract GeneratorControllerPanel createView();
 
-    /**
-     * Creates an appropriate subclass of {@link ClassGenerationAction},
-     * returning it in an unconfigured state. Configuration is performed by
-     * {@link #createGenerator()} method.
-     */
-    protected abstract ClassGenerationAction newGenerator();
-
-    protected void initForm(ClassGenerationAction classGenerationAction) {
-        this.classGenerationAction = classGenerationAction;
-        classGenerationAction.setRootPath(Paths.get(initOutputFolder()));
-        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(classGenerationAction.getDir());
+    protected void initForm(CgenConfiguration cgenConfiguration) {
+        this.cgenConfiguration = cgenConfiguration;
+        ((GeneratorControllerPanel)getView()).getOutputFolder().setText(cgenConfiguration.getDir());
     }
 
+    public abstract void updateConfiguration(CgenConfiguration cgenConfiguration);
+
     /**
      * Creates a class generator for provided selections.
      */
-    public ClassGenerationAction createGenerator() {
+    public CgenConfiguration createConfiguration() {
         DataMap map = getParentController().getProjectController().getCurrentDataMap();
-        ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class);
-        if(generator != null){
-            getParentController().addToSelectedEntities(generator.getDataMap(), generator.getEntities());
-            getParentController().addToSelectedEmbeddables(generator.getDataMap(), generator.getEmbeddables());
-            return generator;
+        CgenConfiguration cgenConfiguration = getParentController().projectController.getApplication().getMetaData().get(map, CgenConfiguration.class);
+        if(cgenConfiguration != null){
+            getParentController().addToSelectedEntities(cgenConfiguration.getDataMap(), cgenConfiguration.getEntities());
+            getParentController().addToSelectedEmbeddables(cgenConfiguration.getDataMap(), cgenConfiguration.getEmbeddables());
+            cgenConfiguration.setRootPath(Paths.get(ModelerUtil.initOutputFolder()));
+            return cgenConfiguration;
         }
 
         try {
-            generator = newGenerator();
-            generator.setDataMap(map);
+            cgenConfiguration = new CgenConfiguration();
+            cgenConfiguration.setDataMap(map);
 
-            Path basePath = Paths.get(initOutputFolder());
+            Path basePath = Paths.get(ModelerUtil.initOutputFolder());
 
             // no destination folder
             if (basePath == null) {
@@ -120,10 +116,10 @@ public abstract class GeneratorController extends CayenneController {
                 return null;
             }
 
-            generator.setRootPath(basePath);
+            cgenConfiguration.setRootPath(basePath);
             Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, "");
             if (preferences != null) {
-                generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
+                cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
             }
             getParentController().addToSelectedEntities(map, map.getObjEntities()
                     .stream()
@@ -133,14 +129,14 @@ public abstract class GeneratorController extends CayenneController {
                     .stream()
                     .map(Embeddable::getClassName)
                     .collect(Collectors.toList()));
-            getParentController().projectController.getApplication().getMetaData().add(map, generator);
+            getParentController().projectController.getApplication().getMetaData().add(map, cgenConfiguration);
         } catch (IOException exception) {
             JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
                     ". Select a different one.");
             return null;
         }
 
-        return generator;
+        return cgenConfiguration;
     }
 
     public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) {
@@ -449,44 +445,4 @@ public abstract class GeneratorController extends CayenneController {
             ((GeneratorControllerPanel) getView()).getOutputFolder().updateModel();
         }
     }
-
-    private String initOutputFolder() {
-        String path;
-        if (System.getProperty("cayenne.cgen.destdir") != null) {
-            return 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) {
-                return path;
-            } else {
-                File lastDir = lastPath.getExistingDirectory(false);
-                return lastDir != null ? lastDir.getAbsolutePath() : ".";
-            }
-        }
-    }
-
-    private String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
-        String path = lastPath.getPath();
-        String resourcePath = buildFilePath("src", dirType, "resources");
-        int idx = path.indexOf(resourcePath);
-        if (idx < 0) {
-            return null;
-        }
-        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
-    }
-
-    private static String buildFilePath(String... pathElements) {
-        if (pathElements.length == 0) {
-            return "";
-        }
-        StringBuilder path = new StringBuilder(pathElements[0]);
-        for (int i = 1; i < pathElements.length; i++) {
-            path.append(File.separator).append(pathElements[i]);
-        }
-        return path.toString();
-    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 98e7841..21bd223 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
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
@@ -61,8 +61,8 @@ public class GeneratorControllerPanel extends JPanel {
         return selectOutputFolder;
     }
 
-    public ClassGenerationAction getCgenByDataMap() {
+    public CgenConfiguration getCgenByDataMap() {
         DataMap dataMap = projectController.getCurrentDataMap();
-        return projectController.getApplication().getMetaData().get(dataMap, ClassGenerationAction.class);
+        return projectController.getApplication().getMetaData().get(dataMap, CgenConfiguration.class);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 ef290a6..16aebae 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
@@ -19,12 +19,9 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.pref.CayenneProjectPreferences;
 import org.apache.cayenne.pref.PreferenceDetail;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.util.Util;
 
 import java.awt.*;
 import java.util.HashMap;
@@ -77,39 +74,39 @@ public class GeneratorTabController extends CayenneController {
     }
 
     protected void initBindings() {
-
-        // bind actions
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        CayenneProjectPreferences cayPrPref = application.getCayenneProjectPreferences();
-
-        this.preferences = (PreferenceDetail) cayPrPref.getProjectDetailObject(
-                PreferenceDetail.class,
-                getViewPreferences().node("controller"));
-
-        if (Util.isEmptyString(preferences.getProperty("mode"))) {
-            preferences.setProperty("mode", STANDARD_OBJECTS_MODE);
-        }
-
-        builder.bindToComboSelection(
-                view.getGenerationMode(),
-                "preferences.property['mode']").updateView();
-
         view.getGenerationMode().addActionListener(action -> {
             String name = (String)view.getGenerationMode().getSelectedItem();
-            controllers.get(name).initForm(getGenerator());
+            GeneratorController modeController = getGeneratorController();
+            CgenConfiguration cgenConfiguration = modeController.createConfiguration();
+            modeController.updateConfiguration(cgenConfiguration);
+            controllers.get(name).initForm(cgenConfiguration);
+            ((CodeGeneratorController)getParentController()).getPrevGeneratorController().put(cgenConfiguration.getDataMap(), modeController);
         });
     }
 
+    public void setSelectedController(GeneratorController generatorController) {
+        for(String key : controllers.keySet()) {
+            if(generatorController.equals(controllers.get(key))) {
+                ((GeneratorTabPanel)getView()).getGenerationMode().setSelectedItem(key);
+            }
+        }
+    }
+
     GeneratorController getGeneratorController() {
         String name = (String)view.getGenerationMode().getSelectedItem();
         return controllers.get(name);
     }
 
-    public ClassGenerationAction getGenerator() {
+    GeneratorController getStandartController() {
+        return controllers.get(STANDARD_OBJECTS_MODE);
+    }
+
+    GeneratorController getClientGeneratorController() {
+        return controllers.get(CLIENT_OBJECTS_MODE);
+    }
+
+    public CgenConfiguration getConfiguration() {
         GeneratorController modeController = getGeneratorController();
-        return (modeController != null) ? modeController.createGenerator() : null;
+        return (modeController != null) ? modeController.createConfiguration() : null;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
index 6985896..69cb19f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardModeController.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.modeler.editor.cgen;
 
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 
 import java.awt.*;
@@ -43,19 +43,18 @@ public class StandardModeController extends GeneratorController {
     }
 
     @Override
-    protected ClassGenerationAction newGenerator() {
-        ClassGenerationAction action = new ClassGenerationAction();
-        getApplication().getInjector().injectMembers(action);
-        return action;
+    public CgenConfiguration createConfiguration() {
+        return super.createConfiguration();
     }
 
     @Override
-    protected void initForm(ClassGenerationAction classGenerationAction) {
-        super.initForm(classGenerationAction);
+    protected void initForm(CgenConfiguration cgenConfiguration) {
+        super.initForm(cgenConfiguration);
     }
 
     @Override
-    public ClassGenerationAction createGenerator() {
-        return super.createGenerator();
+    public void updateConfiguration(CgenConfiguration cgenConfiguration) {
+        cgenConfiguration.setClient(false);
     }
+
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
new file mode 100644
index 0000000..cf9b27a8
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenPanel.java
@@ -0,0 +1,59 @@
+package org.apache.cayenne.modeler.editor.cgen.domain;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.gen.CgenConfiguration;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class CgenPanel extends JPanel {
+
+    private JCheckBox checkConfig;
+    private JLabel dataMapLabel;
+    private JButton toConfigButton;
+    private DataMap dataMap;
+
+    public CgenPanel(DataMap dataMap) {
+        setLayout(new BorderLayout());
+        FormLayout layout = new FormLayout(
+                "left:pref, 4dlu, fill:50dlu, 3dlu, fill:120", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        this.dataMap = dataMap;
+        this.checkConfig = new JCheckBox();
+        this.dataMapLabel = new JLabel(dataMap.getName());
+        DataChannelMetaData metaData = Application.getInstance().getMetaData();
+        this.toConfigButton = new JButton();
+        if(metaData.get(dataMap, CgenConfiguration.class) != null) {
+            this.toConfigButton.setText("Edit Config");
+        } else {
+            this.toConfigButton.setText("Create Config");
+        }
+        this.toConfigButton.setIcon(ModelerUtil.buildIcon("icon-datamap.png"));
+
+        builder.append(checkConfig, dataMapLabel, toConfigButton);
+        this.add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    public JCheckBox getCheckConfig() {
+        return checkConfig;
+    }
+
+    public JButton getToConfigButton() {
+        return toConfigButton;
+    }
+
+    public JLabel getDataMapLabel() {
+        return dataMapLabel;
+    }
+
+    public DataMap getDataMap() {
+        return dataMap;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
new file mode 100644
index 0000000..87a7cc4
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTab.java
@@ -0,0 +1,89 @@
+package org.apache.cayenne.modeler.editor.cgen.domain;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+
+import javax.swing.*;
+import java.awt.*;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentMap;
+
+public class CgenTab extends JPanel {
+
+    protected ProjectController projectController;
+    private CgenTabController cgenTabController;
+
+    private JCheckBox selectAll;
+    private JButton generateAll;
+
+    public CgenTab(ProjectController projectController, CgenTabController cgenTabController) {
+        this.projectController = projectController;
+        this.cgenTabController = cgenTabController;
+        this.selectAll = new JCheckBox();
+        generateAll = new JButton("Generate");
+        generateAll.setEnabled(false);
+        generateAll.setIcon(ModelerUtil.buildIcon("icon-gen_java.png"));
+        generateAll.setPreferredSize(new Dimension(120, 30));
+        generateAll.addActionListener(action -> cgenTabController.runGenerators(cgenTabController.getSelectedDataMaps()));
+        setLayout(new BorderLayout());
+    }
+
+    public void initView() {
+        removeAll();
+        cgenTabController.createPanels();
+        FormLayout layout = new FormLayout(
+                "left:pref, 4dlu, 50dlu", "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+        ConcurrentMap<DataMap, CgenPanel> panels = cgenTabController.getGeneratorsPanels();
+
+        if(panels.isEmpty()) {
+            this.add(new JLabel("There are no cgen configs."), BorderLayout.NORTH);
+            return;
+        }
+
+        JPanel selectAllPanel = new JPanel(new FlowLayout());
+        selectAllPanel.add(new JLabel("Select All"), FlowLayout.LEFT);
+        selectAllPanel.add(selectAll, FlowLayout.CENTER);
+        builder.append(selectAllPanel);
+        builder.nextLine();
+
+        SortedSet<DataMap> keys = new TreeSet<>(panels.keySet());
+        for(DataMap dataMap : keys) {
+            builder.append(panels.get(dataMap));
+            builder.nextLine();
+        }
+        builder.append(generateAll);
+        this.add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    void showSuccessMessage() {
+        JOptionPane.showMessageDialog(
+                this,
+                "Class generation finished");
+    }
+
+    void showErrorMessage(String msg) {
+        JOptionPane.showMessageDialog(
+                this,
+                "Error generating classes - " + msg);
+    }
+
+    void showEmptyMessage() {
+        JOptionPane.showMessageDialog(
+                this,
+                "Nothing to generate - ");
+    }
+
+    public JCheckBox getSelectAll() {
+        return selectAll;
+    }
+
+    public JButton getGenerateAll() {
+        return generateAll;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
new file mode 100644
index 0000000..daeb677
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/domain/CgenTabController.java
@@ -0,0 +1,197 @@
+package org.apache.cayenne.modeler.editor.cgen.domain;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.gen.CgenConfiguration;
+import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.ClientClassGenerationAction;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
+import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.util.ModelerUtil;
+import org.apache.cayenne.project.Project;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.swing.*;
+import java.awt.event.ItemEvent;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.prefs.Preferences;
+
+public class CgenTabController {
+
+    private static Logger logObj = LoggerFactory.getLogger(ErrorDebugDialog.class);
+
+    private ProjectController projectController;
+    private CgenTab view;
+
+    private ConcurrentMap<DataMap, CgenPanel> generatorsPanels;
+    private Set<DataMap> selectedDataMaps;
+
+    public CgenTabController(ProjectController projectController) {
+        this.projectController = projectController;
+        this.view = new CgenTab(projectController, this);
+        this.generatorsPanels = new ConcurrentHashMap<>();
+        this.selectedDataMaps = new HashSet<>();
+    }
+
+    void createPanels() {
+        Collection<DataMap> dataMaps = getDataMaps();
+        generatorsPanels.clear();
+        for(DataMap dataMap : dataMaps) {
+            CgenPanel cgenPanel = new CgenPanel(dataMap);
+            initListenersForPanel(cgenPanel);
+            generatorsPanels.put(dataMap, cgenPanel);
+        }
+        selectedDataMaps.forEach(dataMap -> {
+            if(generatorsPanels.get(dataMap) != null) {
+                CgenPanel currPanel = generatorsPanels.get(dataMap);
+                currPanel.getCheckConfig().setSelected(true);
+            }
+        });
+    }
+
+    private void initListenersForPanel(CgenPanel cgenPanel) {
+        cgenPanel.getCheckConfig().addItemListener(e -> {
+            if(e.getStateChange() == ItemEvent.SELECTED) {
+                selectedDataMaps.add(cgenPanel.getDataMap());
+            } else if(e.getStateChange() == ItemEvent.DESELECTED) {
+                selectedDataMaps.remove(cgenPanel.getDataMap());
+            }
+            setGenerateButtonDisabled();
+        });
+
+        cgenPanel.getToConfigButton().addActionListener(action -> showConfig(cgenPanel.getDataMap()));
+
+        view.getSelectAll().addItemListener(e -> {
+            if(e.getStateChange() == ItemEvent.SELECTED) {
+                getGeneratorsPanels().forEach((key, value) -> value.getCheckConfig().setSelected(true));
+            } else if(e.getStateChange() == ItemEvent.DESELECTED) {
+                getGeneratorsPanels().forEach((key, value) -> value.getCheckConfig().setSelected(false));
+            }
+            setGenerateButtonDisabled();
+        });
+    }
+
+    private void setGenerateButtonDisabled() {
+        if(selectedDataMaps.size() == 0) {
+            view.getGenerateAll().setEnabled(false);
+        } else {
+            view.getGenerateAll().setEnabled(true);
+        }
+    }
+
+    private Collection<DataMap> getDataMaps() {
+        Project project = projectController.getProject();
+        return  ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
+    }
+
+    public CgenTab getView() {
+        return view;
+    }
+
+    void runGenerators(Set<DataMap> dataMaps) {
+        DataChannelMetaData metaData = Application.getInstance().getMetaData();
+        if(dataMaps.isEmpty()) {
+            view.showEmptyMessage();
+            return;
+        }
+        boolean generationFail = false;
+        for(DataMap dataMap : dataMaps) {
+            try {
+                CgenConfiguration cgenConfiguration = metaData.get(dataMap, CgenConfiguration.class);
+                if(cgenConfiguration == null) {
+                    cgenConfiguration = createConfiguration(dataMap);
+                }
+                if(cgenConfiguration.getRootPath() == null) {
+                    URL url = projectController.getProject().getConfigurationResource().getURL();
+                    Path resourcePath = Paths.get(url.getPath());
+                    if(Files.isRegularFile(resourcePath)) {
+                        resourcePath = resourcePath.getParent();
+                    }
+                    cgenConfiguration.setRootPath(resourcePath);
+                }
+                ClassGenerationAction classGenerationAction = cgenConfiguration.isClient() ? new ClientClassGenerationAction(cgenConfiguration) :
+                        new ClassGenerationAction(cgenConfiguration);
+                classGenerationAction.prepareArtifacts();
+                classGenerationAction.execute();
+            } catch (Exception e) {
+                logObj.error("Error generating classes", e);
+                generationFail = true;
+                view.showErrorMessage(e.getMessage());
+            }
+        }
+        if(!generationFail) {
+            view.showSuccessMessage();
+        }
+    }
+
+    private CgenConfiguration createConfiguration(DataMap dataMap) {
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
+        Application.getInstance().getInjector().injectMembers(cgenConfiguration);
+        cgenConfiguration.setDataMap(dataMap);
+        Path basePath = Paths.get(ModelerUtil.initOutputFolder());
+
+        // no destination folder
+        if (basePath == null) {
+            JOptionPane.showMessageDialog(this.getView(), "Select directory for source files.");
+            return null;
+        }
+
+        // no such folder
+        if (!Files.exists(basePath)) {
+            try {
+                Files.createDirectories(basePath);
+            } catch (IOException e) {
+                JOptionPane.showMessageDialog(this.getView(), "Can't create directory. " +
+                        ". Select a different one.");
+                return null;
+            }
+        }
+
+        // not a directory
+        if (!Files.isDirectory(basePath)) {
+            JOptionPane.showMessageDialog(this.getView(), basePath + " is not a valid directory.");
+            return null;
+        }
+
+        cgenConfiguration.setRootPath(basePath);
+        Preferences preferences = Application.getInstance().getPreferencesNode(GeneralPreferences.class, "");
+        if (preferences != null) {
+            cgenConfiguration.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null));
+        }
+        cgenConfiguration.resolveExcludeEntities();
+        cgenConfiguration.resolveExcludeEmbeddables();
+        return cgenConfiguration;
+    }
+
+    private void showConfig(DataMap dataMap) {
+        if (dataMap != null) {
+            projectController.fireDataMapDisplayEvent(new DataMapDisplayEvent(this.getView(), dataMap, dataMap.getDataChannelDescriptor()));
+        }
+    }
+
+    public ProjectController getProjectController() {
+        return projectController;
+    }
+
+    ConcurrentMap<DataMap, CgenPanel> getGeneratorsPanels() {
+        return generatorsPanels;
+    }
+
+    public Set<DataMap> getSelectedDataMaps() {
+        return selectedDataMaps;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
index f750752..90c6d19 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
@@ -28,6 +28,7 @@ import org.apache.cayenne.modeler.ModelerConstants;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.MultipleObjectsAction;
+import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.reflect.PropertyUtils;
 import org.apache.cayenne.util.CayenneMapEntry;
 
@@ -36,6 +37,7 @@ import javax.swing.ImageIcon;
 import java.awt.Dimension;
 import java.awt.Point;
 import java.awt.Window;
+import java.io.File;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -212,4 +214,45 @@ public final class ModelerUtil {
 
         child.setLocation(x, y);
     }
+
+    public static String initOutputFolder() {
+        String path;
+        if (System.getProperty("cayenne.cgen.destdir") != null) {
+            return 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) {
+                return path;
+            } else {
+                File lastDir = lastPath.getExistingDirectory(false);
+                return lastDir != null ? lastDir.getAbsolutePath() : ".";
+            }
+        }
+    }
+
+    private static String checkDefaultMavenResourceDir(FSPath lastPath, String dirType) {
+        String path = lastPath.getPath();
+        String resourcePath = buildFilePath("src", dirType, "resources");
+        int idx = path.indexOf(resourcePath);
+        if (idx < 0) {
+            return null;
+        }
+        return path.substring(0, idx) + buildFilePath("src", dirType, "java");
+    }
+
+    private static String buildFilePath(String... pathElements) {
+        if (pathElements.length == 0) {
+            return "";
+        }
+        StringBuilder path = new StringBuilder(pathElements[0]);
+        for (int i = 1; i < pathElements.length; i++) {
+            path.append(File.separator).append(pathElements[i]);
+        }
+        return path.toString();
+    }
+
 }


[18/32] cayenne git commit: Cgen tab, cgen configuration, cgen in maven, ant, gradle.

Posted by nt...@apache.org.
Cgen tab, cgen configuration, cgen in maven, ant, gradle.


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

Branch: refs/heads/master
Commit: 52ea45b5d72b5a6b1466e7779e03753c74ebaf3b
Parents: 6a43436
Author: Arseni Bulatski <an...@gmail.com>
Authored: Wed Oct 31 16:33:52 2018 +0300
Committer: Arseni Bulatski <an...@gmail.com>
Committed: Thu Nov 8 17:08:08 2018 +0300

----------------------------------------------------------------------
 .../cayenne/tools/CayenneGeneratorTask.java     |  141 ++-
 .../cayenne/tools/CgenWithConfigTest.java       |   41 +-
 cayenne-ant/src/test/resources/cgenTest.map.xml |   19 +-
 .../apache/cayenne/gen/CgenConfiguration.java   |  363 ++++++
 .../cayenne/gen/ClassGenerationAction.java      |  669 +++--------
 .../gen/ClientClassGenerationAction.java        |   39 +-
 .../cayenne/gen/xml/CgenConfigHandler.java      |   32 +-
 .../cayenne/gen/xml/CgenSaverDelegate.java      |   14 +-
 .../CayenneGeneratorEmbeddableFilterAction.java |   29 +
 .../CayenneGeneratorEntityFilterAction.java     |   22 +-
 .../cayenne/gen/ClassGenerationActionTest.java  |   37 +-
 .../java/org/apache/cayenne/tools/CgenTask.java |  137 ++-
 .../org/apache/cayenne/tools/CgenTaskIT.java    |   60 +-
 .../org/apache/cayenne/tools/CgenTaskTest.java  |   43 +-
 .../cayenne/tools/CgenTaskWithConfigIT.java     |   71 --
 .../org/apache/cayenne/tools/cgenConfig.map.xml |   22 +
 .../org/apache/cayenne/tools/cgenMap.map.xml    |   19 +-
 .../cayenne/tools/cgen_with_config.gradle       |    3 +-
 .../cayenne/tools/cgen_with_configs.gradle      |   32 +
 .../cayenne/tools/CayenneGeneratorMojo.java     |  135 ++-
 .../cayenne/tools/CayenneGeneratorMojoTest.java |   48 +
 .../cayenne/tools/CgenWithConfigMojoTest.java   |   51 -
 .../resources/cgen/project-to-test/cgen-pom.xml |    2 -
 .../cgen/project-to-test/datamap-and-pom.xml    |   54 +
 .../src/test/resources/cgen/testCgen.map.xml    |   22 +
 .../src/test/resources/cgen/testCgenMap.map.xml |   19 +-
 .../modeler/action/GenerateCodeAction.java      |   12 +-
 .../dialog/codegen/ClassesTabController.java    |  406 +++----
 .../modeler/dialog/codegen/ClassesTabPanel.java |  282 ++---
 .../dialog/codegen/ClientModeController.java    |  162 +--
 .../dialog/codegen/CodeGeneratorController.java |  338 +++---
 .../codegen/CodeGeneratorControllerBase.java    |  760 ++++++------
 .../dialog/codegen/CodeGeneratorDialog.java     |  198 +--
 .../dialog/codegen/CustomModeController.java    |  470 ++++----
 .../modeler/dialog/codegen/CustomModePanel.java |  274 ++---
 .../codegen/CustomPreferencesUpdater.java       |  418 +++----
 .../dialog/codegen/GeneratorController.java     | 1123 +++++++++---------
 .../codegen/GeneratorControllerPanel.java       |  110 +-
 .../dialog/codegen/GeneratorTabController.java  |  230 ++--
 .../dialog/codegen/GeneratorTabPanel.java       |  130 +-
 .../dialog/codegen/StandardModeController.java  |  164 +--
 .../dialog/codegen/StandardModePanel.java       |   84 +-
 .../dialog/codegen/StandardPanelComponent.java  |  162 +--
 .../modeler/editor/DataDomainTabbedView.java    |  183 +--
 .../modeler/editor/DataMapTabbedView.java       |   12 +-
 .../editor/cgen/ClientModeController.java       |   12 +-
 .../editor/cgen/CodeGeneratorController.java    |   51 +-
 .../cgen/CodeGeneratorControllerBase.java       |   37 +-
 .../editor/cgen/CustomModeController.java       |   58 +-
 .../editor/cgen/GeneratorController.java        |   88 +-
 .../editor/cgen/GeneratorControllerPanel.java   |    6 +-
 .../editor/cgen/GeneratorTabController.java     |   51 +-
 .../editor/cgen/StandardModeController.java     |   17 +-
 .../modeler/editor/cgen/domain/CgenPanel.java   |   59 +
 .../modeler/editor/cgen/domain/CgenTab.java     |   89 ++
 .../editor/cgen/domain/CgenTabController.java   |  197 +++
 .../cayenne/modeler/util/ModelerUtil.java       |   43 +
 57 files changed, 4547 insertions(+), 3803 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index a82931e..02cc0bf 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.CgenModule;
 import org.apache.cayenne.gen.ClassGenerationAction;
 import org.apache.cayenne.gen.ClientClassGenerationAction;
@@ -34,6 +35,8 @@ import org.apache.velocity.VelocityContext;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 
 /**
  * An Ant task to perform class generation based on CayenneDataMap.
@@ -44,6 +47,7 @@ public class CayenneGeneratorTask extends CayenneTask {
 
     protected String includeEntitiesPattern;
     protected String excludeEntitiesPattern;
+    protected String excludeEmbeddablesPattern;
     protected VPPConfig vppConfig;
 
     protected File map;
@@ -63,7 +67,11 @@ public class CayenneGeneratorTask extends CayenneTask {
     protected String querytemplate;
     protected String querysupertemplate;
     protected Boolean usepkgpath;
-    protected Boolean createpropertynames;
+    protected boolean createpropertynames;
+
+    private boolean force;
+
+    private boolean useConfigFromDataMap;
 
     private transient Injector injector;
 
@@ -82,36 +90,6 @@ public class CayenneGeneratorTask extends CayenneTask {
         return vppConfig.getVelocityContext();
     }
 
-    protected ClassGenerationAction createGeneratorAction(DataMap dataMap) {
-        ClassGenerationAction action = injector.getInstance(DataChannelMetaData.class).get(dataMap, ClassGenerationAction.class);
-
-        if (client) {
-            action = new ClientClassGenerationAction();
-        } else {
-            if(action == null) {
-                action = new ClassGenerationAction();
-            }
-        }
-
-        action.setContext(getVppContext());
-        action.setDestDir(destDir);
-        action.setEncoding(encoding != null ? encoding : action.getEncoding());
-        action.setMakePairs(makepairs != null ? makepairs : action.isMakePairs());
-        action.setArtifactsGenerationMode(mode != null ? mode : action.getArtifactsGenerationMode());
-        action.setOutputPattern(outputPattern != null ? outputPattern : action.getOutputPattern());
-        action.setOverwrite(overwrite != null ? overwrite : action.isOverwrite());
-        action.setSuperPkg(superpkg != null ? superpkg : action.getSuperPkg());
-        action.setSuperTemplate(supertemplate != null ? supertemplate : action.getSuperclassTemplate());
-        action.setTemplate(template != null ? template : action.getTemplate());
-        action.setEmbeddableSuperTemplate(embeddablesupertemplate != null ? embeddablesupertemplate : action.getEmbeddableSuperTemplate());
-        action.setEmbeddableTemplate(embeddabletemplate != null ? embeddabletemplate : action.getEmbeddableTemplate());
-        action.setUsePkgPath(usepkgpath != null ? usepkgpath : action.isUsePkgPath());
-        action.setCreatePropertyNames(createpropertynames != null ? createpropertynames : action.isCreatePropertyNames());
-        action.setQueryTemplate(querytemplate != null ? querytemplate : action.getQueryTemplate());
-        action.setQuerySuperTemplate(querysupertemplate != null ? querysupertemplate : action.getQuerySuperTemplate());
-        return action;
-    }
-
     /**
      * Executes the task. It will be called by ant framework.
      */
@@ -127,23 +105,28 @@ public class CayenneGeneratorTask extends CayenneTask {
         loadAction.setMainDataMapFile(map);
         loadAction.setAdditionalDataMapFiles(additionalMaps);
 
-        CayenneGeneratorEntityFilterAction filterAction = new CayenneGeneratorEntityFilterAction();
-        filterAction.setClient(client);
-        filterAction.setNameFilter(NamePatternMatcher.build(logger, includeEntitiesPattern, excludeEntitiesPattern));
+        CayenneGeneratorEntityFilterAction filterEntityAction = new CayenneGeneratorEntityFilterAction();
+        filterEntityAction.setClient(client);
+        filterEntityAction.setNameFilter(NamePatternMatcher.build(logger, includeEntitiesPattern, excludeEntitiesPattern));
 
+        CayenneGeneratorEmbeddableFilterAction filterEmbeddableAction = new CayenneGeneratorEmbeddableFilterAction();
+        filterEmbeddableAction.setNameFilter(NamePatternMatcher.build(logger, null, excludeEmbeddablesPattern));
         try {
 
             DataMap dataMap = loadAction.getMainDataMap();
 
-            ClassGenerationAction generatorAction = createGeneratorAction(dataMap);
+            ClassGenerationAction generatorAction = createGenerator(dataMap);
             generatorAction.setLogger(logger);
-            generatorAction.setTimestamp(map.lastModified());
-            generatorAction.setDataMap(dataMap);
-            if(!generatorAction.getEntities().isEmpty() || !generatorAction.getEmbeddables().isEmpty()){
+            if(force) {
+                // will (re-)generate all files
+                generatorAction.getCgenConfiguration().setForce(true);
+            }
+            generatorAction.getCgenConfiguration().setTimestamp(map.lastModified());
+            if(!hasConfig() && useConfigFromDataMap) {
                 generatorAction.prepareArtifacts();
             } else {
-                generatorAction.addEntities(filterAction.getFilteredEntities(dataMap));
-                generatorAction.addEmbeddables(filterAction.getFilteredEmbeddables(dataMap));
+                generatorAction.addEntities(filterEntityAction.getFilteredEntities(dataMap));
+                generatorAction.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
                 generatorAction.addQueries(dataMap.getQueryDescriptors());
             }
             generatorAction.execute();
@@ -153,6 +136,76 @@ public class CayenneGeneratorTask extends CayenneTask {
         }
     }
 
+    private ClassGenerationAction createGenerator(DataMap dataMap) {
+        CgenConfiguration cgenConfiguration = buildConfiguration(dataMap);
+        ClassGenerationAction classGenerationAction = cgenConfiguration.isClient() ? new ClientClassGenerationAction(cgenConfiguration) :
+                new ClassGenerationAction(cgenConfiguration);
+        injector.injectMembers(classGenerationAction);
+
+        return classGenerationAction;
+    }
+
+    private boolean hasConfig() {
+        return destDir != null || encoding != null || client || excludeEntitiesPattern != null || excludeEmbeddablesPattern != null || includeEntitiesPattern != null ||
+                makepairs != null || mode != null || outputPattern != null || overwrite != null || superpkg != null ||
+                supertemplate != null || template != null || embeddabletemplate != null || embeddablesupertemplate != null ||
+                usepkgpath != null || createpropertynames || querytemplate != null ||
+                querysupertemplate != null || createpkproperties || force;
+    }
+
+    private CgenConfiguration buildConfiguration(DataMap dataMap) {
+        CgenConfiguration cgenConfiguration = injector.getInstance(DataChannelMetaData.class).get(dataMap, CgenConfiguration.class);
+        if(hasConfig()) {
+            return cgenConfigFromPom(dataMap);
+        } else if(cgenConfiguration != null) {
+            useConfigFromDataMap = true;
+            java.nio.file.Path resourcePath = Paths.get(map.getPath());
+            if(Files.isRegularFile(resourcePath)) {
+                resourcePath = resourcePath.getParent();
+            }
+            cgenConfiguration.setRelPath(resourcePath.resolve(cgenConfiguration.getRelPath()));
+            return cgenConfiguration;
+        } else {
+            cgenConfiguration = new CgenConfiguration();
+            cgenConfiguration.setDataMap(dataMap);
+            return cgenConfiguration;
+        }
+    }
+
+    private CgenConfiguration cgenConfigFromPom(DataMap dataMap){
+        CgenConfiguration cgenConfiguration = new CgenConfiguration();
+        cgenConfiguration.setDataMap(dataMap);
+        cgenConfiguration.setRelPath(destDir != null ? destDir.getPath() : cgenConfiguration.getRelPath());
+        cgenConfiguration.setEncoding(encoding != null ? encoding : cgenConfiguration.getEncoding());
+        cgenConfiguration.setMakePairs(makepairs != null ? makepairs : cgenConfiguration.isMakePairs());
+        cgenConfiguration.setArtifactsGenerationMode(mode != null ? mode : cgenConfiguration.getArtifactsGenerationMode());
+        cgenConfiguration.setOutputPattern(outputPattern != null ? outputPattern : cgenConfiguration.getOutputPattern());
+        cgenConfiguration.setOverwrite(overwrite != null ? overwrite : cgenConfiguration.isOverwrite());
+        cgenConfiguration.setSuperPkg(superpkg != null ? superpkg : cgenConfiguration.getSuperPkg());
+        cgenConfiguration.setSuperTemplate(supertemplate != null ? supertemplate : cgenConfiguration.getSuperTemplate());
+        cgenConfiguration.setTemplate(template != null ? template :  cgenConfiguration.getTemplate());
+        cgenConfiguration.setEmbeddableSuperTemplate(embeddablesupertemplate != null ? embeddablesupertemplate : cgenConfiguration.getEmbeddableSuperTemplate());
+        cgenConfiguration.setEmbeddableTemplate(embeddabletemplate != null ? embeddabletemplate : cgenConfiguration.getEmbeddableTemplate());
+        cgenConfiguration.setUsePkgPath(usepkgpath != null ? usepkgpath : cgenConfiguration.isUsePkgPath());
+        cgenConfiguration.setCreatePropertyNames(createpropertynames);
+        cgenConfiguration.setQueryTemplate(querytemplate != null ? querytemplate : cgenConfiguration.getQueryTemplate());
+        cgenConfiguration.setQuerySuperTemplate(querysupertemplate != null ? querysupertemplate : cgenConfiguration.getQuerySuperTemplate());
+        cgenConfiguration.setCreatePKProperties(createpkproperties);
+        cgenConfiguration.setClient(client);
+        if(!cgenConfiguration.isMakePairs()) {
+            if(template == null) {
+                cgenConfiguration.setTemplate(client ? ClientClassGenerationAction.SINGLE_CLASS_TEMPLATE : ClassGenerationAction.SINGLE_CLASS_TEMPLATE);
+            }
+            if(embeddabletemplate == null) {
+                cgenConfiguration.setEmbeddableTemplate(ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE);
+            }
+            if(querytemplate == null) {
+                cgenConfiguration.setQueryTemplate(client ? ClientClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE : ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE);
+            }
+        }
+        return cgenConfiguration;
+    }
+
     /**
      * Validates attributes that are not related to internal DefaultClassGenerator. Throws
      * BuildException if attributes are invalid.
@@ -278,6 +331,10 @@ public class CayenneGeneratorTask extends CayenneTask {
         this.includeEntitiesPattern = includeEntitiesPattern;
     }
 
+    public void setExcludeEmbeddablesPattern(String excludeEmbeddablesPattern) {
+        this.excludeEmbeddablesPattern = excludeEmbeddablesPattern;
+    }
+
     /**
      * Sets <code>outputPattern</code> property.
      */
@@ -314,6 +371,10 @@ public class CayenneGeneratorTask extends CayenneTask {
         this.createpkproperties = createpkproperties;
     }
 
+    public void setForce(boolean force) {
+        this.force = force;
+    }
+
     /**
      * Provides a <code>VPPConfig</code> object to configure. (Written with createConfig()
      * instead of addConfig() to avoid run-time dependency on VPP).

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
index cdccd49..4241105 100644
--- a/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
+++ b/cayenne-ant/src/test/java/org/apache/cayenne/tools/CgenWithConfigTest.java
@@ -64,25 +64,58 @@ public class CgenWithConfigTest {
         File mapDir = new File(baseDir, "cgenConfigTest");
         assertTrue(mapDir.mkdirs());
 
+        task.setMap(map);
+
+        // run task
+        task.execute();
+
+        // check results
+        File entity = new File(mapDir, convertPath("ObjEntity1.txt"));
+        assertTrue(entity.isFile());
+
+        File datamap = new File(mapDir, convertPath("Antmap_cgen_xml.txt"));
+        assertTrue(datamap.isFile());
+
+        File notIncludedEntity = new File(mapDir, "ObjEntity.txt");
+        assertFalse(notIncludedEntity.exists());
+
+        File notIncludeSuperDatamap = new File("_Antmap_cgen_xml.txt");
+        assertFalse(notIncludeSuperDatamap.exists());
+    }
+
+    @Test
+    public void testCgenWithDmAndPomConfigs() throws Exception {
+        File mapDir = new File(baseDir, "cgenDmPomTest");
+        assertTrue(mapDir.mkdirs());
+
         task.setDestDir(mapDir);
         task.setMap(map);
+        task.setExcludeEntities("ObjEntity1");
         task.setMode("entity");
+        task.setMakepairs(false);
+        task.setOutputPattern("*.txt");
 
         // run task
         task.execute();
 
         // check results
-        File entity = new File(mapDir, convertPath("ObjEntity1.txt"));
+        File entity = new File(mapDir, convertPath("ObjEntity.txt"));
         assertTrue(entity.isFile());
 
-        File datamap = new File(mapDir, convertPath("TestCgenMap.txt"));
+        File embeddable = new File(mapDir, convertPath("Embeddable.txt"));
+        assertTrue(embeddable.isFile());
+
+        File datamap = new File(mapDir, convertPath("Antmap_cgen_xml.txt"));
         assertFalse(datamap.exists());
 
-        File notIncludedEntity = new File(mapDir, "ObjEntity.txt");
+        File notIncludedEntity = new File(mapDir, "ObjEntity1.txt");
         assertFalse(notIncludedEntity.exists());
 
-        File notIncludeSuperDatamap = new File("_TestCgenMap.txt");
+        File notIncludeSuperDatamap = new File("_Antmap_cgen_xml.txt");
         assertFalse(notIncludeSuperDatamap.exists());
+
+        File notIncludedSuperEntity = new File(mapDir, convertPath("_ObjEntity.txt"));
+        assertFalse(notIncludedSuperEntity.exists());
     }
 
     private String convertPath(String unixPath) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-ant/src/test/resources/cgenTest.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-ant/src/test/resources/cgenTest.map.xml b/cayenne-ant/src/test/resources/cgenTest.map.xml
index 930acbc..d249f0f 100644
--- a/cayenne-ant/src/test/resources/cgenTest.map.xml
+++ b/cayenne-ant/src/test/resources/cgenTest.map.xml
@@ -7,21 +7,16 @@
     <obj-entity name="ObjEntity" className="ObjEntity"/>
     <obj-entity name="ObjEntity1" className="ObjEntity1"/>
     <cgen xmlns="http://cayenne.apache.org/schema/10/cgen">
-        <objEntity>
-            <name>ObjEntity1</name>
-        </objEntity>
-        <generationMode>all</generationMode>
-        <dataMapTemplate>templates/v4_1/datamap-subclass.vm</dataMapTemplate>
-        <dataMapSuperclassTemplate>templates/v4_1/datamap-superclass.vm</dataMapSuperclassTemplate>
-        <subclassTemplate>templates/v4_1/subclass.vm</subclassTemplate>
-        <superclassTemplate>templates/v4_1/superclass.vm</superclassTemplate>
-        <embeddableTemplate>templates/v4_1/embeddable-subclass.vm</embeddableTemplate>
-        <embeddableSuperclassTemplate>templates/v4_1/embeddable-superclass.vm</embeddableSuperclassTemplate>
+        <destDir>cgenConfigTest</destDir>
+        <excludeEntities>ObjEntity</excludeEntities>
+        <excludeEmbeddables>Embeddable</excludeEmbeddables>
+        <mode>all</mode>
+        <template>templates/v4_1/subclass.vm</template>
+        <superTemplate>templates/v4_1/superclass.vm</superTemplate>
         <outputPattern>*.txt</outputPattern>
         <makePairs>false</makePairs>
         <usePkgPath>true</usePkgPath>
-        <overwriteSubclasses>false</overwriteSubclasses>
+        <overwrite>false</overwrite>
         <createPropertyNames>false</createPropertyNames>
-        <encoding>UTF-8</encoding>
     </cgen>
 </data-map>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
new file mode 100644
index 0000000..8d4157d
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/CgenConfiguration.java
@@ -0,0 +1,363 @@
+package org.apache.cayenne.gen;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.gen.xml.CgenExtension;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
+
+import java.io.Serializable;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+public class CgenConfiguration implements Serializable, XMLSerializable {
+
+    private Collection<Artifact> artifacts;
+    private Collection<String> entityArtifacts;
+    private Collection<String> excludeEntityArtifacts;
+    private Collection<String> embeddableArtifacts;
+    private Collection<String> excludeEmbeddableArtifacts;
+
+    private String superPkg;
+    private DataMap dataMap;
+
+    private ArtifactsGenerationMode artifactsGenerationMode;
+    private boolean makePairs;
+
+    private Path rootPath;
+    private Path relPath;
+    private boolean overwrite;
+    private boolean usePkgPath;
+
+    private String template;
+    private String superTemplate;
+    private String embeddableTemplate;
+    private String embeddableSuperTemplate;
+    private String queryTemplate;
+    private String querySuperTemplate;
+    private long timestamp;
+    private String outputPattern;
+    private String encoding;
+    private boolean createPropertyNames;
+    private boolean force; // force run generator
+    /**
+     * @since 4.1
+     */
+    private boolean createPKProperties;
+
+    private boolean client;
+
+    public CgenConfiguration() {
+        this.outputPattern = "*.java";
+        this.timestamp = 0L;
+        this.usePkgPath = true;
+        this.makePairs = true;
+
+        this.artifacts = new ArrayList<>();
+        this.entityArtifacts = new ArrayList<>();
+        this.excludeEntityArtifacts = new ArrayList<>();
+        this.embeddableArtifacts = new ArrayList<>();
+        this.excludeEmbeddableArtifacts = new ArrayList<>();
+        this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+
+        this.template = ClassGenerationAction.SUBCLASS_TEMPLATE;
+        this.superTemplate = ClassGenerationAction.SUPERCLASS_TEMPLATE;
+        this.embeddableTemplate = ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE;
+        this.embeddableSuperTemplate = ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE;
+        this.queryTemplate = ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE;
+        this.querySuperTemplate = ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE;
+    }
+
+    public void resetCollections(){
+        embeddableArtifacts.clear();
+        entityArtifacts.clear();
+    }
+
+    public String getSuperPkg() {
+        return superPkg;
+    }
+
+    public void setSuperPkg(String superPkg) {
+        this.superPkg = superPkg;
+    }
+
+    public DataMap getDataMap() {
+        return dataMap;
+    }
+
+    public void setDataMap(DataMap dataMap) {
+        this.dataMap = dataMap;
+    }
+
+    public void setArtifactsGenerationMode(String mode) {
+        if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
+            this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
+        } else {
+            this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
+        }
+    }
+
+    public String getArtifactsGenerationMode(){
+        return artifactsGenerationMode.getLabel();
+    }
+
+
+    public boolean isMakePairs() {
+        return makePairs;
+    }
+
+    public void setMakePairs(boolean makePairs) {
+        this.makePairs = makePairs;
+    }
+
+    public Path getRootPath() {
+        return rootPath;
+    }
+
+    public void setRootPath(Path rootPath) {
+        this.rootPath = rootPath;
+    }
+
+    public void setRelPath(Path relPath) {
+        this.relPath = relPath;
+    }
+
+    public void setRelPath(String path) {
+		this.relPath = rootPath != null ? rootPath.relativize(Paths.get(path)) : Paths.get(path);
+	}
+
+    public boolean isOverwrite() {
+        return overwrite;
+    }
+
+    public void setOverwrite(boolean overwrite) {
+        this.overwrite = overwrite;
+    }
+
+    public boolean isUsePkgPath() {
+        return usePkgPath;
+    }
+
+    public void setUsePkgPath(boolean usePkgPath) {
+        this.usePkgPath = usePkgPath;
+    }
+
+    public String getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(String template) {
+        this.template = template;
+    }
+
+    public String getSuperTemplate() {
+        return superTemplate;
+    }
+
+    public void setSuperTemplate(String superTemplate) {
+        this.superTemplate = superTemplate;
+    }
+
+    public String getEmbeddableTemplate() {
+        return embeddableTemplate;
+    }
+
+    public void setEmbeddableTemplate(String embeddableTemplate) {
+        this.embeddableTemplate = embeddableTemplate;
+    }
+
+    public String getEmbeddableSuperTemplate() {
+        return embeddableSuperTemplate;
+    }
+
+    public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
+        this.embeddableSuperTemplate = embeddableSuperTemplate;
+    }
+
+    public String getQueryTemplate() {
+        return queryTemplate;
+    }
+
+    public void setQueryTemplate(String queryTemplate) {
+        this.queryTemplate = queryTemplate;
+    }
+
+    public String getQuerySuperTemplate() {
+        return querySuperTemplate;
+    }
+
+    public void setQuerySuperTemplate(String querySuperTemplate) {
+        this.querySuperTemplate = querySuperTemplate;
+    }
+
+    public long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getOutputPattern() {
+        return outputPattern;
+    }
+
+    public void setOutputPattern(String outputPattern) {
+        this.outputPattern = outputPattern;
+    }
+
+    public String getEncoding() {
+        return encoding;
+    }
+
+    public void setEncoding(String encoding) {
+        this.encoding = encoding;
+    }
+
+    public boolean isCreatePropertyNames() {
+        return createPropertyNames;
+    }
+
+    public void setCreatePropertyNames(boolean createPropertyNames) {
+        this.createPropertyNames = createPropertyNames;
+    }
+
+    public boolean isForce() {
+        return force;
+    }
+
+    public void setForce(boolean force) {
+        this.force = force;
+    }
+
+    public boolean isCreatePKProperties() {
+        return createPKProperties;
+    }
+
+    public void setCreatePKProperties(boolean createPKProperties) {
+        this.createPKProperties = createPKProperties;
+    }
+
+    public String getRelPath() {
+        if(relPath == null || relPath.toString().isEmpty()) {
+            return ".";
+        }
+        return relPath.toString();
+    }
+
+    public String getDir(){
+        return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize().toString() : rootPath.toString() : null;
+    }
+
+    public Collection<Artifact> getArtifacts() {
+        return artifacts;
+    }
+
+    public Collection<String> getEntities() {
+        return entityArtifacts;
+    }
+
+    public Collection<String> getEmbeddables() {
+        return embeddableArtifacts;
+    }
+
+    public Path buildPath() {
+		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : relPath;
+	}
+
+    /**
+     * @since 4.1
+     */
+    public void loadEntity(String name) {
+        entityArtifacts.add(name);
+    }
+
+    /**
+     * @since 4.1
+     */
+    public void loadEmbeddable(String name) {
+        embeddableArtifacts.add(name);
+    }
+
+    public void loadEntities(String entities) {
+        excludeEntityArtifacts.addAll(Arrays.asList(entities.split(",")));
+    }
+
+    private String getExcludeEntites() {
+        Collection<String> excludeEntities = dataMap.getObjEntities()
+                .stream()
+                .filter(entity -> !entityArtifacts.contains(entity.getName()))
+                .map(ObjEntity::getName)
+                .collect(Collectors.toList());
+        return org.apache.commons.lang3.StringUtils.join(excludeEntities, ",");
+    }
+
+    public void loadEmbeddables(String embeddables) {
+        excludeEmbeddableArtifacts.addAll(Arrays.asList(embeddables.split(",")));
+    }
+
+    private String getExcludeEmbeddables() {
+        Collection<String> excludeEmbeddable = dataMap.getEmbeddables()
+                .stream()
+                .filter(embeddable -> !embeddableArtifacts.contains(embeddable.getClassName()))
+                .map(Embeddable::getClassName)
+                .collect(Collectors.toList());
+        return org.apache.commons.lang3.StringUtils.join(excludeEmbeddable, ",");
+    }
+
+	public void resolveExcludeEntities() {
+		entityArtifacts = dataMap.getObjEntities()
+				.stream()
+				.filter(entity -> !excludeEntityArtifacts.contains(entity.getName()))
+				.map(ObjEntity::getName)
+				.collect(Collectors.toList());
+	}
+
+	public void resolveExcludeEmbeddables() {
+    	embeddableArtifacts = dataMap.getEmbeddables()
+				.stream()
+				.filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName()))
+				.map(Embeddable::getClassName)
+				.collect(Collectors.toList());
+	}
+
+    public boolean isClient() {
+        return client;
+    }
+
+    public void setClient(boolean client) {
+        this.client = client;
+    }
+
+    public void addArtifact(Artifact artifact) {
+        artifacts.add(artifact);
+    }
+
+    @Override
+    public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
+        encoder.start("cgen")
+                .attribute("xmlns", CgenExtension.NAMESPACE)
+                .simpleTag("excludeEntities", getExcludeEntites())
+                .simpleTag("excludeEmbeddables",getExcludeEmbeddables())
+                .simpleTag("destDir", getRelPath())
+                .simpleTag("mode", this.artifactsGenerationMode.getLabel())
+                .simpleTag("template", this.template)
+                .simpleTag("superTemplate", this.superTemplate)
+                .simpleTag("outputPattern", this.outputPattern)
+                .simpleTag("makePairs", Boolean.toString(this.makePairs))
+                .simpleTag("usePkgPath", Boolean.toString(this.usePkgPath))
+                .simpleTag("overwrite", Boolean.toString(this.overwrite))
+                .simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames))
+                .simpleTag("superPkg", this.superPkg)
+                .simpleTag("createPKProperties", Boolean.toString(this.createPKProperties))
+                .simpleTag("client", Boolean.toString(client))
+                .end();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 434421f..36ba514 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,14 +20,9 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
-import org.apache.cayenne.gen.xml.CgenExtension;
-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.util.XMLEncoder;
-import org.apache.cayenne.util.XMLSerializable;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
@@ -36,12 +31,12 @@ import org.slf4j.Logger;
 import java.io.*;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.*;
 import java.util.stream.Collectors;
 
-public class ClassGenerationAction implements Serializable, XMLSerializable {
-	static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
+public class ClassGenerationAction {
+
+	private static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
 
 	public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "singleclass.vm";
 	public static final String SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "subclass.vm";
@@ -58,159 +53,105 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	public static final String SUPERCLASS_PREFIX = "_";
 	private static final String WILDCARD = "*";
 
-	Collection<Artifact> artifacts;
-	private Collection<String> entityArtifacts;
-	private Collection<String> excludeEntityArtifacts;
-	private Collection<String> embeddableArtifacts;
-	private Collection<String> excludeEmbeddableArtifacts;
-
-	protected String superPkg;
-	protected DataMap dataMap;
-
-	protected ArtifactsGenerationMode artifactsGenerationMode;
-	protected boolean makePairs;
-
+	protected CgenConfiguration cgenConfiguration;
 	protected Logger logger;
 
-	protected Path rootPath;
-	protected Path relPath;
+    // runtime ivars
+    protected VelocityContext context;
+    protected Map<String, Template> templateCache;
 
-	protected boolean overwrite;
-	protected boolean usePkgPath;
-
-	protected String template;
-	protected String superTemplate;
-	protected String embeddableTemplate;
-	protected String embeddableSuperTemplate;
-	protected String queryTemplate;
-	protected String querySuperTemplate;
-	protected long timestamp;
-	protected String outputPattern;
-	protected String encoding;
-	protected boolean createPropertyNames;
-	protected boolean force; // force run generator
-
-	/**
-	 * @since 4.1
-	 */
-	protected boolean createPKProperties;
-
-	// runtime ivars
-	protected VelocityContext context;
-	protected Map<String, Template> templateCache;
-
-
-	public ClassGenerationAction() {
-        this.outputPattern = "*.java";
-        this.timestamp = 0L;
-        this.usePkgPath = true;
-        this.makePairs = true;
-        this.context = new VelocityContext();
-        this.templateCache = new HashMap<>(5);
-
-        this.artifacts = new ArrayList<>();
-        this.entityArtifacts = new ArrayList<>();
-        this.excludeEntityArtifacts = new ArrayList<>();
-        this.embeddableArtifacts = new ArrayList<>();
-        this.excludeEmbeddableArtifacts = new ArrayList<>();
-        this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
-
-        this.overwrite = false;
-		this.template = SUBCLASS_TEMPLATE;
-		this.superTemplate = SUPERCLASS_TEMPLATE;
-		this.embeddableTemplate = EMBEDDABLE_SUBCLASS_TEMPLATE;
-		this.embeddableSuperTemplate = EMBEDDABLE_SUPERCLASS_TEMPLATE;
-
-		this.queryTemplate = DATAMAP_SUBCLASS_TEMPLATE;
-		this.querySuperTemplate = DATAMAP_SUPERCLASS_TEMPLATE;
+	public ClassGenerationAction(CgenConfiguration cgenConfiguration) {
+		this.context = new VelocityContext();
+		this.templateCache = new HashMap<>(5);
+		this.cgenConfiguration = cgenConfiguration;
 	}
 
-	protected String defaultTemplateName(TemplateType type) {
+	public String defaultTemplateName(TemplateType type) {
 		switch (type) {
-		case ENTITY_SINGLE_CLASS:
-			return ClassGenerationAction.SINGLE_CLASS_TEMPLATE;
-		case ENTITY_SUBCLASS:
-			return ClassGenerationAction.SUBCLASS_TEMPLATE;
-		case ENTITY_SUPERCLASS:
-			return ClassGenerationAction.SUPERCLASS_TEMPLATE;
-		case EMBEDDABLE_SUBCLASS:
-			return ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE;
-		case EMBEDDABLE_SUPERCLASS:
-			return ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE;
-		case EMBEDDABLE_SINGLE_CLASS:
-			return ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE;
-		case DATAMAP_SINGLE_CLASS:
-			return ClassGenerationAction.DATAMAP_SINGLE_CLASS_TEMPLATE;
-		case DATAMAP_SUPERCLASS:
-			return ClassGenerationAction.DATAMAP_SUPERCLASS_TEMPLATE;
-		case DATAMAP_SUBCLASS:
-			return ClassGenerationAction.DATAMAP_SUBCLASS_TEMPLATE;
-		default:
-			throw new IllegalArgumentException("Invalid template type: " + type);
+			case ENTITY_SINGLE_CLASS:
+				return SINGLE_CLASS_TEMPLATE;
+			case ENTITY_SUBCLASS:
+				return SUBCLASS_TEMPLATE;
+			case ENTITY_SUPERCLASS:
+				return SUPERCLASS_TEMPLATE;
+			case EMBEDDABLE_SUBCLASS:
+				return EMBEDDABLE_SUBCLASS_TEMPLATE;
+			case EMBEDDABLE_SUPERCLASS:
+				return EMBEDDABLE_SUPERCLASS_TEMPLATE;
+			case EMBEDDABLE_SINGLE_CLASS:
+				return EMBEDDABLE_SINGLE_CLASS_TEMPLATE;
+			case DATAMAP_SINGLE_CLASS:
+				return DATAMAP_SINGLE_CLASS_TEMPLATE;
+			case DATAMAP_SUPERCLASS:
+				return DATAMAP_SUPERCLASS_TEMPLATE;
+			case DATAMAP_SUBCLASS:
+				return DATAMAP_SUBCLASS_TEMPLATE;
+			default:
+				throw new IllegalArgumentException("Invalid template type: " + type);
 		}
 	}
 
-	private String customTemplateName(TemplateType type) {
+	public String customTemplateName(TemplateType type) {
 		switch (type) {
-		case ENTITY_SINGLE_CLASS:
-			return template;
-		case ENTITY_SUBCLASS:
-			return template;
-		case ENTITY_SUPERCLASS:
-			return superTemplate;
-		case EMBEDDABLE_SINGLE_CLASS:
-			return embeddableTemplate;
-		case EMBEDDABLE_SUBCLASS:
-			return embeddableTemplate;
-		case EMBEDDABLE_SUPERCLASS:
-			return embeddableSuperTemplate;
-		case DATAMAP_SINGLE_CLASS:
-			return queryTemplate;
-		case DATAMAP_SUPERCLASS:
-			return querySuperTemplate;
-		case DATAMAP_SUBCLASS:
-			return queryTemplate;
-		default:
-			throw new IllegalArgumentException("Invalid template type: " + type);
+			case ENTITY_SINGLE_CLASS:
+				return cgenConfiguration.getTemplate();
+			case ENTITY_SUBCLASS:
+				return cgenConfiguration.getTemplate();
+			case ENTITY_SUPERCLASS:
+				return cgenConfiguration.getSuperTemplate();
+			case EMBEDDABLE_SINGLE_CLASS:
+				return cgenConfiguration.getEmbeddableTemplate();
+			case EMBEDDABLE_SUBCLASS:
+				return cgenConfiguration.getEmbeddableTemplate();
+			case EMBEDDABLE_SUPERCLASS:
+				return cgenConfiguration.getEmbeddableSuperTemplate();
+			case DATAMAP_SINGLE_CLASS:
+				return cgenConfiguration.getQueryTemplate();
+			case DATAMAP_SUPERCLASS:
+				return cgenConfiguration.getQuerySuperTemplate();
+			case DATAMAP_SUBCLASS:
+				return cgenConfiguration.getQueryTemplate();
+			default:
+				throw new IllegalArgumentException("Invalid template type: " + type);
 		}
 	}
 
-	/**
-	 * VelocityContext initialization method called once per artifact.
-	 */
-	private void resetContextForArtifact(Artifact artifact) {
-		StringUtils stringUtils = StringUtils.getInstance();
+    /**
+     * VelocityContext initialization method called once per artifact.
+     */
+    public void resetContextForArtifact(Artifact artifact) {
+        StringUtils stringUtils = StringUtils.getInstance();
 
-		String qualifiedClassName = artifact.getQualifiedClassName();
-		String packageName = stringUtils.stripClass(qualifiedClassName);
-		String className = stringUtils.stripPackageName(qualifiedClassName);
+        String qualifiedClassName = artifact.getQualifiedClassName();
+        String packageName = stringUtils.stripClass(qualifiedClassName);
+        String className = stringUtils.stripPackageName(qualifiedClassName);
 
-		String qualifiedBaseClassName = artifact.getQualifiedBaseClassName();
-		String basePackageName = stringUtils.stripClass(qualifiedBaseClassName);
-		String baseClassName = stringUtils.stripPackageName(qualifiedBaseClassName);
+        String qualifiedBaseClassName = artifact.getQualifiedBaseClassName();
+        String basePackageName = stringUtils.stripClass(qualifiedBaseClassName);
+        String baseClassName = stringUtils.stripPackageName(qualifiedBaseClassName);
 
-		String superClassName = getSuperclassPrefix() + stringUtils.stripPackageName(qualifiedClassName);
+        String superClassName = SUPERCLASS_PREFIX + stringUtils.stripPackageName(qualifiedClassName);
 
-		String superPackageName = this.superPkg;
-		if (superPackageName == null) {
-			superPackageName = packageName + ".auto";
-		}
+        String superPackageName = cgenConfiguration.getSuperPkg();
+        if (superPackageName == null) {
+            superPackageName = packageName + ".auto";
+        }
 
-		context.put(Artifact.BASE_CLASS_KEY, baseClassName);
-		context.put(Artifact.BASE_PACKAGE_KEY, basePackageName);
+        context.put(Artifact.BASE_CLASS_KEY, baseClassName);
+        context.put(Artifact.BASE_PACKAGE_KEY, basePackageName);
 
-		context.put(Artifact.SUB_CLASS_KEY, className);
-		context.put(Artifact.SUB_PACKAGE_KEY, packageName);
+        context.put(Artifact.SUB_CLASS_KEY, className);
+        context.put(Artifact.SUB_PACKAGE_KEY, packageName);
 
-		context.put(Artifact.SUPER_CLASS_KEY, superClassName);
-		context.put(Artifact.SUPER_PACKAGE_KEY, superPackageName);
+        context.put(Artifact.SUPER_CLASS_KEY, superClassName);
+        context.put(Artifact.SUPER_PACKAGE_KEY, superPackageName);
 
-		context.put(Artifact.OBJECT_KEY, artifact.getObject());
-		context.put(Artifact.STRING_UTILS_KEY, stringUtils);
+        context.put(Artifact.OBJECT_KEY, artifact.getObject());
+        context.put(Artifact.STRING_UTILS_KEY, stringUtils);
 
-		context.put(Artifact.CREATE_PROPERTY_NAMES, createPropertyNames);
-		context.put(Artifact.CREATE_PK_PROPERTIES, createPKProperties);
-	}
+        context.put(Artifact.CREATE_PROPERTY_NAMES, cgenConfiguration.isCreatePropertyNames());
+        context.put(Artifact.CREATE_PK_PROPERTIES, cgenConfiguration.isCreatePKProperties());
+    }
 
 	/**
 	 * VelocityContext initialization method called once per each artifact and
@@ -221,11 +162,50 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		artifact.postInitContext(context);
 	}
 
+	/**
+	 * Adds entities to the internal entity list.
+	 * @param entities collection
+	 *
+	 * @since 4.0 throws exception
+	 */
+	public void addEntities(Collection<ObjEntity> entities) {
+		if (entities != null) {
+			for (ObjEntity entity : entities) {
+				cgenConfiguration.addArtifact(new EntityArtifact(entity));
+			}
+		}
+	}
+
+	public void addEmbeddables(Collection<Embeddable> embeddables) {
+		if (embeddables != null) {
+			for (Embeddable embeddable : embeddables) {
+				cgenConfiguration.addArtifact(new EmbeddableArtifact(embeddable));
+			}
+		}
+	}
+
+	public void addQueries(Collection<QueryDescriptor> queries) {
+		if (cgenConfiguration.getArtifactsGenerationMode().equals(ArtifactsGenerationMode.ALL.getLabel())) {
+			// TODO: andrus 10.12.2010 - why not also check for empty query list??
+			// Or create a better API for enabling DataMapArtifact
+			if (queries != null) {
+				Artifact artifact = new DataMapArtifact(cgenConfiguration.getDataMap(), queries);
+				if(!cgenConfiguration.getArtifacts().contains(artifact)) {
+					cgenConfiguration.addArtifact(artifact);
+				}
+			}
+		}
+	}
+
 	public void prepareArtifacts() {
-		this.artifacts.clear();
-        addAllEntities();
-        addAllEmbeddables();
-        addQueries(dataMap.getQueryDescriptors());
+		cgenConfiguration.getArtifacts().clear();
+		addEntities(cgenConfiguration.getEntities().stream()
+				.map(entity -> cgenConfiguration.getDataMap().getObjEntity(entity))
+				.collect(Collectors.toList()));
+		addEmbeddables(cgenConfiguration.getEmbeddables().stream()
+				.map(embeddable -> cgenConfiguration.getDataMap().getEmbeddable(embeddable))
+				.collect(Collectors.toList()));
+		addQueries(cgenConfiguration.getDataMap().getQueryDescriptors());
     }
 
 	/**
@@ -236,14 +216,14 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		validateAttributes();
 
 		try {
-			for (Artifact artifact : artifacts) {
+			for (Artifact artifact : cgenConfiguration.getArtifacts()) {
 				execute(artifact);
 			}
 		} finally {
 			// must reset engine at the end of class generator run to avoid
 			// memory
 			// leaks and stale templates
-			this.templateCache.clear();
+			templateCache.clear();
 		}
 	}
 
@@ -254,7 +234,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 
 		resetContextForArtifact(artifact);
 
-		ArtifactGenerationMode artifactMode = makePairs ? ArtifactGenerationMode.GENERATION_GAP
+		ArtifactGenerationMode artifactMode = cgenConfiguration.isMakePairs() ? ArtifactGenerationMode.GENERATION_GAP
 				: ArtifactGenerationMode.SINGLE_CLASS;
 
 		TemplateType[] templateTypes = artifact.getTemplateTypes(artifactMode);
@@ -307,10 +287,17 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * Called internally from "execute".
 	 */
 	private void validateAttributes() {
-		Path dir = buildPath();
+		Path dir = cgenConfiguration.buildPath();
 		if (dir == null) {
 			throw new CayenneRuntimeException("'rootPath' attribute is missing.");
 		}
+		if(Files.notExists(dir)) {
+			try {
+				Files.createDirectories(dir);
+			} catch (IOException e) {
+				throw new CayenneRuntimeException("can't create directory");
+			}
+		}
 
 		if (!Files.isDirectory(dir)) {
 			throw new CayenneRuntimeException("'destDir' is not a directory.");
@@ -343,7 +330,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		// return writer with specified encoding
 		FileOutputStream out = new FileOutputStream(outFile);
 
-		return (encoding != null) ? new OutputStreamWriter(out, encoding) : new OutputStreamWriter(out);
+		return (cgenConfiguration.getEncoding() != null) ? new OutputStreamWriter(out, cgenConfiguration.getEncoding()) : new OutputStreamWriter(out);
 	}
 
 	/**
@@ -355,10 +342,10 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String packageName = (String) context.get(Artifact.SUPER_PACKAGE_KEY);
 		String className = (String) context.get(Artifact.SUPER_CLASS_KEY);
 
-		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(new File(getDir()), packageName), filename);
+		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, cgenConfiguration.getOutputPattern(), className);
+		File dest = new File(mkpath(new File(cgenConfiguration.buildPath().toString()), packageName), filename);
 
-		if (dest.exists() && !fileNeedUpdate(dest, superTemplate)) {
+		if (dest.exists() && !fileNeedUpdate(dest, cgenConfiguration.getSuperTemplate())) {
 			return null;
 		}
 
@@ -374,21 +361,21 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		String packageName = (String) context.get(Artifact.SUB_PACKAGE_KEY);
 		String className = (String) context.get(Artifact.SUB_CLASS_KEY);
 
-		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, outputPattern, className);
-		File dest = new File(mkpath(new File(Objects.requireNonNull(buildPath()).toString()), packageName), filename);
+		String filename = StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD, cgenConfiguration.getOutputPattern(), className);
+		File dest = new File(mkpath(new File(Objects.requireNonNull(cgenConfiguration.buildPath()).toString()), packageName), filename);
 
 		if (dest.exists()) {
 			// no overwrite of subclasses
-			if (makePairs) {
+			if (cgenConfiguration.isMakePairs()) {
 				return null;
 			}
 
 			// skip if said so
-			if (!overwrite) {
+			if (!cgenConfiguration.isOverwrite()) {
 				return null;
 			}
 
-			if (!fileNeedUpdate(dest, template)) {
+			if (!fileNeedUpdate(dest, cgenConfiguration.getTemplate())) {
 				return null;
 			}
 		}
@@ -402,7 +389,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * last saved AND the template is older than the destination file
 	 */
 	protected boolean fileNeedUpdate(File dest, String templateFileName) {
-		if(force) {
+		if(cgenConfiguration.isForce()) {
 			return true;
 		}
 
@@ -421,7 +408,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 * Is file modified after internal timestamp (usually equal to mtime of datamap file)
 	 */
 	protected boolean isOld(File file) {
-		return file.lastModified() > timestamp;
+		return file.lastModified() > cgenConfiguration.getTimestamp();
 	}
 
 	/**
@@ -431,7 +418,7 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	 */
 	private File mkpath(File dest, String pkgName) throws Exception {
 
-		if (!usePkgPath || pkgName == null) {
+		if (!cgenConfiguration.isUsePkgPath() || pkgName == null) {
 			return dest;
 		}
 
@@ -445,242 +432,6 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 	}
 
 	/**
-	 * Adds entities to the internal entity list.
-	 * @param entities collection
-	 *
-	 * @since 4.0 throws exception
-	 */
-	public void addEntities(Collection<ObjEntity> entities) {
-		if (entities != null) {
-			for (ObjEntity entity : entities) {
-				artifacts.add(new EntityArtifact(entity));
-			}
-		}
-	}
-
-	public void addEmbeddables(Collection<Embeddable> embeddables) {
-		if (embeddables != null) {
-			for (Embeddable embeddable : embeddables) {
-				artifacts.add(new EmbeddableArtifact(embeddable));
-			}
-		}
-	}
-
-	public void addQueries(Collection<QueryDescriptor> queries) {
-		if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
-			// TODO: andrus 10.12.2010 - why not also check for empty query list??
-			// Or create a better API for enabling DataMapArtifact
-			if (queries != null) {
-				Artifact artifact = new DataMapArtifact(dataMap, queries);
-				if(!artifacts.contains(artifact)) {
-					artifacts.add(artifact);
-				}
-			}
-		}
-	}
-
-    private void addAllEntities() {
-		entityArtifacts.forEach(val -> {
-			Artifact artifact = new EntityArtifact(dataMap.getObjEntity(val));
-			if(!artifacts.contains(artifact)) {
-				artifacts.add(artifact);
-			}
-		});
-	}
-
-    private void addAllEmbeddables() {
-		embeddableArtifacts.forEach(val -> {
-			Artifact artifact = new EmbeddableArtifact(dataMap.getEmbeddable(val));
-			if(!artifacts.contains(artifact)) {
-				artifacts.add(artifact);
-			}
-		});
-	}
-
-    /**
-     * @since 4.1
-     */
-	public void loadEntity(String name) {
-		entityArtifacts.add(name);
-	}
-
-	/**
-	 * @since 4.1
-	 */
-	public void loadEmbeddable(String name) {
-		embeddableArtifacts.add(name);
-	}
-
-	public void setArtifactsGenerationMode(String mode) {
-		if (ArtifactsGenerationMode.ENTITY.getLabel().equalsIgnoreCase(mode)) {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY;
-		} else {
-			this.artifactsGenerationMode = ArtifactsGenerationMode.ALL;
-		}
-	}
-
-	public Path buildPath() {
-		return rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize() : rootPath : null;
-	}
-
-	public void loadEntities(String entities) {
-		excludeEntityArtifacts.addAll(Arrays.asList(entities.split(",")));
-	}
-
-	public void resolveExcludeEntities() {
-		entityArtifacts = dataMap.getObjEntities()
-				.stream()
-				.filter(entity -> !excludeEntityArtifacts.contains(entity.getName()))
-				.map(ObjEntity::getName)
-				.collect(Collectors.toList());
-	}
-
-	public void loadEmbeddables(String embeddables) {
-		excludeEmbeddableArtifacts.addAll(Arrays.asList(embeddables.split(",")));
-	}
-
-	public void resolveExcludeEmbeddables() {
-    	embeddableArtifacts = dataMap.getEmbeddables()
-				.stream()
-				.filter(embeddable -> !excludeEmbeddableArtifacts.contains(embeddable.getClassName()))
-				.map(Embeddable::getClassName)
-				.collect(Collectors.toList());
-	}
-
-    public void resetCollections(){
-		this.embeddableArtifacts.clear();
-		this.entityArtifacts.clear();
-	}
-
-	private String getExcludeEntites() {
-		Collection<String> excludeEntities = dataMap.getObjEntities()
-				.stream()
-				.filter(entity -> !entityArtifacts.contains(entity.getName()))
-				.map(ObjEntity::getName)
-				.collect(Collectors.toList());
-		return org.apache.commons.lang3.StringUtils.join(excludeEntities, ",");
-	}
-
-	private String getExcludeEmbeddables() {
-		Collection<String> excludeEmbeddable = dataMap.getEmbeddables()
-				.stream()
-				.filter(embeddable -> !embeddableArtifacts.contains(embeddable.getClassName()))
-				.map(Embeddable::getClassName)
-				.collect(Collectors.toList());
-		return org.apache.commons.lang3.StringUtils.join(excludeEmbeddable, ",");
-	}
-
-	/**
-	 * Returns a String used to prefix class name to create a generated
-	 * superclass. Default value is "_".
-	 */
-	private String getSuperclassPrefix() {
-		return ClassGenerationAction.SUPERCLASS_PREFIX;
-	}
-
-	public Collection<String> getEmbeddables() {
-		return embeddableArtifacts;
-	}
-
-	/**
-	 * @since 4.1
-	 */
-	public boolean isCreatePKProperties() {
-		return createPKProperties;
-	}
-
-	public boolean isMakePairs() {
-		return makePairs;
-	}
-
-	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 rootPath != null ? relPath != null ? rootPath.resolve(relPath).toAbsolutePath().normalize().toString() : rootPath.toString() : null;
-	}
-
-	public String getTemplate() {
-		return template;
-	}
-
-	public String getSuperPkg(){
-		return superPkg;
-	}
-
-	public Collection<String> getEntities() {
-		return entityArtifacts;
-	}
-
-	public String getRelPath() {
-    	if(relPath == null || relPath.toString().isEmpty()) {
-    		return ".";
-		}
-		return relPath.toString();
-	}
-
-	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;
-	}
-
-	public String getQueryTemplate() {
-		return queryTemplate;
-	}
-
-	public String getQuerySuperTemplate() {
-		return querySuperTemplate;
-	}
-
-	/**
-	 * Sets an optional shared nVelocityContext. Useful with tools like VPP that
-	 * can set custom values in the context, not known to Cayenne.
-	 */
-	public void setContext(VelocityContext context) {
-		this.context = context;
-	}
-
-	/**
 	 * Injects an optional logger that will be used to trace generated files at
 	 * the info level.
 	 */
@@ -688,132 +439,20 @@ public class ClassGenerationAction implements Serializable, XMLSerializable {
 		this.logger = logger;
 	}
 
-	public void setTimestamp(long timestamp) {
-		this.timestamp = timestamp;
+	public CgenConfiguration getCgenConfiguration() {
+		return cgenConfiguration;
 	}
 
 	/**
-	 * Sets file encoding. If set to null, default system encoding will be used.
-	 */
-	public void setEncoding(String encoding) {
-		this.encoding = encoding;
-	}
-
-	/**
-	 * Sets "superPkg" property value.
-	 */
-	public void setSuperPkg(String superPkg) {
-		this.superPkg = superPkg;
-	}
-
-	/**
-	 * @param dataMap The dataMap to set.
-	 */
-	public void setDataMap(DataMap dataMap) {
-		this.dataMap = dataMap;
-	}
-
-	public void setEmbeddableTemplate(String embeddableTemplate) {
-		this.embeddableTemplate = embeddableTemplate;
-	}
-
-	public void setEmbeddableSuperTemplate(String embeddableSuperTemplate) {
-		this.embeddableSuperTemplate = embeddableSuperTemplate;
-	}
-
-	/**
-	 * Sets <code>overwrite</code> property.
-	 */
-	public void setOverwrite(boolean overwrite) {
-		this.overwrite = overwrite;
-	}
-
-	/**
-	 * Sets <code>makepairs</code> property.
-	 */
-	public void setMakePairs(boolean makePairs) {
-		this.makePairs = makePairs;
-	}
-
-	/**
-	 * Sets <code>template</code> property.
-	 */
-	public void setTemplate(String template) {
-		this.template = template;
-	}
-
-	/**
-	 * Sets <code>superTemplate</code> property.
-	 */
-	public void setSuperTemplate(String superTemplate) {
-		this.superTemplate = superTemplate;
-	}
-
-	public void setQueryTemplate(String queryTemplate) {
-		this.queryTemplate = queryTemplate;
-	}
-
-	public void setQuerySuperTemplate(String querySuperTemplate) {
-		this.querySuperTemplate = querySuperTemplate;
-	}
-
-	/**
-	 * Sets <code>usepkgpath</code> property.
-	 */
-	public void setUsePkgPath(boolean usePkgPath) {
-		this.usePkgPath = usePkgPath;
-	}
-
-	/**
-	 * Sets <code>outputPattern</code> property.
-	 */
-	public void setOutputPattern(String outputPattern) {
-		this.outputPattern = outputPattern;
-	}
-
-	/**
-	 * Sets <code>createPropertyNames</code> property.
-	 */
-	public void setCreatePropertyNames(boolean createPropertyNames) {
-		this.createPropertyNames = createPropertyNames;
-	}
-
-	/**
-	 * @since 4.1
+	 * Sets an optional shared VelocityContext. Useful with tools like VPP that
+	 * can set custom values in the context, not known to Cayenne.
 	 */
-	public void setCreatePKProperties(boolean createPKProperties) {
-		this.createPKProperties = createPKProperties;
-	}
-
-	public void setRootPath(Path rootPath) {
-		this.rootPath = rootPath;
-	}
-
-	public void setRelPath(Path relPath) {
-		this.relPath = relPath;
+	public void setContext(VelocityContext context) {
+		this.context = context;
 	}
 
-	public void setRelPath(String path) {
-		this.relPath = rootPath.relativize(Paths.get(path));
+	public void setCgenConfiguration(CgenConfiguration cgenConfiguration) {
+		this.cgenConfiguration = cgenConfiguration;
 	}
 
-	@Override
-	public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) {
-		encoder.start("cgen")
-				.attribute("xmlns", CgenExtension.NAMESPACE)
-				.simpleTag("excludeEntities", getExcludeEntites())
-				.simpleTag("excludeEmbeddables",getExcludeEmbeddables())
-				.simpleTag("outputDirectory", getRelPath())
-				.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)
-				.simpleTag("createPKProperties", Boolean.toString(this.createPKProperties))
-				.end();
-	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
index c8880aa..b823c85 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClientClassGenerationAction.java
@@ -30,18 +30,27 @@ import java.util.Collection;
  */
 public class ClientClassGenerationAction extends ClassGenerationAction {
 
+    private static final String TEMPLATES_DIR_NAME = "templates/v4_1/";
     public static final String SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-subclass.vm";
     public static final String SUPERCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-superclass.vm";
     public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-singleclass.vm";
-    
+
     public static final String DMAP_SUBCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-subclass.vm";
     public static final String DMAP_SUPERCLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-superclass.vm";
-    public static final String DMAP_SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-singleclass.vm";
+    public static final String DATAMAP_SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "client-datamap-singleclass.vm";
 
     public static final String CLIENT_SUPERCLASS_PREFIX = "_Client";
 
+    public ClientClassGenerationAction(CgenConfiguration cgenConfiguration) {
+        super(cgenConfiguration);
+        cgenConfiguration.setTemplate(SUBCLASS_TEMPLATE);
+        cgenConfiguration.setSuperTemplate(SUPERCLASS_TEMPLATE);
+        cgenConfiguration.setQueryTemplate(DMAP_SUBCLASS_TEMPLATE);
+        cgenConfiguration.setQuerySuperTemplate(DMAP_SUPERCLASS_TEMPLATE);
+    }
+
     @Override
-    protected String defaultTemplateName(TemplateType type) {
+    public String defaultTemplateName(TemplateType type) {
         switch (type) {
             case ENTITY_SUBCLASS:
                 return SUBCLASS_TEMPLATE;
@@ -51,18 +60,18 @@ public class ClientClassGenerationAction extends ClassGenerationAction {
                 return SINGLE_CLASS_TEMPLATE;
 
             case EMBEDDABLE_SUBCLASS:
-                return EMBEDDABLE_SUBCLASS_TEMPLATE;
+                return ClassGenerationAction.EMBEDDABLE_SUBCLASS_TEMPLATE;
             case EMBEDDABLE_SUPERCLASS:
-                return EMBEDDABLE_SUPERCLASS_TEMPLATE;
+                return ClassGenerationAction.EMBEDDABLE_SUPERCLASS_TEMPLATE;
             case EMBEDDABLE_SINGLE_CLASS:
-                return EMBEDDABLE_SINGLE_CLASS_TEMPLATE;
-            
+                return ClassGenerationAction.EMBEDDABLE_SINGLE_CLASS_TEMPLATE;
+
             case DATAMAP_SUPERCLASS:
-                return ClientClassGenerationAction.DMAP_SUPERCLASS_TEMPLATE;
+                return DMAP_SUPERCLASS_TEMPLATE;
             case DATAMAP_SUBCLASS:
-                return ClientClassGenerationAction.DMAP_SUBCLASS_TEMPLATE;
+                return DMAP_SUBCLASS_TEMPLATE;
             case DATAMAP_SINGLE_CLASS:
-                return DMAP_SINGLE_CLASS_TEMPLATE;
+                return DATAMAP_SINGLE_CLASS_TEMPLATE;
 
             default:
                 throw new IllegalArgumentException("Unsupported template type: " + type);
@@ -73,14 +82,14 @@ public class ClientClassGenerationAction extends ClassGenerationAction {
      * @since 4.0 throws exception
      */
     @Override
-    public void addEntities(Collection<ObjEntity> entities) throws CayenneRuntimeException {
-        if (!dataMap.isClientSupported()) {
+    public void addEntities(Collection<ObjEntity> entities) {
+        if (!cgenConfiguration.getDataMap().isClientSupported()) {
             throw new CayenneRuntimeException("Can't create client classes. Check client supported option on DataMap configuration.");
         }
         if (entities != null) {
             for (ObjEntity entity : entities) {
                 if (!entity.isServerOnly()) {
-                    artifacts.add(new ClientEntityArtifact(entity));
+                    cgenConfiguration.addArtifact(new ClientEntityArtifact(entity));
                 }
             }
         }
@@ -88,9 +97,9 @@ public class ClientClassGenerationAction extends ClassGenerationAction {
 
     @Override
     public void addQueries(Collection<QueryDescriptor> queries) {
-        if (artifactsGenerationMode == ArtifactsGenerationMode.ALL) {
+        if (cgenConfiguration.getArtifactsGenerationMode().equals(ArtifactsGenerationMode.ALL.getLabel())) {
             if (queries != null) {
-                artifacts.add(new ClientDataMapArtifact(dataMap, queries));
+                cgenConfiguration.addArtifact(new ClientDataMapArtifact(cgenConfiguration.getDataMap(), queries));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 7883ca2..1f4dd5e 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
@@ -20,7 +20,7 @@ package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -33,23 +33,24 @@ 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 OUTPUT_DIRECTORY_TAG = "destDir";
+    private static final String GENERATION_MODE_TAG = "mode";
+    private static final String SUBCLASS_TEMPLATE_TAG = "template";
     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 OVERWRITE_SUBCLASSES_TAG = "overwrite";
     private static final String CREATE_PROPERTY_NAMES_TAG = "createPropertyNames";
     private static final String EXCLUDE_ENTITIES_TAG = "excludeEntities";
     private static final String EXCLUDE_EMBEDDABLES_TAG = "excludeEmbeddables";
     private static final String CREATE_PK_PROPERTIES = "createPKProperties";
+    private static final String CLIENT_TAG = "client";
 
     public static final String TRUE = "true";
 
     private DataChannelMetaData metaData;
-    private ClassGenerationAction configuration;
+    private CgenConfiguration configuration;
 
     CgenConfigHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) {
         super(parentHandler);
@@ -106,6 +107,9 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
             case CREATE_PK_PROPERTIES:
                 createPkPropertiesTag(data);
                 break;
+            case CLIENT_TAG:
+                createClient(data);
+                break;
         }
     }
 
@@ -249,8 +253,22 @@ public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{
         }
     }
 
+    private void createClient(String data) {
+        if(data.trim().length() == 0) {
+            return;
+        }
+
+        if(configuration != null) {
+            if(data.equals(TRUE)) {
+                configuration.setClient(true);
+            } else {
+                configuration.setClient(false);
+            }
+        }
+    }
+
     private void createConfig() {
-        configuration = new ClassGenerationAction();
+        configuration = new CgenConfiguration();
         loaderContext.addDataMapListener(dataMap -> {
             configuration.setDataMap(dataMap);
             configuration.resolveExcludeEntities();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/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 fc23e50..aa008b1 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
@@ -19,7 +19,7 @@
 package org.apache.cayenne.gen.xml;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
-import org.apache.cayenne.gen.ClassGenerationAction;
+import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.project.extension.BaseSaverDelegate;
 
@@ -41,7 +41,7 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
 
     @Override
     public Void visitDataMap(DataMap dataMap) {
-        ClassGenerationAction cgen = metaData.get(dataMap, ClassGenerationAction.class);
+        CgenConfiguration cgen = metaData.get(dataMap, CgenConfiguration.class);
         if(cgen != null){
             resolveOutputDir(cgen);
             encoder.nested(cgen, getParentDelegate());
@@ -49,8 +49,11 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
         return null;
     }
 
-    private void resolveOutputDir(ClassGenerationAction classGenerationAction) {
-        Path prevPath = classGenerationAction.buildPath();
+    private void resolveOutputDir(CgenConfiguration cgenConfiguration) {
+        if(cgenConfiguration.getRootPath() == null) {
+            return;
+        }
+        Path prevPath = cgenConfiguration.buildPath();
         URL url = getBaseDirectory().getURL();
         if(url != null) {
             Path resourcePath = Paths.get(url.getPath());
@@ -59,9 +62,8 @@ public class CgenSaverDelegate extends BaseSaverDelegate{
             }
 
             if(prevPath != null && resourcePath.compareTo(prevPath) != 0) {
-                classGenerationAction.setRootPath(resourcePath);
                 Path relPath = resourcePath.relativize(prevPath);
-                classGenerationAction.setRelPath(relPath);
+                cgenConfiguration.setRelPath(relPath);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
new file mode 100644
index 0000000..00ab16a
--- /dev/null
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEmbeddableFilterAction.java
@@ -0,0 +1,29 @@
+package org.apache.cayenne.tools;
+
+import org.apache.cayenne.dbsync.filter.NameFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.Embeddable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+class CayenneGeneratorEmbeddableFilterAction {
+
+    private NameFilter nameFilter;
+
+    Collection<Embeddable> getFilteredEmbeddables(DataMap mainDataMap) {
+        Collection<Embeddable> embeddables = new ArrayList<>(mainDataMap.getEmbeddables());
+
+        // filter out excluded entities...
+
+        // note that unlike entity, embeddable is matched by class name as it doesn't
+        // have a symbolic name...
+        embeddables.removeIf(e -> !nameFilter.isIncluded(e.getClassName()));
+
+        return embeddables;
+    }
+
+    public void setNameFilter(NameFilter nameFilter) {
+        this.nameFilter = nameFilter;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
index 4d068d8..7d53536 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/tools/CayenneGeneratorEntityFilterAction.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.map.ObjEntity;
 import java.net.MalformedURLException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Iterator;
 
 /**
  * Performs entity filtering to build a collection of entities that should be used in
@@ -43,17 +42,10 @@ class CayenneGeneratorEntityFilterAction {
         Collection<Embeddable> embeddables = new ArrayList<>(mainDataMap.getEmbeddables());
 
         // filter out excluded entities...
-        Iterator<Embeddable> it = embeddables.iterator();
 
-        while (it.hasNext()) {
-            Embeddable e = it.next();
-
-            // note that unlike entity, embeddable is matched by class name as it doesn't
-            // have a symbolic name...
-            if (!nameFilter.isIncluded(e.getClassName())) {
-                it.remove();
-            }
-        }
+        // note that unlike entity, embeddable is matched by class name as it doesn't
+        // have a symbolic name...
+        embeddables.removeIf(e -> !nameFilter.isIncluded(e.getClassName()));
 
         return embeddables;
     }
@@ -64,13 +56,7 @@ class CayenneGeneratorEntityFilterAction {
         Collection<ObjEntity> entities = new ArrayList<>(mainDataMap.getObjEntities());
 
         // filter out excluded entities...
-        Iterator<ObjEntity> it = entities.iterator();
-        while (it.hasNext()) {
-            ObjEntity e = it.next();
-            if (e.isGeneric() || client && !e.isClientAllowed() || !nameFilter.isIncluded(e.getName())) {
-                it.remove();
-            }
-        }
+        entities.removeIf(e -> e.isGeneric() || client && !e.isClientAllowed() || !nameFilter.isIncluded(e.getName()));
 
         return entities;
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/52ea45b5/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
index 721a129..89dfaaa 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/ClassGenerationActionTest.java
@@ -48,10 +48,13 @@ public class ClassGenerationActionTest {
 	protected ClassGenerationAction action;
 	protected Collection<StringWriter> writers;
 
+	protected CgenConfiguration cgenConfiguration;
+
 	@Before
 	public void setUp() throws Exception {
 		writers = new ArrayList<>(3);
-		action = new ClassGenerationAction() {
+		cgenConfiguration = new CgenConfiguration();
+		action = new ClassGenerationAction(cgenConfiguration) {
 
 			@Override
 			protected Writer openWriter(TemplateType templateType) throws Exception {
@@ -74,8 +77,8 @@ public class ClassGenerationActionTest {
 		ObjEntity testEntity1 = new ObjEntity("TE1");
 		testEntity1.setClassName("org.example.TestClass1");
 
-		action.setMakePairs(true);
-		action.setSuperPkg("org.example.auto");
+		cgenConfiguration.setMakePairs(true);
+		cgenConfiguration.setSuperPkg("org.example.auto");
 
 		List<String> generated = execute(new EntityArtifact(testEntity1));
 		assertNotNull(generated);
@@ -116,7 +119,7 @@ public class ClassGenerationActionTest {
 		relationship.setCollectionType("java.util.Map");
 		testEntity1.addRelationship(relationship);
 
-		action.setMakePairs(true);
+		cgenConfiguration.setMakePairs(true);
 
 		List<String> generated = execute(new EntityArtifact(testEntity1));
 		assertNotNull(generated);
@@ -143,7 +146,7 @@ public class ClassGenerationActionTest {
 		testEntity1.addAttribute(attr);
 		testEntity1.addAttribute(attr1);
 
-		action.setMakePairs(true);
+		cgenConfiguration.setMakePairs(true);
 
 		List<String> generated = execute(new EntityArtifact(testEntity1));
 		assertNotNull(generated);
@@ -213,7 +216,7 @@ public class ClassGenerationActionTest {
 
 		if (isClient) {
 
-			action = new ClientClassGenerationAction() {
+			action = new ClientClassGenerationAction(cgenConfiguration) {
 				@Override
 				protected Writer openWriter(TemplateType templateType) throws Exception {
 					StringWriter writer = new StringWriter();
@@ -225,7 +228,7 @@ public class ClassGenerationActionTest {
 
 		}
 
-		action.setMakePairs(true);
+		cgenConfiguration.setMakePairs(true);
 
 		List<String> generated = execute(new EntityArtifact(testEntity1));
 		assertNotNull(generated);
@@ -261,10 +264,10 @@ public class ClassGenerationActionTest {
 		File file = mock(File.class);
 		when(file.lastModified()).thenReturn(1000L);
 
-		action.setTimestamp(0);
+		cgenConfiguration.setTimestamp(0);
 		assertTrue(action.isOld(file));
 
-		action.setTimestamp(2000L);
+		cgenConfiguration.setTimestamp(2000L);
 		assertFalse(action.isOld(file));
 	}
 
@@ -273,23 +276,23 @@ public class ClassGenerationActionTest {
 		File file = mock(File.class);
 		when(file.lastModified()).thenReturn(1000L);
 
-		action.setTimestamp(0);
-		action.setForce(false);
+		cgenConfiguration.setTimestamp(0);
+		cgenConfiguration.setForce(false);
 
 		assertFalse(action.fileNeedUpdate(file, null));
 
-		action.setTimestamp(2000L);
-		action.setForce(false);
+		cgenConfiguration.setTimestamp(2000L);
+		cgenConfiguration.setForce(false);
 
 		assertTrue(action.fileNeedUpdate(file, null));
 
-		action.setTimestamp(0);
-		action.setForce(true);
+		cgenConfiguration.setTimestamp(0);
+		cgenConfiguration.setForce(true);
 
 		assertTrue(action.fileNeedUpdate(file, null));
 
-		action.setTimestamp(2000L);
-		action.setForce(true);
+		cgenConfiguration.setTimestamp(2000L);
+		cgenConfiguration.setForce(true);
 
 		assertTrue(action.fileNeedUpdate(file, null));
 	}