You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by sk...@apache.org on 2016/12/19 11:46:17 UTC

[01/10] cayenne git commit: CAY-2172 Split DB actions to different packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs

Repository: cayenne
Updated Branches:
  refs/heads/master 1a647b252 -> 27138761c


http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
new file mode 100644
index 0000000..4fc78f0
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
@@ -0,0 +1,129 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.List;
+
+
+public class MergerTokenTableModel extends AbstractTableModel {
+
+    public static final int COL_SELECT = 0;
+    public static final int COL_DIRECTION = 1;
+    public static final int COL_NAME = 2;
+    public static final int COL_VALUE = 3;
+
+    private MergerTokenSelectorController controller;
+
+    private List<MergerToken> tokens;
+
+    public MergerTokenTableModel(MergerTokenSelectorController controller) {
+        this.controller = controller;
+        this.tokens = controller.getSelectableTokens();
+    }
+
+    private MergerTokenSelectorController getController() {
+        return controller;
+    }
+
+    public Class getColumnClass(int columnIndex) {
+        switch (columnIndex) {
+            case COL_SELECT:
+                return Boolean.class;
+            case COL_DIRECTION:
+                // TODO: correct?
+                return String.class;
+            case COL_NAME:
+            case COL_VALUE:
+                return String.class;
+        }
+
+        return null;
+    }
+
+    public int getColumnCount() {
+        return 4;
+    }
+
+    public String getColumnName(int columnIndex) {
+        switch (columnIndex) {
+            case COL_SELECT:
+                return "";
+            case COL_NAME:
+                return "Operation";
+            case COL_DIRECTION:
+                return "Direction";
+            case COL_VALUE:
+                return "";
+        }
+
+        return null;
+    }
+
+    public int getRowCount() {
+        return tokens.size();
+    }
+
+    public MergerToken getToken(int rowIndex) {
+        return tokens.get(rowIndex);
+    }
+
+    public Object getValueAt(int rowIndex, int columnIndex) {
+        MergerToken token = getToken(rowIndex);
+        switch (columnIndex) {
+            case COL_SELECT:
+                return Boolean.valueOf(getController().isSelected(token));
+            case COL_NAME:
+                return token.getTokenName();
+            case COL_DIRECTION:
+                return token.getDirection();
+            case COL_VALUE:
+                return token.getTokenValue();
+        }
+        return null;
+    }
+
+    public boolean isCellEditable(int rowIndex, int columnIndex) {
+        switch (columnIndex) {
+            case COL_SELECT:
+            case COL_DIRECTION:
+                return true;
+        }
+        return false;
+    }
+
+    public void setValueAt(Object value, int rowIndex, int columnIndex) {
+        MergerToken token = getToken(rowIndex);
+        switch (columnIndex) {
+            case COL_SELECT:
+                Boolean val = (Boolean) value;
+                getController().select(token, val.booleanValue());
+                break;
+            case COL_DIRECTION:
+                MergeDirection direction = (MergeDirection) value;
+                getController().setDirection(token, direction);
+                break;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
index 8ca4269..59a0197 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
@@ -82,7 +82,7 @@ public final class DbAdapterInfo {
         return new DbAdapterListRenderer(DEFAULT_ADAPTER_LABELS);
     }
 
-    public static Object[] getStandardAdapters() {
+    public static String[] getStandardAdapters() {
         return standardAdapters;
     }
 


[08/10] cayenne git commit: Exclude table settings in reverse engineering dialog Added @since tag to new public classes

Posted by sk...@apache.org.
Exclude table settings in reverse engineering dialog
Added @since tag to new public classes


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

Branch: refs/heads/master
Commit: 06c918302310430952ea145d2f046d0210b6dc19
Parents: 163a871
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 15 12:10:00 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 15 12:10:00 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |  1 +
 .../cayenne/modeler/action/MigrateAction.java   | 13 ++++---
 .../action/ReverseEngineeringAction.java        |  3 +-
 .../dialog/db/DbActionOptionsDialog.java        | 13 ++++---
 .../modeler/dialog/db/load/DbLoaderContext.java |  9 ++++-
 .../dialog/db/load/DbLoaderOptionsDialog.java   | 29 +++++++++++----
 .../modeler/dialog/db/load/LoadDataMapTask.java |  3 ++
 .../dialog/db/merge/DbMigrateOptionsDialog.java | 39 --------------------
 8 files changed, 50 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index 07dcd5b..0c1637d 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -18,6 +18,7 @@ CAY-2164 Relocate builder bootstrap methods from ServerRuntimeBuilder to ServerR
 CAY-2165 Explicit "contribution" API for easier expansion of DI collections and maps
 CAY-2166 Auto-loading of Cayenne modules
 CAY-2168 Split DbLoader to parts and clean it up
+CAY-2172 Cleanup Modeler import and migrate db actions
 
 Bug Fixes:
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index af0dcd0..e6b7a8d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -20,11 +20,10 @@
 package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
-import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
 
 import java.awt.event.ActionEvent;
@@ -33,7 +32,7 @@ import java.util.Collection;
 /**
  * Action that alter database schema to match a DataMap.
  */
-public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
+public class MigrateAction extends DBWizardAction<DbActionOptionsDialog> {
 
     public MigrateAction(Application application) {
         super(getActionName(), application);
@@ -55,7 +54,7 @@ public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
             throw new IllegalStateException("No current DataMap selected.");
         }
 
-        DbMigrateOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
+        DbActionOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
         String selectedCatalog = optionsDialog == null ? null : optionsDialog.getSelectedCatalog();
         String selectedSchema = optionsDialog == null ? null : optionsDialog.getSelectedSchema();
 
@@ -71,7 +70,9 @@ public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
     }
 
     @Override
-    protected DbMigrateOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
-        return new DbMigrateOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
+    protected DbActionOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
+                                                 String currentCatalog, String currentSchema) {
+        return new DbActionOptionsDialog(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
+                catalogs, schemas, currentCatalog, currentSchema);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index a2fefb7..de1c75e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -91,7 +91,8 @@ public class ReverseEngineeringAction extends DBWizardAction<DbLoaderOptionsDial
     }
 
     @Override
-    protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+    protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
+                                                 String currentCatalog, String currentSchema) {
         return new DbLoaderOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
index 19c479b..20eb185 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
@@ -38,7 +38,10 @@ import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.util.CayenneDialog;
 
-public abstract class DbActionOptionsDialog extends CayenneDialog {
+/**
+ * @since 4.0
+ */
+public class DbActionOptionsDialog extends CayenneDialog {
 
     protected static final String WILDCARD_PATTERN = ".*";
     public static final int CANCEL = 0;
@@ -78,9 +81,6 @@ public abstract class DbActionOptionsDialog extends CayenneDialog {
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
 
-        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
-
         initForm(builder);
 
         JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
@@ -141,7 +141,10 @@ public abstract class DbActionOptionsDialog extends CayenneDialog {
         }
     }
 
-    protected abstract void initForm(DefaultFormBuilder builder);
+    protected void initForm(DefaultFormBuilder builder) {
+        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+        schemaLabel = builder.append("Select Schema:", schemaSelector);
+    }
 
     public int getChoice() {
         return choice;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
index 65b9b6e..d11691a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -44,6 +44,9 @@ import org.apache.cayenne.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+/**
+ * @since 4.0
+ */
 public class DbLoaderContext {
 
     private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
@@ -116,7 +119,11 @@ public class DbLoaderContext {
         ReverseEngineering reverseEngineering = new ReverseEngineering();
         reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
         reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
-        reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
+        reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableIncludePattern()));
+        if(dialog.getTableExcludePattern() != null) {
+            reverseEngineering.addExcludeTable(new ExcludeTable(dialog.getTableExcludePattern()));
+        }
+        // Add here auto_pk_support table
         reverseEngineering.addExcludeTable(new ExcludeTable("auto_pk_support|AUTO_PK_SUPPORT"));
         reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
         FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
index e1c422e..192a5aa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -35,7 +35,8 @@ import javax.swing.JTextField;
  */
 public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
 
-    private JTextField tableNamePatternField;
+    private JTextField tableIncludePatternField;
+    private JTextField tableExcludePatternField;
     private JTextField meaningfulPk;
     private JTextField procNamePatternField;
     private JComboBox<String> strategyCombo;
@@ -52,9 +53,13 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
 
     @Override
     protected void initForm(DefaultFormBuilder builder) {
-        tableNamePatternField = new JTextField();
-        tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+        super.initForm(builder);
+        tableIncludePatternField = new JTextField();
+        tableIncludePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
                 "Default expression <b>.*</b> includes all tables.</html>");
+        tableExcludePatternField = new JTextField();
+        tableExcludePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+                "Empty by default excludes nothing.</html>");
         procNamePatternField = new JTextField();
         procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
                 "Default expression <b>.*</b> includes all stored procedures.</html>");
@@ -65,7 +70,8 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
         strategyCombo = new JComboBox<>();
         strategyCombo.setEditable(true);
 
-        builder.append("Table Name Pattern:", tableNamePatternField);
+        builder.append("Table Name Include Pattern:", tableIncludePatternField);
+        builder.append("Table Name Exclude Pattern:", tableExcludePatternField);
         builder.append("Procedure Name Pattern:", procNamePatternField);
         builder.append("Naming Strategy:", strategyCombo);
         builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
@@ -74,7 +80,7 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
     protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
         super.initFromModel(catalogs, schemas, currentCatalog, currentSchema);
 
-        this.tableNamePatternField.setText(WILDCARD_PATTERN);
+        this.tableIncludePatternField.setText(WILDCARD_PATTERN);
         this.procNamePatternField.setText(WILDCARD_PATTERN);
 
         Vector<String> arr = NameGeneratorPreferences
@@ -83,9 +89,16 @@ public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
         strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
     }
 
-    String getTableNamePattern() {
-        return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
-                .getText();
+    String getTableIncludePattern() {
+        return "".equals(tableIncludePatternField.getText()) ?
+                null :
+                tableIncludePatternField.getText();
+    }
+
+    String getTableExcludePattern() {
+        return "".equals(tableExcludePatternField.getText()) ?
+                null :
+                tableExcludePatternField.getText();
     }
 
     String getMeaningfulPk() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
index ceb0d44..d592385 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
@@ -32,6 +32,9 @@ import org.apache.cayenne.tools.dbimport.DbImportModule;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+/**
+ * @since 4.0
+ */
 final public class LoadDataMapTask extends LongRunningTask {
 
     private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/06c91830/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
deleted file mode 100644
index d044b30..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
+++ /dev/null
@@ -1,39 +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.db.merge;
-
-import java.util.Collection;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
-
-public class DbMigrateOptionsDialog extends DbActionOptionsDialog {
-    
-    public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
-                                  String defaultCatalog, String defaultSchema) {
-        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
-                catalogs, schemas, defaultCatalog, defaultSchema);
-    }
-
-    @Override
-    protected void initForm(DefaultFormBuilder builder) {
-    }
-}


[05/10] cayenne git commit: Unify logic of Merge and ReverseEngineer actions

Posted by sk...@apache.org.
Unify logic of Merge and ReverseEngineer actions


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

Branch: refs/heads/master
Commit: 190ab7c7b72eb846ed39c7c80e4fa9a51046adf1
Parents: 7da0e89
Author: Nikita Timofeev <st...@gmail.com>
Authored: Wed Dec 14 10:56:59 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Dec 14 10:56:59 2016 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/action/DBWizardAction.java  |  61 +++++-
 .../modeler/action/GenerateDBAction.java        |   3 +-
 .../cayenne/modeler/action/MigrateAction.java   |  50 +----
 .../action/ReverseEngineeringAction.java        |  53 +----
 .../modeler/dialog/DbImportProjectSaver.java    |  77 --------
 .../dialog/db/DbActionOptionsDialog.java        | 175 +++++++++++++++++
 .../dialog/db/load/DbLoaderOptionsDialog.java   | 193 +++----------------
 .../dialog/db/merge/DbMigrateOptionsDialog.java | 155 +--------------
 8 files changed, 283 insertions(+), 484 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index a3e652a..4002d58 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -19,13 +19,20 @@
 
 package org.apache.cayenne.modeler.action;
 
+import java.sql.Connection;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
-/**
- */
-public abstract class DBWizardAction extends CayenneAction {
+public abstract class DBWizardAction<T extends DbActionOptionsDialog> extends CayenneAction {
 
     public DBWizardAction(String name, Application application) {
         super(name, application);
@@ -40,4 +47,52 @@ public abstract class DBWizardAction extends CayenneAction {
 
         return connectWizard;
     }
+
+    protected abstract T createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema);
+
+    protected T loaderOptionDialog(DataSourceWizard connectWizard) {
+
+        // use this catalog as the default...
+        List<String> catalogs;
+        List<String> schemas;
+        String currentCatalog;
+        String currentSchema;
+        try(Connection connection = connectWizard.getDataSource().getConnection()) {
+            catalogs = getCatalogs(connectWizard, connection);
+            schemas = getSchemas(connection);
+            if (catalogs.isEmpty() && schemas.isEmpty()) {
+                return null;
+            }
+            currentCatalog = connection.getCatalog();
+            currentSchema = connection.getSchema();
+        } catch (Exception ex) {
+            JOptionPane.showMessageDialog(
+                    Application.getFrame(),
+                    ex.getMessage(),
+                    "Error loading schemas dialog",
+                    JOptionPane.ERROR_MESSAGE);
+            return null;
+        }
+
+        final T optionsDialog = createDialog(catalogs, schemas, currentCatalog, currentSchema);
+        optionsDialog.setVisible(true);
+        if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
+            return optionsDialog;
+        }
+
+        return null;
+    }
+
+    @SuppressWarnings("unchecked")
+    private List<String> getCatalogs(DataSourceWizard connectWizard, Connection connection) throws Exception {
+        if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
+            return (List<String>) Collections.EMPTY_LIST;
+        }
+
+        return DbLoader.loadCatalogs(connection);
+    }
+
+    private List<String> getSchemas(Connection connection) throws Exception {
+        return DbLoader.loadSchemas(connection);
+    }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
index 1cf6301..93c6409 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.gen.DBGeneratorOptions;
+import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.Project;
 
 import java.awt.event.ActionEvent;
@@ -32,7 +33,7 @@ import java.util.Collection;
 /**
  * Action that generates database tables from a DataMap.
  */
-public class GenerateDBAction extends DBWizardAction {
+public class GenerateDBAction extends CayenneAction {
 
     public static String getActionName() {
         return "Generate Database Schema";

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 29cd6a7..ccf6d3e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -20,23 +20,19 @@
 package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
 import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
 
-import javax.sql.DataSource;
-import javax.swing.JOptionPane;
 import java.awt.event.ActionEvent;
-import java.util.Collections;
-import java.util.List;
+import java.util.Collection;
 
 /**
  * Action that alter database schema to match a DataMap.
  */
-public class MigrateAction extends DBWizardAction {
+public class MigrateAction extends DBWizardAction<DbMigrateOptionsDialog> {
 
     public MigrateAction(Application application) {
         super(getActionName(), application);
@@ -58,29 +54,9 @@ public class MigrateAction extends DBWizardAction {
             throw new IllegalStateException("No current DataMap selected.");
         }
 
-        //showOptions dialog
-        String selectedSchema = null;
-        String selectedCatalog = null;
-        try {
-            List<String> schemas = getSchemas(connectWizard);
-            List<String> catalogs = getCatalogs(connectWizard);
-            if (!catalogs.isEmpty() || !schemas.isEmpty()) {
-                DbMigrateOptionsDialog optionsDialog = new DbMigrateOptionsDialog(catalogs, schemas, connectWizard.getConnectionInfo().getUserName());
-                optionsDialog.showDialog();
-                if (optionsDialog.getChoice() == DbMigrateOptionsDialog.SELECT) {
-                    selectedSchema = optionsDialog.getSelectedSchema();
-                    selectedCatalog = optionsDialog.getSelectedCatalog();
-                } else {
-                    return;
-                }
-            }
-        } catch (Exception ex) {
-            JOptionPane.showMessageDialog(
-                    Application.getFrame(),
-                    ex.getMessage(),
-                    "Error loading schemas dialog",
-                    JOptionPane.ERROR_MESSAGE);
-        }
+        DbMigrateOptionsDialog optionsDialog = loaderOptionDialog(connectWizard);
+        String selectedCatalog = optionsDialog == null ? null : optionsDialog.getSelectedCatalog();
+        String selectedSchema = optionsDialog == null ? null : optionsDialog.getSelectedSchema();
 
         MergerTokenFactoryProvider mergerTokenFactoryProvider =
                 getApplication().getInjector().getInstance(MergerTokenFactoryProvider.class);
@@ -93,18 +69,8 @@ public class MigrateAction extends DBWizardAction {
                 map, selectedCatalog, selectedSchema, mergerTokenFactoryProvider).startupAction();
     }
 
-    @SuppressWarnings("unchecked")
-    private List<String> getCatalogs(DataSourceWizard connectWizard) throws Exception {
-        if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
-            return (List<String>)Collections.EMPTY_LIST;
-        }
-
-        DataSource dataSource = connectWizard.getDataSource();
-        return DbLoader.loadCatalogs(dataSource.getConnection());
-    }
-
-    private List<String> getSchemas(DataSourceWizard connectWizard) throws Exception {
-        DataSource dataSource = connectWizard.getDataSource();
-        return DbLoader.loadSchemas(dataSource.getConnection());
+    @Override
+    protected DbMigrateOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+        return new DbMigrateOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 8088639..a2fefb7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,7 +19,6 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.dialog.db.load.DbLoaderContext;
@@ -28,14 +27,13 @@ import org.apache.cayenne.modeler.dialog.db.load.LoadDataMapTask;
 
 import java.awt.event.ActionEvent;
 import java.sql.SQLException;
-import java.util.Collections;
-import java.util.List;
+import java.util.Collection;
 import javax.swing.SwingUtilities;
 
 /**
  * Action that imports database structure into a DataMap.
  */
-public class ReverseEngineeringAction extends DBWizardAction {
+public class ReverseEngineeringAction extends DBWizardAction<DbLoaderOptionsDialog> {
 
     ReverseEngineeringAction(Application application) {
         super(getActionName(), application);
@@ -63,7 +61,7 @@ public class ReverseEngineeringAction extends DBWizardAction {
             return;
         }
 
-        final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard, context);
+        final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard);
         if(!context.buildConfig(connectWizard, loaderOptionsDialog)) {
             return;
         }
@@ -92,47 +90,8 @@ public class ReverseEngineeringAction extends DBWizardAction {
         th.start();
     }
 
-    private DbLoaderOptionsDialog loaderOptionDialog(DataSourceWizard connectWizard, DbLoaderContext context) {
-        if(connectWizard == null) {
-            return null;
-        }
-
-        List<String> catalogs = Collections.emptyList();
-        List<String> schemas = Collections.emptyList();
-        try {
-            schemas = DbLoader.loadSchemas(context.getConnection());
-            if (connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
-                catalogs = DbLoader.loadCatalogs(context.getConnection());
-            }
-        } catch (SQLException ex) {
-            context.processWarn(ex, "Error Loading catalogs and schemas");
-        }
-
-        if (context.isStopping()) {
-            return null;
-        }
-
-        // use this catalog as the default...
-        String currentCatalog = null;
-        String currentSchema = null;
-        try {
-            currentCatalog = context.getConnection().getCatalog();
-            currentSchema = context.getConnection().getSchema();
-        } catch (SQLException e) {
-            context.processWarn(e, "Error getting catalog or schema");
-        }
-
-        final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
-                schemas, catalogs,
-                currentSchema, currentCatalog
-        );
-        dialog.setVisible(true);
-        dialog.dispose();
-
-        if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
-            return null;
-        }
-
-        return dialog;
+    @Override
+    protected DbLoaderOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+        return new DbLoaderOptionsDialog(catalogs, schemas, currentCatalog, currentSchema);
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
deleted file mode 100644
index a422143..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
+++ /dev/null
@@ -1,77 +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;
-
-import org.apache.cayenne.configuration.ConfigurationNameMapper;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.ProjectSaver;
-import org.apache.cayenne.resource.Resource;
-
-public class DbImportProjectSaver implements ProjectSaver {
-
-    //@Inject // unfortunate we are not in DI context for now
-    protected ConfigurationNameMapper nameMapper;
-
-    private ProjectController projectController;
-
-    public DbImportProjectSaver(ProjectController projectController, ConfigurationNameMapper nameMapper) {
-        this.projectController = projectController;
-        this.nameMapper = nameMapper;
-    }
-
-    @Override
-    public String getSupportedVersion() {
-        // not important in the context of non-saving saver
-        return "-1";
-    }
-
-    @Override
-    public void save(Project project) {
-
-        DataMap dataMap = (DataMap) project.getRootNode();
-
-        if (projectController.getCurrentDataMap() != null) {
-
-            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
-            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
-        } else {
-
-            DataChannelDescriptor currentDomain = (DataChannelDescriptor) projectController.getProject().getRootNode();
-            Resource baseResource = currentDomain.getConfigurationSource();
-
-            // a new DataMap, so need to set configuration source for it
-            if (baseResource != null) {
-                Resource dataMapResource = baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap));
-                dataMap.setConfigurationSource(dataMapResource);
-            }
-            projectController.addDataMap(Application.getFrame(), dataMap);
-        }
-    }
-
-    @Override
-    public void saveAs(Project project, Resource baseDirectory) {
-        save(project);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
new file mode 100644
index 0000000..19c479b
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbActionOptionsDialog.java
@@ -0,0 +1,175 @@
+/*****************************************************************
+ *   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.db;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+
+public abstract class DbActionOptionsDialog extends CayenneDialog {
+
+    protected static final String WILDCARD_PATTERN = ".*";
+    public static final int CANCEL = 0;
+    public static final int SELECT = 1;
+
+    private int choice;
+    private JLabel schemaLabel;
+    private JLabel catalogLabel;
+    private JComboBox<String> catalogSelector;
+    private JComboBox<String> schemaSelector;
+    private JButton selectButton;
+    private JButton cancelButton;
+
+    public DbActionOptionsDialog(Frame owner, String title, Collection<String> catalogs, Collection<String> schemas,
+                                 String currentCatalog, String currentSchema) throws HeadlessException {
+        super(owner, title);
+        init();
+        initController();
+        initFromModel(catalogs, schemas, currentCatalog, currentSchema);
+
+        pack();
+        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+        setModal(true);
+        centerWindow();
+    }
+
+    protected void init() {
+        // create widgets...
+        selectButton = new JButton("Continue");
+        cancelButton = new JButton("Cancel");
+        catalogSelector = new JComboBox<>();
+        schemaSelector = new JComboBox<>();
+
+        FormLayout layout = new FormLayout(
+                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+                "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+        schemaLabel = builder.append("Select Schema:", schemaSelector);
+
+        initForm(builder);
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(selectButton);
+        buttons.add(cancelButton);
+
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+        getContentPane().add(buttons, BorderLayout.SOUTH);
+    }
+
+    protected void initController() {
+        selectButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processSelect();
+            }
+        });
+        cancelButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processCancel();
+            }
+        });
+    }
+
+    protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+        this.choice = CANCEL;
+
+        boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
+        schemaSelector.setVisible(showSchemaSelector);
+        schemaLabel.setVisible(showSchemaSelector);
+        if (showSchemaSelector) {
+            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+            if (currentSchema != null) {
+                for (String schema : schemas) {
+                    if (currentSchema.equalsIgnoreCase(schema)) {
+                        schemaSelector.setSelectedItem(schema);
+                        break;
+                    }
+                }
+            }
+        }
+
+        boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
+        catalogSelector.setVisible(showCatalogSelector);
+        catalogLabel.setVisible(showCatalogSelector);
+        if (showCatalogSelector) {
+            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+            if (currentCatalog != null && !currentCatalog.isEmpty()) {
+                for (String catalog : catalogs) {
+                    if (currentCatalog.equalsIgnoreCase(catalog)) {
+                        catalogSelector.setSelectedItem(catalog);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    protected abstract void initForm(DefaultFormBuilder builder);
+
+    public int getChoice() {
+        return choice;
+    }
+
+    private void processSelect() {
+        choice = SELECT;
+        setVisible(false);
+    }
+
+    private void processCancel() {
+        choice = CANCEL;
+        setVisible(false);
+    }
+
+    /**
+     * Returns selected catalog.
+     */
+    public String getSelectedCatalog() {
+        String catalog = (String) catalogSelector.getSelectedItem();
+        return "".equals(catalog) ? null : catalog;
+    }
+
+    /**
+     * Returns selected schema.
+     */
+    public String getSelectedSchema() {
+        String schema = (String) schemaSelector.getSelectedItem();
+        return "".equals(schema) ? null : schema;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
index 1ccc7aa..e1c422e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -20,127 +20,60 @@
 package org.apache.cayenne.modeler.dialog.db.load;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
 
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.util.Collection;
 import java.util.Vector;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JTextField;
 
 /**
  * Dialog for selecting database reverse-engineering parameters.
  */
-public class DbLoaderOptionsDialog extends CayenneDialog {
+public class DbLoaderOptionsDialog extends DbActionOptionsDialog {
 
-    public static final String WILDCARD_PATTERN = ".*";
-
-    public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-    protected JLabel catalogLabel;
-    protected JComboBox<String> catalogSelector;
-    protected JLabel schemaLabel;
-    protected JComboBox<String> schemaSelector;
-    protected JTextField tableNamePatternField;
-    protected JTextField meaningfulPk;
-    protected JTextField procNamePatternField;
-    protected JLabel procedureLabel;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-
-
-    protected JComboBox<String> strategyCombo;
+    private JTextField tableNamePatternField;
+    private JTextField meaningfulPk;
+    private JTextField procNamePatternField;
+    private JComboBox<String> strategyCombo;
     protected String strategy;
-    protected int choice;
 
     /**
      * Creates and initializes new ChooseSchemaDialog.
      */
-    public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
-                                 String dbCatalog) {
-        super(Application.getFrame(), "Reengineer DB Schema: Select Options");
-
-        init();
-        initController();
-        initFromModel(schemas, catalogs, currentSchema, dbCatalog);
-
-        pack();
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setModal(true);
-        centerWindow();
+    public DbLoaderOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
+                                 String dbCatalog, String currentSchema) {
+        super(Application.getFrame(), "Reengineer DB Schema: Select Options",
+                catalogs, schemas, dbCatalog, currentSchema);
     }
 
-    /** Sets up the graphical components. */
-    protected void init() {
-
-        // create widgets...
-        selectButton = new JButton("Continue");
-        cancelButton = new JButton("Cancel");
-        catalogSelector = new JComboBox<>();
-        schemaSelector = new JComboBox<>();
+    @Override
+    protected void initForm(DefaultFormBuilder builder) {
         tableNamePatternField = new JTextField();
         tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
                 "Default expression <b>.*</b> includes all tables.</html>");
         procNamePatternField = new JTextField();
         procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
-                "Default expression .* includes all stored procedures.</html>");
+                "Default expression <b>.*</b> includes all stored procedures.</html>");
         meaningfulPk = new JTextField();
         meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
                 "Multiple expressions divided by comma can be used.<br>" +
-                "Example: <b>^table1,^table2,^prefix.*</b></html>");
+                "Example: <b>^table1|^table2|^prefix.*|table_name</b></html>");
         strategyCombo = new JComboBox<>();
         strategyCombo.setEditable(true);
 
-        // assemble
-        FormLayout layout = new FormLayout(
-                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
-                "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        catalogLabel = builder.append("Select Catalog:", catalogSelector);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
         builder.append("Table Name Pattern:", tableNamePatternField);
-        procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
+        builder.append("Procedure Name Pattern:", procNamePatternField);
         builder.append("Naming Strategy:", strategyCombo);
         builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(cancelButton);
-        buttons.add(selectButton);
-
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);
     }
 
-    protected void initController() {
-        selectButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processSelect();
-            }
-        });
-        cancelButton.addActionListener(new ActionListener() {
+    protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema) {
+        super.initFromModel(catalogs, schemas, currentCatalog, currentSchema);
 
-            public void actionPerformed(ActionEvent e) {
-                processCancel();
-            }
-        });
-    }
-
-    protected void initFromModel(
-            Collection<String> schemas,
-            Collection<String> catalogs,
-            String currentSchema,
-            String currentCatalog) {
-
-        this.choice = CANCEL;
         this.tableNamePatternField.setText(WILDCARD_PATTERN);
         this.procNamePatternField.setText(WILDCARD_PATTERN);
 
@@ -148,100 +81,24 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
                 .getInstance()
                 .getLastUsedStrategies();
         strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
-
-        boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
-        schemaSelector.setVisible(showSchemaSelector);
-        schemaLabel.setVisible(showSchemaSelector);
-
-        if (showSchemaSelector) {
-
-            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-
-            if (currentSchema != null) {
-                for (String schema : schemas) {
-                    if (currentSchema.equalsIgnoreCase(schema)) {
-                        schemaSelector.setSelectedItem(schema);
-                        break;
-                    }
-                }
-            }
-        }
-
-        boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
-        catalogSelector.setVisible(showCatalogSelector);
-        catalogLabel.setVisible(showCatalogSelector);
-
-        if (showCatalogSelector) {
-            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-
-            if (currentCatalog != null && !currentCatalog.isEmpty()) {
-                for (String catalog : catalogs) {
-                    if (currentCatalog.equalsIgnoreCase(catalog)) {
-                        catalogSelector.setSelectedItem(catalog);
-                        break;
-                    }
-                }
-            }
-        }
     }
 
-    public int getChoice() {
-        return choice;
-    }
-
-    private void processSelect() {
-        strategy = (String) strategyCombo.getSelectedItem();
-
-        choice = SELECT;
-        setVisible(false);
-    }
-
-    private void processCancel() {
-        choice = CANCEL;
-        setVisible(false);
-    }
-
-    /**
-     * Returns selected catalog.
-     */
-    public String getSelectedCatalog() {
-        String catalog = (String) catalogSelector.getSelectedItem();
-        return "".equals(catalog) ? null : catalog;
-    }
-
-    /**
-     * Returns selected schema.
-     */
-    public String getSelectedSchema() {
-        String schema = (String) schemaSelector.getSelectedItem();
-        return "".equals(schema) ? null : schema;
-    }
-
-    /**
-     * Returns the tableNamePattern.
-     */
-    public String getTableNamePattern() {
+    String getTableNamePattern() {
         return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
                 .getText();
     }
 
-    public String getMeaningfulPk() {
+    String getMeaningfulPk() {
         return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
                 .getText();
     }
 
-    /**
-     * Returns the procedure name pattern.
-     */
-    public String getProcedureNamePattern() {
+    String getProcedureNamePattern() {
         return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
                 .getText();
     }
 
-    /**
-     * Returns configured naming strategy
-     */
-    public String getNamingStrategy() {
-        return strategy;
+    String getNamingStrategy() {
+        return (String) strategyCombo.getSelectedItem();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/190ab7c7/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
index b3fb929..d044b30 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
@@ -19,158 +19,21 @@
 
 package org.apache.cayenne.modeler.dialog.db.merge;
 
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.util.Collection;
 
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-
 import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class DbMigrateOptionsDialog extends CayenneDialog {
-	private static final long serialVersionUID = 1L;
-	public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-	protected JLabel schemaLabel;
-	protected JLabel catalogLabel;
-    protected JComboBox<String> catalogSelector;
-    protected JComboBox<String> schemaSelector;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-    protected int choice;
-    
-    public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
-        init();
-        initController();
-        initFromModel(catalogs, schemas, dbUserName);
-
-        pack();
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setModal(true);
-        centerWindow();    	
-    }
-    
-    protected void init() {
-        selectButton = new JButton("Continue");
-        cancelButton = new JButton("Cancel");
-        catalogSelector = new JComboBox<>();
-        schemaSelector = new JComboBox<>();
-        FormLayout layout = new FormLayout(
-                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
-                "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(selectButton);
-        buttons.add(cancelButton);
-        
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);        
-    }
-    
-    protected void initController() {
-        selectButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processSelect();
-            }
-        });
-
-        cancelButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processCancel();
-            }
-        });
-    }
-    
-    private void processSelect() {
-        choice = SELECT;
-        setVisible(false);
-    }
-
-    private void processCancel() {
-    	schemaSelector.setSelectedItem(null);
-        choice = CANCEL;
-        setVisible(false);
-    }
-    
-    protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-
-        this.choice = CANCEL;
-
-        if(!schemas.isEmpty()) {
-            schemaLabel.setVisible(true);
-            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-            schemaSelector.setVisible(true);
-        } else {
-            schemaLabel.setVisible(false);
-            schemaSelector.setVisible(false);
-        }
-
-        if(!catalogs.isEmpty()) {
-            catalogLabel.setVisible(true);
-            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-            catalogSelector.setVisible(true);
-        } else {
-            catalogLabel.setVisible(false);
-            catalogSelector.setVisible(false);
-        }
-
-        if (dbUserName == null) {
-            return;
-        }
-
-        // select schema belonging to the user
-        for (String schema : schemas) {
-            if (dbUserName.equalsIgnoreCase(schema)) {
-                schemaSelector.setSelectedItem(schema);
-                break;
-            }
-        }
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;
 
-        for(String catalog : catalogs) {
-            if(dbUserName.equalsIgnoreCase(catalog)) {
-                catalogSelector.setSelectedItem(catalog);
-                break;
-            }
-        }
-    }
+public class DbMigrateOptionsDialog extends DbActionOptionsDialog {
     
-    /**
-     * Returns selected schema.
-     */
-    public String getSelectedSchema() {
-    	return (String) schemaSelector.getSelectedItem();
+    public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas,
+                                  String defaultCatalog, String defaultSchema) {
+        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
+                catalogs, schemas, defaultCatalog, defaultSchema);
     }
 
-    public String getSelectedCatalog() {
-        return (String) catalogSelector.getSelectedItem();
-    }
-    
-    public int getChoice() {
-    	return choice;
-    }
-    
-    public void showDialog() {
-    	setVisible(true);
+    @Override
+    protected void initForm(DefaultFormBuilder builder) {
     }
 }


[07/10] cayenne git commit: Merge branch 'master' into CAY-2172

Posted by sk...@apache.org.
Merge branch 'master' into CAY-2172

# Conflicts:
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java


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

Branch: refs/heads/master
Commit: 163a871542e1cd54c929961cdc52f6fdf6a477ac
Parents: 391c564
Author: stariy <st...@gmail.com>
Authored: Wed Dec 14 22:50:00 2016 +0300
Committer: stariy <st...@gmail.com>
Committed: Wed Dec 14 22:50:00 2016 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/modeler/action/DBWizardAction.java     | 2 +-
 .../org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java | 2 +-
 .../org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java  | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index 4002d58..25a912f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -26,7 +26,7 @@ import java.util.List;
 
 import javax.swing.JOptionPane;
 
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.dialog.db.DbActionOptionsDialog;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
index 6a550a6..65b9b6e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.dbimport.IncludeTable;
 import org.apache.cayenne.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/163a8715/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
index 92043fc..a49f3b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.dialog.db.load;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.dbload.DefaultDbLoaderDelegate;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.event.EntityEvent;


[03/10] cayenne git commit: CAY-2172 Split DB actions to different packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs

Posted by sk...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
deleted file mode 100644
index f53bf9c..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbMigrateOptionsDialog.java
+++ /dev/null
@@ -1,175 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class DbMigrateOptionsDialog extends CayenneDialog {
-	private static final long serialVersionUID = 1L;
-	public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-	protected JLabel schemaLabel;
-	protected JLabel catalogLabel;
-    protected JComboBox<String> catalogSelector;
-    protected JComboBox<String> schemaSelector;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-    protected int choice;
-    
-    public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
-        init();
-        initController();
-        initFromModel(catalogs, schemas, dbUserName);
-
-        pack();
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setModal(true);
-        centerWindow();    	
-    }
-    
-    protected void init() {
-        selectButton = new JButton("Continue");
-        cancelButton = new JButton("Cancel");
-        catalogSelector = new JComboBox<>();
-        schemaSelector = new JComboBox<>();
-        FormLayout layout = new FormLayout(
-                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
-                "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(selectButton);
-        buttons.add(cancelButton);
-        
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);        
-    }
-    
-    protected void initController() {
-        selectButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processSelect();
-            }
-        });
-
-        cancelButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processCancel();
-            }
-        });
-    }
-    
-    private void processSelect() {
-        choice = SELECT;
-        setVisible(false);
-    }
-
-    private void processCancel() {
-    	schemaSelector.setSelectedItem(null);
-        choice = CANCEL;
-        setVisible(false);
-    }
-    
-    protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
-
-        this.choice = CANCEL;
-
-        if(!schemas.isEmpty()) {
-            schemaLabel.setVisible(true);
-            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-            schemaSelector.setVisible(true);
-        } else {
-            schemaLabel.setVisible(false);
-            schemaSelector.setVisible(false);
-        }
-
-        if(!catalogs.isEmpty()) {
-            catalogLabel.setVisible(true);
-            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-            catalogSelector.setVisible(true);
-        } else {
-            catalogLabel.setVisible(false);
-            catalogSelector.setVisible(false);
-        }
-
-        if (dbUserName == null) {
-            return;
-        }
-
-        // select schema belonging to the user
-        for (String schema : schemas) {
-            if (dbUserName.equalsIgnoreCase(schema)) {
-                schemaSelector.setSelectedItem(schema);
-                break;
-            }
-        }
-
-        for(String catalog : catalogs) {
-            if(dbUserName.equalsIgnoreCase(catalog)) {
-                catalogSelector.setSelectedItem(catalog);
-                break;
-            }
-        }
-    }
-    
-    /**
-     * Returns selected schema.
-     */
-    public String getSelectedSchema() {
-    	return (String) schemaSelector.getSelectedItem();
-    }
-
-    public String getSelectedCatalog() {
-        return (String) catalogSelector.getSelectedItem();
-    }
-    
-    public int getChoice() {
-    	return choice;
-    }
-    
-    public void showDialog() {
-    	setVisible(true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
deleted file mode 100644
index 52a3666..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptions.java
+++ /dev/null
@@ -1,395 +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.db;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.event.DataMapEvent;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
-import org.apache.cayenne.dbsync.merge.DbMerger;
-import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerContext;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
-import org.apache.cayenne.dbsync.naming.NoStemStemmer;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
-import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
-import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.resource.Resource;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.cayenne.validation.ValidationResult;
-import org.apache.commons.logging.LogFactory;
-
-import javax.sql.DataSource;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-
-public class MergerOptions extends CayenneController {
-
-    protected MergerOptionsView view;
-    protected ObjectBinding sqlBinding;
-
-    protected DBConnectionInfo connectionInfo;
-    protected DataMap dataMap;
-    protected DbAdapter adapter;
-    protected String textForSQL;
-
-    protected MergerTokenSelectorController tokens;
-    protected String defaultCatalog;
-    protected String defaultSchema;
-    private MergerTokenFactoryProvider mergerTokenFactoryProvider;
-
-    public MergerOptions(ProjectController parent,
-                         String title,
-                         DBConnectionInfo connectionInfo,
-                         DataMap dataMap,
-                         String defaultCatalog,
-                         String defaultSchema,
-                         MergerTokenFactoryProvider mergerTokenFactoryProvider) {
-        super(parent);
-
-        this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
-        this.dataMap = dataMap;
-        this.tokens = new MergerTokenSelectorController(parent);
-        this.view = new MergerOptionsView(tokens.getView());
-        this.connectionInfo = connectionInfo;
-        this.defaultCatalog = defaultCatalog;
-        this.defaultSchema = defaultSchema;
-        this.view.setTitle(title);
-        initController();
-
-        prepareMigrator();
-        createSQL();
-        refreshView();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    public String getTextForSQL() {
-        return textForSQL;
-    }
-
-    protected void initController() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
-
-        builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
-        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
-        builder.bindToAction(view.getCancelButton(), "closeAction()");
-
-        // refresh SQL if different tables were selected
-        view.getTabs().addChangeListener(new ChangeListener() {
-
-            public void stateChanged(ChangeEvent e) {
-                if (view.getTabs().getSelectedIndex() == 1) {
-                    // this assumes that some tables where checked/unchecked... not very
-                    // efficient
-                    refreshGeneratorAction();
-                }
-            }
-        });
-    }
-
-    /**
-     * check database and create the {@link List} of {@link MergerToken}s
-     */
-    protected void prepareMigrator() {
-        try {
-            adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
-
-            MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
-            tokens.setMergerTokenFactory(mergerTokenFactory);
-
-
-            FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
-                    PatternFilter.INCLUDE_NOTHING);
-
-            DbMerger merger = DbMerger.builder(mergerTokenFactory)
-                    .filters(filters)
-                    .build();
-
-            DbLoaderConfiguration config = new DbLoaderConfiguration();
-            config.setFiltersConfig(filters);
-
-            DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
-
-            DataMap dbImport = new DataMap();
-            try (Connection conn = dataSource.getConnection();) {
-                new DbLoader(conn,
-                        adapter,
-                        new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
-                        new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
-                        .load(dbImport, config);
-
-            } catch (SQLException e) {
-                throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
-            }
-
-            tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
-        } catch (Exception ex) {
-            reportError("Error loading adapter", ex);
-        }
-    }
-
-    /**
-     * Returns SQL statements generated for selected schema generation options.
-     */
-    protected void createSQL() {
-        // convert them to string representation for display
-        StringBuilder buf = new StringBuilder();
-
-        Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
-        String batchTerminator = adapter.getBatchTerminator();
-
-        String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
-        while (it.hasNext()) {
-            MergerToken token = it.next();
-
-            if (token instanceof AbstractToDbToken) {
-                AbstractToDbToken tdb = (AbstractToDbToken) token;
-                for (String sql : tdb.createSql(adapter)) {
-                    buf.append(sql);
-                    buf.append(lineEnd);
-                }
-            }
-        }
-
-        textForSQL = buf.toString();
-    }
-
-    protected void refreshView() {
-        sqlBinding.updateView();
-    }
-
-    // ===============
-    // Actions
-    // ===============
-
-    /**
-     * Starts options dialog.
-     */
-    public void startupAction() {
-        view.pack();
-        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        view.setModal(true);
-        makeCloseableOnEscape();
-        centerView();
-        view.setVisible(true);
-    }
-
-    public void refreshGeneratorAction() {
-        refreshSQLAction();
-    }
-
-    /**
-     * Updates a text area showing generated SQL.
-     */
-    public void refreshSQLAction() {
-        createSQL();
-        sqlBinding.updateView();
-    }
-
-    /**
-     * Performs configured schema operations via DbGenerator.
-     */
-    public void generateSchemaAction() {
-        refreshGeneratorAction();
-
-        // sanity check...
-        List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
-        if (tokensToMigrate.isEmpty()) {
-            JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
-            return;
-        }
-
-        DataSource dataSource;
-        try {
-            dataSource = connectionInfo.makeDataSource(getApplication()
-                    .getClassLoadingService());
-        } catch (SQLException ex) {
-            reportError("Migration Error", ex);
-            return;
-        }
-
-        final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
-
-        MergerContext mergerContext = MergerContext.builder(dataMap)
-                .syntheticDataNode(dataSource, adapter)
-                .delegate(createDelegate(loadedObjEntities))
-                .build();
-
-        boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
-
-        DefaultDbImportAction.flattenManyToManyRelationships(
-                dataMap,
-                loadedObjEntities,
-                mergerContext.getNameGenerator());
-
-        notifyProjectModified(modelChanged);
-
-        reportFailures(mergerContext);
-    }
-
-    private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
-        return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
-            @Override
-            public void objEntityAdded(ObjEntity ent) {
-                loadedObjEntities.add(ent);
-                super.objEntityAdded(ent);
-            }
-        };
-    }
-
-    private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
-        boolean modelChanged = false;
-
-        try {
-            for (MergerToken tok : tokensToMigrate) {
-                int numOfFailuresBefore = getFailuresCount(mergerContext);
-
-                tok.execute(mergerContext);
-
-                if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
-                    modelChanged = true;
-                }
-                if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
-                    // looks like the token executed without failures
-                    tokens.removeToken(tok);
-                }
-            }
-        } catch (Throwable th) {
-            reportError("Migration Error", th);
-        }
-
-        return modelChanged;
-    }
-
-    private int getFailuresCount(MergerContext mergerContext) {
-        return mergerContext.getValidationResult().getFailures().size();
-    }
-
-    private void reportFailures(MergerContext mergerContext) {
-        ValidationResult failures = mergerContext.getValidationResult();
-        if (failures == null || !failures.hasFailures()) {
-            JOptionPane.showMessageDialog(getView(), "Migration Complete.");
-        } else {
-            new ValidationResultBrowser(this).startupAction(
-                    "Migration Complete",
-                    "Migration finished. The following problem(s) were ignored.",
-                    failures);
-        }
-    }
-
-    private void notifyProjectModified(boolean modelChanged) {
-        if(!modelChanged) {
-            return;
-        }
-
-        // mark the model as unsaved
-        Project project = getApplication().getProject();
-        project.setModified(true);
-
-        ProjectController projectController = getProjectController();
-        projectController.setDirty(true);
-
-        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
-                dataMap, MapEvent.REMOVE));
-        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
-                dataMap, MapEvent.ADD));
-    }
-
-    /**
-     * Allows user to save generated SQL in a file.
-     */
-    public void storeSQLAction() {
-        JFileChooser fc = new JFileChooser();
-        fc.setDialogType(JFileChooser.SAVE_DIALOG);
-        fc.setDialogTitle("Save SQL Script");
-
-        Resource projectDir = getApplication().getProject().getConfigurationResource();
-
-        if (projectDir != null) {
-            fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
-        }
-
-        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
-            refreshGeneratorAction();
-
-            try {
-                File file = fc.getSelectedFile();
-                FileWriter fw = new FileWriter(file);
-                PrintWriter pw = new PrintWriter(fw);
-                pw.print(textForSQL);
-                pw.flush();
-                pw.close();
-            } catch (IOException ex) {
-                reportError("Error Saving SQL", ex);
-            }
-        }
-    }
-
-    private ProjectController getProjectController() {
-        return getApplication().getFrameController().getProjectController();
-    }
-
-    public void closeAction() {
-        view.dispose();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
deleted file mode 100644
index 24069da..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerOptionsView.java
+++ /dev/null
@@ -1,134 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-
-import org.apache.cayenne.modeler.Application;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * Wizard for altering the database to match the data map.
- */
-public class MergerOptionsView extends JDialog {
-
-    protected JTextArea sql;
-    protected JButton generateButton;
-    protected JButton cancelButton;
-    protected JButton saveSqlButton;
-
-    protected Component tables;
-    protected JTabbedPane tabs;
-
-    public MergerOptionsView(Component tables) {
-        super(Application.getFrame());
-        
-        // create widgets
-        this.generateButton = new JButton("Migrate");
-        this.cancelButton = new JButton("Close");
-        this.saveSqlButton = new JButton("Save SQL");
-
-        this.tables = tables;
-        this.tabs = new JTabbedPane(SwingConstants.TOP);
-        this.sql = new JTextArea();
-        sql.setEditable(false);
-        sql.setLineWrap(true);
-        sql.setWrapStyleWord(true);
-
-        JPanel sqlTextPanel = new JPanel(new BorderLayout());
-        sqlTextPanel.add(new JScrollPane(
-                sql,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 9dlu, p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Generated SQL", cc.xywh(1, 3, 1, 1));
-        builder.add(sqlTextPanel, cc.xy(1, 5));
-
-        tabs.addTab("Operations", new JScrollPane(
-                tables,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
-        tabs.addTab("Generated SQL", builder.getPanel());
-
-        // we need the right preferred size so that dialog "pack()" produces decent
-        // default size...
-        tabs.setPreferredSize(new Dimension(600, 350));
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(saveSqlButton);
-        buttons.add(Box.createHorizontalStrut(20));
-        buttons.add(cancelButton);
-        buttons.add(generateButton);
-
-        Container contentPane = this.getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(tabs, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-
-    public JTabbedPane getTabs() {
-        return tabs;
-    }
-
-    /*
-     * public JCheckBox getCreateFK() { return createFK; } public JCheckBox getCreatePK() {
-     * return createPK; } public JCheckBox getCreateTables() { return createTables; }
-     * public JCheckBox getDropPK() { return dropPK; } public JCheckBox getDropTables() {
-     * return dropTables; }
-     */
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JButton getSaveSqlButton() {
-        return saveSqlButton;
-    }
-
-    public JTextArea getSql() {
-        return sql;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
deleted file mode 100644
index 666b113..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorController.java
+++ /dev/null
@@ -1,239 +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.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-import org.apache.cayenne.dbsync.merge.TokenComparator;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-
-import javax.swing.*;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
-import java.awt.*;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class MergerTokenSelectorController extends CayenneController {
-
-    protected MergerTokenSelectorView view;
-    protected ObjectBinding tableBinding;
-
-    protected MergerToken token;
-    protected int permanentlyExcludedCount;
-    protected Set<MergerToken> excludedTokens;
-    protected List<MergerToken> selectableTokensList;
-    protected MergerTokenFactory mergerTokenFactory;
-
-    public MergerTokenSelectorController(CayenneController parent) {
-        super(parent);
-        this.view = new MergerTokenSelectorView();
-        this.excludedTokens = new HashSet<MergerToken>();
-        this.selectableTokensList = new ArrayList<MergerToken>();
-        initController();
-    }
-
-    public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
-        this.mergerTokenFactory = mergerTokenFactory;
-    }
-
-    public void setTokens(List<MergerToken> tokens) {
-        selectableTokensList.clear();
-        selectableTokensList.addAll(tokens);
-        excludedTokens.addAll(tokens);
-    }
-
-    public List<MergerToken> getSelectedTokens() {
-        List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
-        t.removeAll(excludedTokens);
-        return Collections.unmodifiableList(t);
-    }
-
-    public List<MergerToken> getSelectableTokens() {
-        return Collections.unmodifiableList(selectableTokensList);
-    }
-    
-    public void removeToken(MergerToken token) {
-        selectableTokensList.remove(token);
-        excludedTokens.remove(token);
-
-        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-
-    // ----- properties -----
-
-    public Component getView() {
-        return view;
-    }
-
-    /**
-     * Called by table binding script to set current token.
-     */
-    public void setToken(MergerToken token) {
-        this.token = token;
-    }
-
-    /**
-     * Returns {@link MergerToken}s that are excluded from DB generation.
-     */
-    /*
-     * public Collection getExcludedTokens() { return excludedTokens; }
-     */
-
-    public boolean isIncluded() {
-        if (token == null) {
-            return false;
-        }
-
-        return !excludedTokens.contains(token);
-    }
-
-    public void setIncluded(boolean b) {
-        if (token == null) {
-            return;
-        }
-
-        if (b) {
-            excludedTokens.remove(token);
-        }
-        else {
-            excludedTokens.add(token);
-        }
-
-        tableSelectedAction();
-    }
-
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
-    public void tableSelectedAction() {
-        int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
-
-        if (unselectedCount == selectableTokensList.size()) {
-            view.getCheckAll().setSelected(false);
-        }
-        else if (unselectedCount == 0) {
-            view.getCheckAll().setSelected(true);
-        }
-    }
-
-    // ------ other stuff ------
-
-    protected void initController() {
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-        builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
-
-        TableModel model = new MergerTokenTableModel(this);
-
-        MergeDirection[] dirs = new MergeDirection[] {
-                MergeDirection.TO_DB, MergeDirection.TO_MODEL
-        };
-
-        view.getTokens().setModel(model);
-
-        TableColumnModel columnModel = view.getTokens().getColumnModel();
-        
-        // dropdown for direction column
-        JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
-        directionCombo.setEditable(false);
-        TableColumn directionColumn = columnModel.getColumn(
-                MergerTokenTableModel.COL_DIRECTION);
-        directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
-
-        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
-        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
-        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
-        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
-    }
-
-    public boolean isSelected(MergerToken token) {
-        return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
-    }
-
-    public void select(MergerToken token, boolean select) {
-        if (select) {
-            excludedTokens.remove(token);
-        }
-        else {
-            excludedTokens.add(token);
-        }
-    }
-
-    public void setDirection(MergerToken token, MergeDirection direction) {
-        if (token.getDirection().equals(direction)) {
-            return;
-        }
-        int i = selectableTokensList.indexOf(token);
-        MergerToken reverse = token.createReverse(mergerTokenFactory);
-        selectableTokensList.set(i, reverse);
-        if (excludedTokens.remove(token)) {
-            excludedTokens.add(reverse);
-        }
-        
-        /**
-         * Repaint, so that "Operation" column updates properly
-         */
-        view.getTokens().repaint();
-    }
-
-    public void checkAllAction() {
-
-        boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
-        if (isCheckAllSelected) {
-            excludedTokens.clear();
-        }
-        else {
-            excludedTokens.addAll(selectableTokensList);
-        }
-
-        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-
-    public void reverseAllAction() {
-        
-        for (int i = 0; i < selectableTokensList.size(); i++) {
-            MergerToken token = selectableTokensList.get(i);
-            MergerToken reverse = token.createReverse(mergerTokenFactory);
-            selectableTokensList.set(i, reverse);
-            if (excludedTokens.remove(token)) {
-                excludedTokens.add(reverse);
-            }
-        }
-
-        Collections.sort(selectableTokensList, new TokenComparator());
-        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
-        model.fireTableDataChanged();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
deleted file mode 100644
index a644a48..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenSelectorView.java
+++ /dev/null
@@ -1,106 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.factories.ButtonBarFactory;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class MergerTokenSelectorView extends JPanel {
-
-    protected JTable tokens;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
-    protected JButton reverseAll;
-
-    public MergerTokenSelectorView() {
-
-        this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Operations");
-        this.reverseAll = new JButton("Reverse All Operations");
-
-        checkAll.addItemListener(new ItemListener() {
-
-            public void itemStateChanged(ItemEvent event) {
-                if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Operations");
-                }
-                else {
-                    checkAllLabel.setText("Check All Operations");
-                }
-            }
-        });
-
-        // assemble
-        JPanel checkAllPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
-        checkAllPanel.add(checkAll);
-        checkAllPanel.add(checkAllLabel);
-        JPanel topPanel = new JPanel();
-        topPanel.setLayout(new BorderLayout());
-        topPanel.add(checkAllPanel, BorderLayout.WEST);
-        topPanel.add(ButtonBarFactory.buildRightAlignedBar(reverseAll), BorderLayout.EAST);
-
-        tokens = new JTable();
-        tokens.setRowHeight(25);
-        tokens.setRowMargin(3);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Select Operations", cc.xy(1, 1));
-        builder.add(new JScrollPane(
-                tokens,
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
-                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
-        setLayout(new BorderLayout());
-        add(topPanel, BorderLayout.NORTH);
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public JTable getTokens() {
-        return tokens;
-    }
-
-    public JCheckBox getCheckAll() {
-        return checkAll;
-    }
-    
-    public JButton getReverseAll() {
-        return reverseAll;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
deleted file mode 100644
index 488b1e8..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/MergerTokenTableModel.java
+++ /dev/null
@@ -1,128 +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.db;
-
-import org.apache.cayenne.dbsync.merge.MergeDirection;
-import org.apache.cayenne.dbsync.merge.MergerToken;
-
-import javax.swing.table.AbstractTableModel;
-import java.util.List;
-
-
-public class MergerTokenTableModel extends AbstractTableModel {
-
-    public static final int COL_SELECT = 0;
-    public static final int COL_DIRECTION = 1;
-    public static final int COL_NAME = 2;
-    public static final int COL_VALUE = 3;
-
-    private MergerTokenSelectorController controller;
-
-    private List<MergerToken> tokens;
-
-    public MergerTokenTableModel(MergerTokenSelectorController controller) {
-        this.controller = controller;
-        this.tokens = controller.getSelectableTokens();
-    }
-
-    private MergerTokenSelectorController getController() {
-        return controller;
-    }
-
-    public Class getColumnClass(int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-                return Boolean.class;
-            case COL_DIRECTION:
-                // TODO: correct?
-                return String.class;
-            case COL_NAME:
-            case COL_VALUE:
-                return String.class;
-        }
-
-        return null;
-    }
-
-    public int getColumnCount() {
-        return 4;
-    }
-
-    public String getColumnName(int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-                return "";
-            case COL_NAME:
-                return "Operation";
-            case COL_DIRECTION:
-                return "Direction";
-            case COL_VALUE:
-                return "";
-        }
-
-        return null;
-    }
-
-    public int getRowCount() {
-        return tokens.size();
-    }
-
-    public MergerToken getToken(int rowIndex) {
-        return tokens.get(rowIndex);
-    }
-
-    public Object getValueAt(int rowIndex, int columnIndex) {
-        MergerToken token = getToken(rowIndex);
-        switch (columnIndex) {
-            case COL_SELECT:
-                return Boolean.valueOf(getController().isSelected(token));
-            case COL_NAME:
-                return token.getTokenName();
-            case COL_DIRECTION:
-                return token.getDirection();
-            case COL_VALUE:
-                return token.getTokenValue();
-        }
-        return null;
-    }
-
-    public boolean isCellEditable(int rowIndex, int columnIndex) {
-        switch (columnIndex) {
-            case COL_SELECT:
-            case COL_DIRECTION:
-                return true;
-        }
-        return false;
-    }
-
-    public void setValueAt(Object value, int rowIndex, int columnIndex) {
-        MergerToken token = getToken(rowIndex);
-        switch (columnIndex) {
-            case COL_SELECT:
-                Boolean val = (Boolean) value;
-                getController().select(token, val.booleanValue());
-                break;
-            case COL_DIRECTION:
-                MergeDirection direction = (MergeDirection) value;
-                getController().setDirection(token, direction);
-                break;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
deleted file mode 100644
index 1b271bb..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.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.modeler.dialog.db;
-
-import org.apache.cayenne.configuration.server.DataSourceFactory;
-import org.apache.cayenne.configuration.server.DbAdapterFactory;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.project.ProjectSaver;
-import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
-import org.apache.commons.logging.Log;
-
-import java.io.IOException;
-import java.sql.Connection;
-
-public class ModelerDbImportAction extends DefaultDbImportAction {
-
-    private DataMap targetMap;
-    private DbLoader dbLoader;
-
-    public ModelerDbImportAction(Log logger,
-                                 ProjectSaver projectSaver,
-                                 DataSourceFactory dataSourceFactory,
-                                 DbAdapterFactory adapterFactory,
-                                 MapLoader mapLoader,
-                                 MergerTokenFactoryProvider mergerTokenFactoryProvider,
-                                 DataMap targetMap,
-                                 DbLoader dbLoader
-                                 ) {
-
-        super(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider);
-
-        this.targetMap = targetMap;
-        this.dbLoader = dbLoader;
-    }
-
-    @Override
-    protected DbLoader createDbLoader(DbAdapter adapter,
-                                      Connection connection,
-                                      DbLoaderDelegate dbLoaderDelegate,
-                                      ObjectNameGenerator objectNameGenerator) {
-        return dbLoader;
-    }
-
-    @Override
-    protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
-        return targetMap;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
deleted file mode 100644
index f9690c2..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorController.java
+++ /dev/null
@@ -1,251 +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.db;
-
-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.modeler.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.validation.ProjectValidator;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.swing.TableBindingBuilder;
-import org.apache.cayenne.validation.ValidationFailure;
-import org.apache.cayenne.validation.ValidationResult;
-
-import java.awt.Component;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- */
-public class TableSelectorController extends CayenneController {
-
-    protected TableSelectorView view;
-    protected ObjectBinding tableBinding;
-
-    protected DbEntity table;
-    protected List<DbEntity> tables;
-    protected int permanentlyExcludedCount;
-    protected Map<String, DbEntity> excludedTables;
-    protected List<DbEntity> selectableTablesList;
-
-    protected Map<String, String> validationMessages;
-
-    public TableSelectorController(ProjectController parent) {
-        super(parent);
-        this.view = new TableSelectorView();
-        this.excludedTables = new HashMap<>();
-        this.selectableTablesList = new ArrayList<>();
-        this.validationMessages = new HashMap<>();
-        initController();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    /**
-     * Called by table binding script to set current table.
-     */
-    public void setTable(DbEntity table) {
-        this.table = table;
-    }
-
-    /**
-     * Returns DbEntities that are excluded from DB generation.
-     */
-    public Collection<DbEntity> getExcludedTables() {
-        return excludedTables.values();
-    }
-
-    public List<DbEntity> getTables() {
-        return tables;
-    }
-
-    public boolean isIncluded() {
-        if (table == null) {
-            return false;
-        }
-
-        return !excludedTables.containsKey(table.getName());
-    }
-
-    public void setIncluded(boolean b) {
-        if (table == null) {
-            return;
-        }
-
-        if (b) {
-            excludedTables.remove(table.getName());
-        }
-        else {
-            excludedTables.put(table.getName(), table);
-        }
-
-        tableSelectedAction();
-    }
-
-    /**
-     * A callback action that updates the state of Select All checkbox.
-     */
-    public void tableSelectedAction() {
-        int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
-
-        if (unselectedCount == selectableTablesList.size()) {
-            view.getCheckAll().setSelected(false);
-        }
-        else if (unselectedCount == 0) {
-            view.getCheckAll().setSelected(true);
-        }
-    }
-
-    public Object getProblem() {
-        return (table != null) ? validationMessages.get(table.getName()) : null;
-    }
-
-    // ------ other stuff ------
-
-    protected void initController() {
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
-
-        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
-
-        tableBuilder.addColumn(
-                "",
-                "setTable(#item), included",
-                Boolean.class,
-                true,
-                Boolean.TRUE);
-        tableBuilder.addColumn(
-                "Table",
-                "#item.name",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXX");
-        tableBuilder.addColumn(
-                "Problems",
-                "setTable(#item), problem",
-                String.class,
-                false,
-                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-        this.tableBinding = tableBuilder.bindToTable(view.getTables(), "tables");
-    }
-
-    /**
-     * Performs validation of DbEntities in the current DataMap. Returns a collection of
-     * ValidationInfo objects describing the problems.
-     */
-    public void updateTables(Collection<DataMap> dataMaps) {
-        this.tables = new ArrayList<DbEntity>();
-
-        for (DataMap dataMap : dataMaps) {
-            this.tables.addAll(dataMap.getDbEntities());
-        }
-
-        excludedTables.clear();
-        validationMessages.clear();
-
-        // if there were errors, filter out those related to
-        // non-derived DbEntities...
-
-        // TODO: this is inefficient.. we need targeted validation
-        // instead of doing it on the whole project
-
-        Project project = getApplication().getProject();
-
-        ProjectValidator projectValidator = getApplication().getInjector().getInstance(
-                ProjectValidator.class);
-        ValidationResult validationResult = projectValidator.validate(project
-                .getRootNode());
-
-        if (validationResult.getFailures().size() > 0) {
-
-            for (ValidationFailure nextProblem : validationResult.getFailures()) {
-                DbEntity failedEntity = null;
-
-                if (nextProblem.getSource() instanceof DbAttribute) {
-                    DbAttribute failedAttribute = (DbAttribute) nextProblem.getSource();
-                    failedEntity = (DbEntity) failedAttribute.getEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbRelationship) {
-                    DbRelationship failedRelationship = (DbRelationship) nextProblem
-                            .getSource();
-                    failedEntity = (DbEntity) failedRelationship.getSourceEntity();
-                }
-                else if (nextProblem.getSource() instanceof DbEntity) {
-                    failedEntity = (DbEntity) nextProblem.getSource();
-                }
-
-                if (failedEntity == null) {
-                    continue;
-                }
-
-                excludedTables.put(failedEntity.getName(), failedEntity);
-                validationMessages.put(failedEntity.getName(), nextProblem
-                        .getDescription());
-            }
-        }
-
-        // Find selectable tables
-        permanentlyExcludedCount = excludedTables.size();
-        selectableTablesList.clear();
-        for (DbEntity table : tables) {
-            if (false == excludedTables.containsKey(table.getName())) {
-                selectableTablesList.add(table);
-            }
-        }
-
-        tableBinding.updateView();
-        tableSelectedAction();
-    }
-
-    public void checkAllAction() {
-
-        boolean isCheckAllSelected = view.getCheckAll().isSelected();
-
-        if (isCheckAllSelected) {
-            selectableTablesList.clear();
-            selectableTablesList.addAll(tables);
-            excludedTables.clear();
-        }
-        else {
-            excludedTables.clear();
-            for (DbEntity table : tables) {
-                excludedTables.put(table.getName(), table);
-            }
-            selectableTablesList.clear();
-        }
-
-        tableBinding.updateView();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
deleted file mode 100644
index 80bab48..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/TableSelectorView.java
+++ /dev/null
@@ -1,94 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class TableSelectorView extends JPanel {
-
-    protected JTable tables;
-    protected JCheckBox checkAll;
-    protected JLabel checkAllLabel;
-
-    public TableSelectorView() {
-
-        this.checkAll = new JCheckBox();
-        this.checkAllLabel = new JLabel("Check All Tables");
-
-        checkAll.addItemListener(new ItemListener() {
-
-            public void itemStateChanged(ItemEvent event) {
-                if (checkAll.isSelected()) {
-                    checkAllLabel.setText("Uncheck All Tables");
-                }
-                else {
-                    checkAllLabel.setText("Check All Tables");
-                }
-            }
-        });
-
-        // assemble
-        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
-        topPanel.add(checkAll);
-        topPanel.add(checkAllLabel);
-
-        tables = new JTable();
-        tables.setRowHeight(25);
-        tables.setRowMargin(3);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Select Tables", cc.xy(1, 1));
-        builder.add(new JScrollPane(
-                tables,
-                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
-                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
-
-        setLayout(new BorderLayout());
-        add(topPanel, BorderLayout.NORTH);
-        add(builder.getPanel(), BorderLayout.CENTER);
-    }
-
-    public JTable getTables() {
-        return tables;
-    }
-
-    public JCheckBox getCheckAll() {
-        return checkAll;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
new file mode 100644
index 0000000..441aba7
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptions.java
@@ -0,0 +1,332 @@
+/*****************************************************************
+ *   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.db.gen;
+
+import org.apache.cayenne.access.DbGenerator;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.log.NoopJdbcEventLogger;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.validation.ValidationResult;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ */
+public class DBGeneratorOptions extends CayenneController {
+
+    protected DBGeneratorOptionsView view;
+    protected ObjectBinding[] optionBindings;
+    protected ObjectBinding sqlBinding;
+    protected ObjectBinding adapterBinding;
+
+    protected DBConnectionInfo connectionInfo;
+    protected Collection<DataMap> dataMaps;
+    protected DBGeneratorDefaults generatorDefaults;
+    protected Collection<DbGenerator> generators;
+    protected String textForSQL;
+
+    protected TableSelectorController tables;
+
+    public DBGeneratorOptions(ProjectController parent, String title, Collection<DataMap> dataMaps) {
+        super(parent);
+
+        this.dataMaps = dataMaps;
+        this.tables = new TableSelectorController(parent);
+        this.view = new DBGeneratorOptionsView(tables.getView());
+        this.connectionInfo = new DBConnectionInfo();
+        this.generatorDefaults = new DBGeneratorDefaults(parent
+                .getPreferenceForProject()
+                .node("DbGenerator"));
+
+        this.view.setTitle(title);
+        initController();
+        connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
+
+        tables.updateTables(dataMaps);
+        prepareGenerator();
+        generatorDefaults.configureGenerator(generators);
+        createSQL();
+        refreshView();
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    public DBGeneratorDefaults getGeneratorDefaults() {
+        return generatorDefaults;
+    }
+
+    public String getTextForSQL() {
+        return textForSQL;
+    }
+
+    protected void initController() {
+
+        DefaultComboBoxModel<String> adapterModel = new DefaultComboBoxModel<>(
+                DbAdapterInfo.getStandardAdapters());
+        view.getAdapters().setModel(adapterModel);
+        view.getAdapters().setSelectedIndex(0);
+
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+        adapterBinding = builder.bindToComboSelection(
+                view.getAdapters(),
+                "connectionInfo.dbAdapter",
+                "refreshSQLAction()",
+                "org.apache.cayenne.dba.JdbcAdapter");
+
+        optionBindings = new ObjectBinding[5];
+        optionBindings[0] = builder.bindToStateChangeAndAction(
+                view.getCreateFK(),
+                "generatorDefaults.createFK",
+                "refreshSQLAction()");
+        optionBindings[1] = builder.bindToStateChangeAndAction(
+                view.getCreatePK(),
+                "generatorDefaults.createPK",
+                "refreshSQLAction()");
+        optionBindings[2] = builder.bindToStateChangeAndAction(
+                view.getCreateTables(),
+                "generatorDefaults.createTables",
+                "refreshSQLAction()");
+        optionBindings[3] = builder.bindToStateChangeAndAction(
+                view.getDropPK(),
+                "generatorDefaults.dropPK",
+                "refreshSQLAction()");
+        optionBindings[4] = builder.bindToStateChangeAndAction(
+                view.getDropTables(),
+                "generatorDefaults.dropTables",
+                "refreshSQLAction()");
+
+        builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
+        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+        builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+        // refresh SQL if different tables were selected
+        view.getTabs().addChangeListener(new ChangeListener() {
+
+            public void stateChanged(ChangeEvent e) {
+                if (view.getTabs().getSelectedIndex() == 0) {
+                    // this assumes that some tables where checked/unchecked... not very
+                    // efficient
+                    refreshGeneratorAction();
+                }
+            }
+        });
+    }
+
+    /**
+     * Creates new internal DbGenerator instance.
+     */
+    protected void prepareGenerator() {
+        try {
+            DbAdapter adapter = connectionInfo.makeAdapter(getApplication()
+                    .getClassLoadingService());
+            generators = new ArrayList<>();
+            for (DataMap dataMap : dataMaps) {
+                this.generators.add(new DbGenerator(
+                        adapter,
+                        dataMap,
+                        tables.getExcludedTables(),
+                        null,
+                        NoopJdbcEventLogger.getInstance()));
+            }
+        } catch (Exception ex) {
+            reportError("Error loading adapter", ex);
+        }
+    }
+
+    /**
+     * Returns SQL statements generated for selected schema generation options.
+     */
+    protected void createSQL() {
+        // convert them to string representation for display
+        StringBuilder buf = new StringBuilder();
+        for (DbGenerator generator : generators) {
+            Iterator<String> it = generator.configuredStatements().iterator();
+            String batchTerminator = generator.getAdapter().getBatchTerminator();
+
+            String lineEnd = (batchTerminator != null)
+                    ? "\n" + batchTerminator + "\n\n"
+                    : "\n\n";
+
+            while (it.hasNext()) {
+                buf.append(it.next()).append(lineEnd);
+            }
+        }
+
+        textForSQL = buf.toString();
+    }
+
+    protected void refreshView() {
+        getView().setEnabled(connectionInfo != null);
+
+        for (ObjectBinding optionBinding : optionBindings) {
+            optionBinding.updateView();
+        }
+
+        sqlBinding.updateView();
+    }
+
+    // ===============
+    // Actions
+    // ===============
+
+    /**
+     * Starts options dialog.
+     */
+    public void startupAction() {
+        view.pack();
+        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        view.setModal(true);
+        makeCloseableOnEscape();
+        centerView();
+        view.setVisible(true);
+    }
+
+    public void refreshGeneratorAction() {
+        prepareGenerator();
+        refreshSQLAction();
+    }
+
+    /**
+     * Updates a text area showing generated SQL.
+     */
+    public void refreshSQLAction() {
+        // sync generator with defaults, make SQL, then sync the view...
+        adapterBinding.updateView();
+        connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
+        prepareGenerator();
+        generatorDefaults.configureGenerator(generators);
+        createSQL();
+        sqlBinding.updateView();
+    }
+
+    /**
+     * Performs configured schema operations via DbGenerator.
+     */
+    public void generateSchemaAction() {
+
+        DataSourceWizard connectWizard = new DataSourceWizard(
+                this.getParent(),
+                "Generate DB Schema: Connect to Database");
+        if (!connectWizard.startupAction()) {
+            return;
+        }
+
+        this.connectionInfo = connectWizard.getConnectionInfo();
+
+        refreshGeneratorAction();
+
+        Collection<ValidationResult> failures = new ArrayList<ValidationResult>();
+
+        // sanity check...
+        for (DbGenerator generator : generators) {
+            if (generator.isEmpty(true)) {
+                JOptionPane.showMessageDialog(getView(), "Nothing to generate.");
+                return;
+            }
+
+            try {
+                generator.runGenerator(connectWizard.getDataSource());
+                failures.add(generator.getFailures());
+            } catch (Throwable th) {
+                reportError("Schema Generation Error", th);
+            }
+        }
+
+        if (failures.size() == 0) {
+            JOptionPane.showMessageDialog(getView(), "Schema Generation Complete.");
+        } else {
+            new ValidationResultBrowser(this)
+                    .startupAction(
+                            "Schema Generation Complete",
+                            "Schema generation finished. The following problem(s) were ignored.",
+                            failures);
+        }
+    }
+
+    /**
+     * Allows user to save generated SQL in a file.
+     */
+    public void storeSQLAction() {
+        JFileChooser fc = new JFileChooser();
+        fc.setDialogType(JFileChooser.SAVE_DIALOG);
+        fc.setDialogTitle("Save SQL Script");
+
+        File projectDir = new File(getApplication()
+                .getProject()
+                .getConfigurationResource()
+                .getURL()
+                .getPath());
+        fc.setCurrentDirectory(projectDir);
+        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+            refreshGeneratorAction();
+            try {
+                File file = fc.getSelectedFile();
+                FileWriter fw = new FileWriter(file);
+                PrintWriter pw = new PrintWriter(fw);
+                pw.print(textForSQL);
+                pw.flush();
+                pw.close();
+            } catch (IOException ex) {
+                reportError("Error Saving SQL", ex);
+            }
+        }
+    }
+
+    public void closeAction() {
+        view.dispose();
+    }
+
+    public DBConnectionInfo getConnectionInfo() {
+        return this.connectionInfo;
+    }
+
+    public void setConnectionInfo(DBConnectionInfo connectionInfo) {
+        this.connectionInfo = connectionInfo;
+        refreshView();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
new file mode 100644
index 0000000..724d3f1
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/DBGeneratorOptionsView.java
@@ -0,0 +1,178 @@
+/*****************************************************************
+ *   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.db.gen;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridLayout;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Wizard for generating the database from the data map.
+ */
+public class DBGeneratorOptionsView extends JDialog {
+
+    protected JTextArea sql;
+    protected JButton generateButton;
+    protected JButton cancelButton;
+    protected JButton saveSqlButton;
+    protected JCheckBox dropTables;
+    protected JCheckBox createTables;
+    protected JCheckBox createFK;
+    protected JCheckBox createPK;
+    protected JCheckBox dropPK;
+    protected Component tables;
+    protected JTabbedPane tabs;
+    protected JComboBox<String> adapters;
+
+    public DBGeneratorOptionsView(Component tables) {
+        // create widgets
+        this.generateButton = new JButton("Generate");
+        this.cancelButton = new JButton("Close");
+        this.saveSqlButton = new JButton("Save SQL");
+        this.dropTables = new JCheckBox("Drop Tables");
+        this.createTables = new JCheckBox("Create Tables");
+        this.createFK = new JCheckBox("Create FK Support");
+        this.createPK = new JCheckBox("Create Primary Key Support");
+        this.dropPK = new JCheckBox("Drop Primary Key Support");
+        this.tables = tables;
+        this.tabs = new JTabbedPane(SwingConstants.TOP);
+        this.adapters = new JComboBox<>();
+        adapters.setEditable(true);
+        this.sql = new JTextArea();
+        sql.setEditable(false);
+        sql.setLineWrap(true);
+        sql.setWrapStyleWord(true);
+
+        // assemble...
+        JPanel optionsPane = new JPanel(new GridLayout(3, 2));
+        optionsPane.add(dropTables);
+        optionsPane.add(createTables);
+        optionsPane.add(new JLabel());
+        optionsPane.add(createFK);
+        optionsPane.add(dropPK);
+        optionsPane.add(createPK);
+
+        JPanel sqlTextPanel = new JPanel(new BorderLayout());
+        sqlTextPanel.add(new JScrollPane(
+                sql,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
+        
+        JPanel adapterPanel = new JPanel(new BorderLayout());
+        adapterPanel.add(adapters);
+
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout(
+                "fill:min(50dlu;pref):grow",
+                "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 3dlu, fill:40dlu:grow"));
+        builder.setDefaultDialogBorder();
+        builder.addSeparator("Options", cc.xywh(1, 1, 1, 1));
+        builder.add(optionsPane, cc.xy(1, 3, "left,fill"));
+        builder.addSeparator("Adapter", cc.xywh(1, 5, 1, 1));
+        builder.add(adapterPanel, cc.xy(1, 7));
+        builder.addSeparator("Generated SQL", cc.xywh(1, 9, 1, 1));
+        builder.add(sqlTextPanel, cc.xy(1, 11));
+
+        tabs.addTab("SQL Options", builder.getPanel());
+        tabs.addTab("Tables", new JScrollPane(
+                tables,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+
+        // we need the right preferred size so that dialog "pack()" produces decent
+        // default size...
+        tabs.setPreferredSize(new Dimension(450, 500));
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(saveSqlButton);
+        buttons.add(Box.createHorizontalStrut(20));
+        buttons.add(cancelButton);
+        buttons.add(generateButton);
+
+        Container contentPane = this.getContentPane();
+        contentPane.setLayout(new BorderLayout());
+        contentPane.add(tabs, BorderLayout.CENTER);
+        contentPane.add(buttons, BorderLayout.SOUTH);
+    }
+
+    public JButton getCancelButton() {
+        return cancelButton;
+    }
+
+    public JTabbedPane getTabs() {
+        return tabs;
+    }
+
+    public JCheckBox getCreateFK() {
+        return createFK;
+    }
+
+    public JCheckBox getCreatePK() {
+        return createPK;
+    }
+
+    public JCheckBox getCreateTables() {
+        return createTables;
+    }
+
+    public JCheckBox getDropPK() {
+        return dropPK;
+    }
+
+    public JCheckBox getDropTables() {
+        return dropTables;
+    }
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JButton getSaveSqlButton() {
+        return saveSqlButton;
+    }
+
+    public JTextArea getSql() {
+        return sql;
+    }
+    
+    public JComboBox<String> getAdapters() {
+        return adapters;
+    }
+}


[02/10] cayenne git commit: CAY-2172 Split DB actions to different packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs

Posted by sk...@apache.org.
http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
new file mode 100644
index 0000000..9304e52
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorController.java
@@ -0,0 +1,251 @@
+/*****************************************************************
+ *   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.db.gen;
+
+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.modeler.ProjectController;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.validation.ProjectValidator;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.swing.TableBindingBuilder;
+import org.apache.cayenne.validation.ValidationFailure;
+import org.apache.cayenne.validation.ValidationResult;
+
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ */
+public class TableSelectorController extends CayenneController {
+
+    protected TableSelectorView view;
+    protected ObjectBinding tableBinding;
+
+    protected DbEntity table;
+    protected List<DbEntity> tables;
+    protected int permanentlyExcludedCount;
+    protected Map<String, DbEntity> excludedTables;
+    protected List<DbEntity> selectableTablesList;
+
+    protected Map<String, String> validationMessages;
+
+    public TableSelectorController(ProjectController parent) {
+        super(parent);
+        this.view = new TableSelectorView();
+        this.excludedTables = new HashMap<>();
+        this.selectableTablesList = new ArrayList<>();
+        this.validationMessages = new HashMap<>();
+        initController();
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    /**
+     * Called by table binding script to set current table.
+     */
+    public void setTable(DbEntity table) {
+        this.table = table;
+    }
+
+    /**
+     * Returns DbEntities that are excluded from DB generation.
+     */
+    public Collection<DbEntity> getExcludedTables() {
+        return excludedTables.values();
+    }
+
+    public List<DbEntity> getTables() {
+        return tables;
+    }
+
+    public boolean isIncluded() {
+        if (table == null) {
+            return false;
+        }
+
+        return !excludedTables.containsKey(table.getName());
+    }
+
+    public void setIncluded(boolean b) {
+        if (table == null) {
+            return;
+        }
+
+        if (b) {
+            excludedTables.remove(table.getName());
+        }
+        else {
+            excludedTables.put(table.getName(), table);
+        }
+
+        tableSelectedAction();
+    }
+
+    /**
+     * A callback action that updates the state of Select All checkbox.
+     */
+    public void tableSelectedAction() {
+        int unselectedCount = excludedTables.size() - permanentlyExcludedCount;
+
+        if (unselectedCount == selectableTablesList.size()) {
+            view.getCheckAll().setSelected(false);
+        }
+        else if (unselectedCount == 0) {
+            view.getCheckAll().setSelected(true);
+        }
+    }
+
+    public Object getProblem() {
+        return (table != null) ? validationMessages.get(table.getName()) : null;
+    }
+
+    // ------ other stuff ------
+
+    protected void initController() {
+
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+
+        TableBindingBuilder tableBuilder = new TableBindingBuilder(builder);
+
+        tableBuilder.addColumn(
+                "",
+                "setTable(#item), included",
+                Boolean.class,
+                true,
+                Boolean.TRUE);
+        tableBuilder.addColumn(
+                "Table",
+                "#item.name",
+                String.class,
+                false,
+                "XXXXXXXXXXXXXXXX");
+        tableBuilder.addColumn(
+                "Problems",
+                "setTable(#item), problem",
+                String.class,
+                false,
+                "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
+
+        this.tableBinding = tableBuilder.bindToTable(view.getTables(), "tables");
+    }
+
+    /**
+     * Performs validation of DbEntities in the current DataMap. Returns a collection of
+     * ValidationInfo objects describing the problems.
+     */
+    public void updateTables(Collection<DataMap> dataMaps) {
+        this.tables = new ArrayList<DbEntity>();
+
+        for (DataMap dataMap : dataMaps) {
+            this.tables.addAll(dataMap.getDbEntities());
+        }
+
+        excludedTables.clear();
+        validationMessages.clear();
+
+        // if there were errors, filter out those related to
+        // non-derived DbEntities...
+
+        // TODO: this is inefficient.. we need targeted validation
+        // instead of doing it on the whole project
+
+        Project project = getApplication().getProject();
+
+        ProjectValidator projectValidator = getApplication().getInjector().getInstance(
+                ProjectValidator.class);
+        ValidationResult validationResult = projectValidator.validate(project
+                .getRootNode());
+
+        if (validationResult.getFailures().size() > 0) {
+
+            for (ValidationFailure nextProblem : validationResult.getFailures()) {
+                DbEntity failedEntity = null;
+
+                if (nextProblem.getSource() instanceof DbAttribute) {
+                    DbAttribute failedAttribute = (DbAttribute) nextProblem.getSource();
+                    failedEntity = (DbEntity) failedAttribute.getEntity();
+                }
+                else if (nextProblem.getSource() instanceof DbRelationship) {
+                    DbRelationship failedRelationship = (DbRelationship) nextProblem
+                            .getSource();
+                    failedEntity = (DbEntity) failedRelationship.getSourceEntity();
+                }
+                else if (nextProblem.getSource() instanceof DbEntity) {
+                    failedEntity = (DbEntity) nextProblem.getSource();
+                }
+
+                if (failedEntity == null) {
+                    continue;
+                }
+
+                excludedTables.put(failedEntity.getName(), failedEntity);
+                validationMessages.put(failedEntity.getName(), nextProblem
+                        .getDescription());
+            }
+        }
+
+        // Find selectable tables
+        permanentlyExcludedCount = excludedTables.size();
+        selectableTablesList.clear();
+        for (DbEntity table : tables) {
+            if (false == excludedTables.containsKey(table.getName())) {
+                selectableTablesList.add(table);
+            }
+        }
+
+        tableBinding.updateView();
+        tableSelectedAction();
+    }
+
+    public void checkAllAction() {
+
+        boolean isCheckAllSelected = view.getCheckAll().isSelected();
+
+        if (isCheckAllSelected) {
+            selectableTablesList.clear();
+            selectableTablesList.addAll(tables);
+            excludedTables.clear();
+        }
+        else {
+            excludedTables.clear();
+            for (DbEntity table : tables) {
+                excludedTables.put(table.getName(), table);
+            }
+            selectableTablesList.clear();
+        }
+
+        tableBinding.updateView();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
new file mode 100644
index 0000000..f618e65
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/gen/TableSelectorView.java
@@ -0,0 +1,94 @@
+/*****************************************************************
+ *   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.db.gen;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ */
+public class TableSelectorView extends JPanel {
+
+    protected JTable tables;
+    protected JCheckBox checkAll;
+    protected JLabel checkAllLabel;
+
+    public TableSelectorView() {
+
+        this.checkAll = new JCheckBox();
+        this.checkAllLabel = new JLabel("Check All Tables");
+
+        checkAll.addItemListener(new ItemListener() {
+
+            public void itemStateChanged(ItemEvent event) {
+                if (checkAll.isSelected()) {
+                    checkAllLabel.setText("Uncheck All Tables");
+                }
+                else {
+                    checkAllLabel.setText("Check All Tables");
+                }
+            }
+        });
+
+        // assemble
+        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
+        topPanel.add(checkAll);
+        topPanel.add(checkAllLabel);
+
+        tables = new JTable();
+        tables.setRowHeight(25);
+        tables.setRowMargin(3);
+
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout(
+                "fill:min(50dlu;pref):grow",
+                "p, 3dlu, fill:40dlu:grow"));
+        builder.setDefaultDialogBorder();
+        builder.addSeparator("Select Tables", cc.xy(1, 1));
+        builder.add(new JScrollPane(
+                tables,
+                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
+
+        setLayout(new BorderLayout());
+        add(topPanel, BorderLayout.NORTH);
+        add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    public JTable getTables() {
+        return tables;
+    }
+
+    public JCheckBox getCheckAll() {
+        return checkAll;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
new file mode 100644
index 0000000..2a58363
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportProjectSaver.java
@@ -0,0 +1,74 @@
+/*****************************************************************
+ *   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.db.load;
+
+import org.apache.cayenne.configuration.ConfigurationNameMapper;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.resource.Resource;
+
+public class DbImportProjectSaver implements ProjectSaver {
+
+    private ConfigurationNameMapper nameMapper;
+
+    private ProjectController projectController;
+
+    public DbImportProjectSaver(@Inject ProjectController projectController, @Inject ConfigurationNameMapper nameMapper) {
+        this.projectController = projectController;
+        this.nameMapper = nameMapper;
+    }
+
+    @Override
+    public String getSupportedVersion() {
+        // not important in the context of non-saving saver
+        return "-1";
+    }
+
+    @Override
+    public void save(Project project) {
+
+        DataMap dataMap = (DataMap) project.getRootNode();
+
+        if (projectController.getCurrentDataMap() != null) {
+            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
+            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
+        } else {
+            DataChannelDescriptor currentDomain = (DataChannelDescriptor) projectController.getProject().getRootNode();
+            Resource baseResource = currentDomain.getConfigurationSource();
+            // a new DataMap, so need to set configuration source for it
+            if (baseResource != null) {
+                Resource dataMapResource = baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap));
+                dataMap.setConfigurationSource(dataMapResource);
+            }
+            projectController.addDataMap(Application.getFrame(), dataMap);
+        }
+    }
+
+    @Override
+    public void saveAs(Project project, Resource baseDirectory) {
+        save(project);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
new file mode 100644
index 0000000..6a550a6
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -0,0 +1,176 @@
+/*****************************************************************
+ *   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.db.load;
+
+import java.io.File;
+import java.sql.Connection;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.dbimport.Catalog;
+import org.apache.cayenne.dbimport.ExcludeTable;
+import org.apache.cayenne.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbimport.IncludeTable;
+import org.apache.cayenne.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbimport.Schema;
+import org.apache.cayenne.dbsync.naming.NameBuilder;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
+import org.apache.cayenne.util.Util;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class DbLoaderContext {
+
+    private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
+
+    private DbImportConfiguration config;
+    private Connection connection;
+    private ProjectController projectController;
+    private boolean existingMap;
+    private DataMap dataMap;
+    private boolean stopping;
+    private String loadStatusNote;
+
+    public DbLoaderContext() {
+    }
+
+    DataMap getDataMap() {
+        return dataMap;
+    }
+
+    boolean isExistingDataMap() {
+        return existingMap;
+    }
+
+    public void setProjectController(ProjectController projectController) {
+        this.projectController = projectController;
+    }
+
+    ProjectController getProjectController() {
+        return projectController;
+    }
+
+    void setConfig(DbImportConfiguration config) {
+        this.config = config;
+    }
+
+    DbImportConfiguration getConfig() {
+        return config;
+    }
+
+    public void setConnection(Connection connection) {
+        this.connection = connection;
+    }
+
+    public Connection getConnection() {
+        return connection;
+    }
+
+    public boolean isStopping() {
+        return stopping;
+    }
+
+    void setStopping(boolean stopping) {
+        this.stopping = stopping;
+    }
+
+    String getStatusNote() {
+        return loadStatusNote;
+    }
+
+    void setStatusNote(String loadStatusNote) {
+        this.loadStatusNote = loadStatusNote;
+    }
+
+    public boolean buildConfig(DataSourceWizard connectionWizard, DbLoaderOptionsDialog dialog) {
+        if (dialog == null || connectionWizard == null) {
+            return false;
+        }
+
+        // Build filters
+        ReverseEngineering reverseEngineering = new ReverseEngineering();
+        reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
+        reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
+        reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
+        reverseEngineering.addExcludeTable(new ExcludeTable("auto_pk_support|AUTO_PK_SUPPORT"));
+        reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
+        FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
+
+        DbImportConfiguration config = new DbImportConfiguration() {
+            @Override
+            public DbLoaderDelegate createLoaderDelegate() {
+                return new LoaderDelegate(DbLoaderContext.this);
+            }
+        };
+
+        // Build config
+        DBConnectionInfo connectionInfo = connectionWizard.getConnectionInfo();
+        config.setAdapter(connectionWizard.getAdapter().getClass().getName());
+        config.setUsername(connectionInfo.getUserName());
+        config.setPassword(connectionInfo.getPassword());
+        config.setDriver(connectionInfo.getJdbcDriver());
+        config.setUrl(connectionInfo.getUrl());
+        config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
+        config.setMeaningfulPkTables(dialog.getMeaningfulPk());
+        config.setNamingStrategy(dialog.getNamingStrategy());
+        setConfig(config);
+
+        prepareDataMap();
+
+        return true;
+    }
+
+    private void prepareDataMap() {
+        dataMap = getProjectController().getCurrentDataMap();
+        existingMap = dataMap != null;
+
+        if (!existingMap) {
+            ConfigurationNode root = getProjectController().getProject().getRootNode();
+            dataMap = new DataMap();
+            dataMap.setName(NameBuilder.builder(dataMap, root).name());
+        }
+        if (dataMap.getConfigurationSource() != null) {
+            getConfig().setTargetDataMap(new File(dataMap.getConfigurationSource().getURL().getPath()));
+        }
+    }
+
+    public void processWarn(final Throwable th, final String message) {
+        LOGGER.warn(message, Util.unwindException(th));
+    }
+
+    public void processException(final Throwable th, final String message) {
+        LOGGER.info("Exception on reverse engineering", Util.unwindException(th));
+        SwingUtilities.invokeLater(new Runnable() {
+
+            public void run() {
+                JOptionPane.showMessageDialog(Application.getFrame(), th.getMessage(), message,
+                        JOptionPane.ERROR_MESSAGE);
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
new file mode 100644
index 0000000..1ccc7aa
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderOptionsDialog.java
@@ -0,0 +1,247 @@
+/*****************************************************************
+ *   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.db.load;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+import java.util.Vector;
+
+/**
+ * Dialog for selecting database reverse-engineering parameters.
+ */
+public class DbLoaderOptionsDialog extends CayenneDialog {
+
+    public static final String WILDCARD_PATTERN = ".*";
+
+    public static final int CANCEL = 0;
+    public static final int SELECT = 1;
+
+    protected JLabel catalogLabel;
+    protected JComboBox<String> catalogSelector;
+    protected JLabel schemaLabel;
+    protected JComboBox<String> schemaSelector;
+    protected JTextField tableNamePatternField;
+    protected JTextField meaningfulPk;
+    protected JTextField procNamePatternField;
+    protected JLabel procedureLabel;
+    protected JButton selectButton;
+    protected JButton cancelButton;
+
+
+    protected JComboBox<String> strategyCombo;
+    protected String strategy;
+    protected int choice;
+
+    /**
+     * Creates and initializes new ChooseSchemaDialog.
+     */
+    public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
+                                 String dbCatalog) {
+        super(Application.getFrame(), "Reengineer DB Schema: Select Options");
+
+        init();
+        initController();
+        initFromModel(schemas, catalogs, currentSchema, dbCatalog);
+
+        pack();
+        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+        setModal(true);
+        centerWindow();
+    }
+
+    /** Sets up the graphical components. */
+    protected void init() {
+
+        // create widgets...
+        selectButton = new JButton("Continue");
+        cancelButton = new JButton("Cancel");
+        catalogSelector = new JComboBox<>();
+        schemaSelector = new JComboBox<>();
+        tableNamePatternField = new JTextField();
+        tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
+                "Default expression <b>.*</b> includes all tables.</html>");
+        procNamePatternField = new JTextField();
+        procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
+                "Default expression .* includes all stored procedures.</html>");
+        meaningfulPk = new JTextField();
+        meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
+                "Multiple expressions divided by comma can be used.<br>" +
+                "Example: <b>^table1,^table2,^prefix.*</b></html>");
+        strategyCombo = new JComboBox<>();
+        strategyCombo.setEditable(true);
+
+        // assemble
+        FormLayout layout = new FormLayout(
+                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+                "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        catalogLabel = builder.append("Select Catalog:", catalogSelector);
+        schemaLabel = builder.append("Select Schema:", schemaSelector);
+        builder.append("Table Name Pattern:", tableNamePatternField);
+        procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
+        builder.append("Naming Strategy:", strategyCombo);
+        builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(cancelButton);
+        buttons.add(selectButton);
+
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+        getContentPane().add(buttons, BorderLayout.SOUTH);
+    }
+
+    protected void initController() {
+        selectButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processSelect();
+            }
+        });
+        cancelButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processCancel();
+            }
+        });
+    }
+
+    protected void initFromModel(
+            Collection<String> schemas,
+            Collection<String> catalogs,
+            String currentSchema,
+            String currentCatalog) {
+
+        this.choice = CANCEL;
+        this.tableNamePatternField.setText(WILDCARD_PATTERN);
+        this.procNamePatternField.setText(WILDCARD_PATTERN);
+
+        Vector<String> arr = NameGeneratorPreferences
+                .getInstance()
+                .getLastUsedStrategies();
+        strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
+
+        boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
+        schemaSelector.setVisible(showSchemaSelector);
+        schemaLabel.setVisible(showSchemaSelector);
+
+        if (showSchemaSelector) {
+
+            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+
+            if (currentSchema != null) {
+                for (String schema : schemas) {
+                    if (currentSchema.equalsIgnoreCase(schema)) {
+                        schemaSelector.setSelectedItem(schema);
+                        break;
+                    }
+                }
+            }
+        }
+
+        boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
+        catalogSelector.setVisible(showCatalogSelector);
+        catalogLabel.setVisible(showCatalogSelector);
+
+        if (showCatalogSelector) {
+            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+
+            if (currentCatalog != null && !currentCatalog.isEmpty()) {
+                for (String catalog : catalogs) {
+                    if (currentCatalog.equalsIgnoreCase(catalog)) {
+                        catalogSelector.setSelectedItem(catalog);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public int getChoice() {
+        return choice;
+    }
+
+    private void processSelect() {
+        strategy = (String) strategyCombo.getSelectedItem();
+
+        choice = SELECT;
+        setVisible(false);
+    }
+
+    private void processCancel() {
+        choice = CANCEL;
+        setVisible(false);
+    }
+
+    /**
+     * Returns selected catalog.
+     */
+    public String getSelectedCatalog() {
+        String catalog = (String) catalogSelector.getSelectedItem();
+        return "".equals(catalog) ? null : catalog;
+    }
+
+    /**
+     * Returns selected schema.
+     */
+    public String getSelectedSchema() {
+        String schema = (String) schemaSelector.getSelectedItem();
+        return "".equals(schema) ? null : schema;
+    }
+
+    /**
+     * Returns the tableNamePattern.
+     */
+    public String getTableNamePattern() {
+        return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
+                .getText();
+    }
+
+    public String getMeaningfulPk() {
+        return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
+                .getText();
+    }
+
+    /**
+     * Returns the procedure name pattern.
+     */
+    public String getProcedureNamePattern() {
+        return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
+                .getText();
+    }
+
+    /**
+     * Returns configured naming strategy
+     */
+    public String getNamingStrategy() {
+        return strategy;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
new file mode 100644
index 0000000..ceb0d44
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoadDataMapTask.java
@@ -0,0 +1,94 @@
+/*****************************************************************
+ *   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.db.load;
+
+import javax.swing.JFrame;
+
+import org.apache.cayenne.dbsync.DbSyncModule;
+import org.apache.cayenne.di.DIBootstrap;
+import org.apache.cayenne.di.Injector;
+import org.apache.cayenne.modeler.util.LongRunningTask;
+import org.apache.cayenne.modeler.util.ProjectUtil;
+import org.apache.cayenne.tools.configuration.ToolsModule;
+import org.apache.cayenne.tools.dbimport.DbImportAction;
+import org.apache.cayenne.tools.dbimport.DbImportModule;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+final public class LoadDataMapTask extends LongRunningTask {
+
+    private static Log LOGGER = LogFactory.getLog(DbLoaderContext.class);
+
+    private DbLoaderContext context;
+
+    public LoadDataMapTask(JFrame frame, String title, DbLoaderContext context) {
+        super(frame, title);
+        setMinValue(0);
+        setMaxValue(10);
+        this.context = context;
+    }
+
+    @Override
+    protected void execute() {
+        context.setStatusNote("Preparing...");
+        try {
+            createAction().execute(context.getConfig());
+        } catch (Exception e) {
+            context.processException(e, "Error importing database schema.");
+        }
+        ProjectUtil.cleanObjMappings(context.getDataMap());
+    }
+
+    private DbImportAction createAction() {
+        Injector injector = DIBootstrap.createInjector(new DbSyncModule(),
+                new ToolsModule(LOGGER),
+                new DbImportModule(),
+                new ModelerSyncModule(context));
+        return injector.getInstance(DbImportAction.class);
+    }
+
+    @Override
+    protected String getCurrentNote() {
+        return context.getStatusNote();
+    }
+
+    @Override
+    protected int getCurrentValue() {
+        return getMinValue();
+    }
+
+    @Override
+    protected boolean isIndeterminate() {
+        return true;
+    }
+
+    @Override
+    public boolean isCanceled() {
+        return context.isStopping();
+    }
+
+    @Override
+    public void setCanceled(boolean canceled) {
+        if (canceled) {
+            context.setStatusNote("Canceling..");
+        }
+        context.setStopping(canceled);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.java
new file mode 100644
index 0000000..92043fc
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/LoaderDelegate.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.dialog.db.load;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.event.EntityEvent;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+
+final class LoaderDelegate extends DefaultDbLoaderDelegate {
+
+    private DbLoaderContext context;
+
+    LoaderDelegate(DbLoaderContext dbLoaderContext) {
+        this.context = dbLoaderContext;
+    }
+
+    @Override
+    public void dbEntityAdded(DbEntity entity) {
+        checkCanceled();
+        context.setStatusNote("Importing table '" + entity.getName() + "'...");
+    }
+
+    @Override
+    public void dbEntityRemoved(DbEntity entity) {
+        checkCanceled();
+        if (context.isExistingDataMap()) {
+            context.getProjectController().fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
+        }
+    }
+
+    @Override
+    public boolean dbRelationship(DbEntity entity) {
+        checkCanceled();
+        context.setStatusNote("Load relationships for '" + entity.getName() + "'...");
+        return true;
+    }
+
+    @Override
+    public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
+        checkCanceled();
+        context.setStatusNote("Load relationship: '" + entity.getName() + "'; '" + relationship.getName() + "'...");
+        return true;
+    }
+
+    private void checkCanceled() {
+        if (context.isStopping()) {
+            throw new CayenneRuntimeException("Reengineering was canceled.");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/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
new file mode 100644
index 0000000..34ad1b5
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerDbImportAction.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.dialog.db.load;
+
+import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
+import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
+import org.apache.commons.logging.Log;
+
+import java.io.IOException;
+
+public class ModelerDbImportAction extends DefaultDbImportAction {
+
+    @Inject
+    private DataMap targetMap;
+
+    public ModelerDbImportAction(@Inject Log logger,
+                                 @Inject ProjectSaver projectSaver,
+                                 @Inject DataSourceFactory dataSourceFactory,
+                                 @Inject DbAdapterFactory adapterFactory,
+                                 @Inject MapLoader mapLoader,
+                                 @Inject MergerTokenFactoryProvider mergerTokenFactoryProvider
+                                 ) {
+        super(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider);
+    }
+
+    @Override
+    protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
+        return targetMap;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
new file mode 100644
index 0000000..24fdfcf
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/ModelerSyncModule.java
@@ -0,0 +1,44 @@
+/*****************************************************************
+ *   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.db.load;
+
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.tools.dbimport.DbImportAction;
+
+class ModelerSyncModule implements Module {
+
+    private DbLoaderContext dbLoaderContext;
+
+    ModelerSyncModule(DbLoaderContext dbLoaderHelper) {
+        this.dbLoaderContext = dbLoaderHelper;
+    }
+
+    @Override
+    public void configure(Binder binder) {
+        binder.bind(ProjectController.class).toInstance(dbLoaderContext.getProjectController());
+        binder.bind(ProjectSaver.class).to(DbImportProjectSaver.class);
+        binder.bind(DbImportAction.class).to(ModelerDbImportAction.class);
+        binder.bind(DataMap.class).toInstance(dbLoaderContext.getDataMap());
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
new file mode 100644
index 0000000..b3fb929
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/DbMigrateOptionsDialog.java
@@ -0,0 +1,176 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Collection;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneDialog;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+
+public class DbMigrateOptionsDialog extends CayenneDialog {
+	private static final long serialVersionUID = 1L;
+	public static final int CANCEL = 0;
+    public static final int SELECT = 1;
+
+	protected JLabel schemaLabel;
+	protected JLabel catalogLabel;
+    protected JComboBox<String> catalogSelector;
+    protected JComboBox<String> schemaSelector;
+    protected JButton selectButton;
+    protected JButton cancelButton;
+    protected int choice;
+    
+    public DbMigrateOptionsDialog(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
+        super(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema");
+        init();
+        initController();
+        initFromModel(catalogs, schemas, dbUserName);
+
+        pack();
+        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+        setModal(true);
+        centerWindow();    	
+    }
+    
+    protected void init() {
+        selectButton = new JButton("Continue");
+        cancelButton = new JButton("Cancel");
+        catalogSelector = new JComboBox<>();
+        schemaSelector = new JComboBox<>();
+        FormLayout layout = new FormLayout(
+                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
+                "");
+        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+        builder.setDefaultDialogBorder();
+
+        catalogLabel = builder.append("Select Catalog:", catalogSelector, true);
+        schemaLabel = builder.append("Select Schema:", schemaSelector);
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(selectButton);
+        buttons.add(cancelButton);
+        
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
+        getContentPane().add(buttons, BorderLayout.SOUTH);        
+    }
+    
+    protected void initController() {
+        selectButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processSelect();
+            }
+        });
+
+        cancelButton.addActionListener(new ActionListener() {
+
+            public void actionPerformed(ActionEvent e) {
+                processCancel();
+            }
+        });
+    }
+    
+    private void processSelect() {
+        choice = SELECT;
+        setVisible(false);
+    }
+
+    private void processCancel() {
+    	schemaSelector.setSelectedItem(null);
+        choice = CANCEL;
+        setVisible(false);
+    }
+    
+    protected void initFromModel(Collection<String> catalogs, Collection<String> schemas, String dbUserName) {
+
+        this.choice = CANCEL;
+
+        if(!schemas.isEmpty()) {
+            schemaLabel.setVisible(true);
+            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
+            schemaSelector.setVisible(true);
+        } else {
+            schemaLabel.setVisible(false);
+            schemaSelector.setVisible(false);
+        }
+
+        if(!catalogs.isEmpty()) {
+            catalogLabel.setVisible(true);
+            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
+            catalogSelector.setVisible(true);
+        } else {
+            catalogLabel.setVisible(false);
+            catalogSelector.setVisible(false);
+        }
+
+        if (dbUserName == null) {
+            return;
+        }
+
+        // select schema belonging to the user
+        for (String schema : schemas) {
+            if (dbUserName.equalsIgnoreCase(schema)) {
+                schemaSelector.setSelectedItem(schema);
+                break;
+            }
+        }
+
+        for(String catalog : catalogs) {
+            if(dbUserName.equalsIgnoreCase(catalog)) {
+                catalogSelector.setSelectedItem(catalog);
+                break;
+            }
+        }
+    }
+    
+    /**
+     * Returns selected schema.
+     */
+    public String getSelectedSchema() {
+    	return (String) schemaSelector.getSelectedItem();
+    }
+
+    public String getSelectedCatalog() {
+        return (String) catalogSelector.getSelectedItem();
+    }
+    
+    public int getChoice() {
+    	return choice;
+    }
+    
+    public void showDialog() {
+    	setVisible(true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
new file mode 100644
index 0000000..a914cf1
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
@@ -0,0 +1,395 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
+import org.apache.cayenne.dbsync.merge.DbMerger;
+import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerContext;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
+import org.apache.cayenne.dbsync.naming.NoStemStemmer;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
+import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
+import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
+import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
+import org.apache.cayenne.validation.ValidationResult;
+import org.apache.commons.logging.LogFactory;
+
+import javax.sql.DataSource;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.Component;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class MergerOptions extends CayenneController {
+
+    protected MergerOptionsView view;
+    protected ObjectBinding sqlBinding;
+
+    protected DBConnectionInfo connectionInfo;
+    protected DataMap dataMap;
+    protected DbAdapter adapter;
+    protected String textForSQL;
+
+    protected MergerTokenSelectorController tokens;
+    protected String defaultCatalog;
+    protected String defaultSchema;
+    private MergerTokenFactoryProvider mergerTokenFactoryProvider;
+
+    public MergerOptions(ProjectController parent,
+                         String title,
+                         DBConnectionInfo connectionInfo,
+                         DataMap dataMap,
+                         String defaultCatalog,
+                         String defaultSchema,
+                         MergerTokenFactoryProvider mergerTokenFactoryProvider) {
+        super(parent);
+
+        this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
+        this.dataMap = dataMap;
+        this.tokens = new MergerTokenSelectorController(parent);
+        this.view = new MergerOptionsView(tokens.getView());
+        this.connectionInfo = connectionInfo;
+        this.defaultCatalog = defaultCatalog;
+        this.defaultSchema = defaultSchema;
+        this.view.setTitle(title);
+        initController();
+
+        prepareMigrator();
+        createSQL();
+        refreshView();
+    }
+
+    public Component getView() {
+        return view;
+    }
+
+    public String getTextForSQL() {
+        return textForSQL;
+    }
+
+    protected void initController() {
+
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
+
+        builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
+        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
+        builder.bindToAction(view.getCancelButton(), "closeAction()");
+
+        // refresh SQL if different tables were selected
+        view.getTabs().addChangeListener(new ChangeListener() {
+
+            public void stateChanged(ChangeEvent e) {
+                if (view.getTabs().getSelectedIndex() == 1) {
+                    // this assumes that some tables where checked/unchecked... not very
+                    // efficient
+                    refreshGeneratorAction();
+                }
+            }
+        });
+    }
+
+    /**
+     * check database and create the {@link List} of {@link MergerToken}s
+     */
+    protected void prepareMigrator() {
+        try {
+            adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
+
+            MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
+            tokens.setMergerTokenFactory(mergerTokenFactory);
+
+
+            FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
+                    PatternFilter.INCLUDE_NOTHING);
+
+            DbMerger merger = DbMerger.builder(mergerTokenFactory)
+                    .filters(filters)
+                    .build();
+
+            DbLoaderConfiguration config = new DbLoaderConfiguration();
+            config.setFiltersConfig(filters);
+
+            DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
+
+            DataMap dbImport = new DataMap();
+            try (Connection conn = dataSource.getConnection();) {
+                new DbLoader(conn,
+                        adapter,
+                        new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
+                        new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
+                        .load(dbImport, config);
+
+            } catch (SQLException e) {
+                throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
+            }
+
+            tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
+        } catch (Exception ex) {
+            reportError("Error loading adapter", ex);
+        }
+    }
+
+    /**
+     * Returns SQL statements generated for selected schema generation options.
+     */
+    protected void createSQL() {
+        // convert them to string representation for display
+        StringBuilder buf = new StringBuilder();
+
+        Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
+        String batchTerminator = adapter.getBatchTerminator();
+
+        String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
+        while (it.hasNext()) {
+            MergerToken token = it.next();
+
+            if (token instanceof AbstractToDbToken) {
+                AbstractToDbToken tdb = (AbstractToDbToken) token;
+                for (String sql : tdb.createSql(adapter)) {
+                    buf.append(sql);
+                    buf.append(lineEnd);
+                }
+            }
+        }
+
+        textForSQL = buf.toString();
+    }
+
+    protected void refreshView() {
+        sqlBinding.updateView();
+    }
+
+    // ===============
+    // Actions
+    // ===============
+
+    /**
+     * Starts options dialog.
+     */
+    public void startupAction() {
+        view.pack();
+        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        view.setModal(true);
+        makeCloseableOnEscape();
+        centerView();
+        view.setVisible(true);
+    }
+
+    public void refreshGeneratorAction() {
+        refreshSQLAction();
+    }
+
+    /**
+     * Updates a text area showing generated SQL.
+     */
+    public void refreshSQLAction() {
+        createSQL();
+        sqlBinding.updateView();
+    }
+
+    /**
+     * Performs configured schema operations via DbGenerator.
+     */
+    public void generateSchemaAction() {
+        refreshGeneratorAction();
+
+        // sanity check...
+        List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
+        if (tokensToMigrate.isEmpty()) {
+            JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
+            return;
+        }
+
+        DataSource dataSource;
+        try {
+            dataSource = connectionInfo.makeDataSource(getApplication()
+                    .getClassLoadingService());
+        } catch (SQLException ex) {
+            reportError("Migration Error", ex);
+            return;
+        }
+
+        final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
+
+        MergerContext mergerContext = MergerContext.builder(dataMap)
+                .syntheticDataNode(dataSource, adapter)
+                .delegate(createDelegate(loadedObjEntities))
+                .build();
+
+        boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
+
+        DefaultDbImportAction.flattenManyToManyRelationships(
+                dataMap,
+                loadedObjEntities,
+                mergerContext.getNameGenerator());
+
+        notifyProjectModified(modelChanged);
+
+        reportFailures(mergerContext);
+    }
+
+    private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
+        return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
+            @Override
+            public void objEntityAdded(ObjEntity ent) {
+                loadedObjEntities.add(ent);
+                super.objEntityAdded(ent);
+            }
+        };
+    }
+
+    private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
+        boolean modelChanged = false;
+
+        try {
+            for (MergerToken tok : tokensToMigrate) {
+                int numOfFailuresBefore = getFailuresCount(mergerContext);
+
+                tok.execute(mergerContext);
+
+                if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
+                    modelChanged = true;
+                }
+                if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
+                    // looks like the token executed without failures
+                    tokens.removeToken(tok);
+                }
+            }
+        } catch (Throwable th) {
+            reportError("Migration Error", th);
+        }
+
+        return modelChanged;
+    }
+
+    private int getFailuresCount(MergerContext mergerContext) {
+        return mergerContext.getValidationResult().getFailures().size();
+    }
+
+    private void reportFailures(MergerContext mergerContext) {
+        ValidationResult failures = mergerContext.getValidationResult();
+        if (failures == null || !failures.hasFailures()) {
+            JOptionPane.showMessageDialog(getView(), "Migration Complete.");
+        } else {
+            new ValidationResultBrowser(this).startupAction(
+                    "Migration Complete",
+                    "Migration finished. The following problem(s) were ignored.",
+                    failures);
+        }
+    }
+
+    private void notifyProjectModified(boolean modelChanged) {
+        if(!modelChanged) {
+            return;
+        }
+
+        // mark the model as unsaved
+        Project project = getApplication().getProject();
+        project.setModified(true);
+
+        ProjectController projectController = getProjectController();
+        projectController.setDirty(true);
+
+        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+                dataMap, MapEvent.REMOVE));
+        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
+                dataMap, MapEvent.ADD));
+    }
+
+    /**
+     * Allows user to save generated SQL in a file.
+     */
+    public void storeSQLAction() {
+        JFileChooser fc = new JFileChooser();
+        fc.setDialogType(JFileChooser.SAVE_DIALOG);
+        fc.setDialogTitle("Save SQL Script");
+
+        Resource projectDir = getApplication().getProject().getConfigurationResource();
+
+        if (projectDir != null) {
+            fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
+        }
+
+        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
+            refreshGeneratorAction();
+
+            try {
+                File file = fc.getSelectedFile();
+                FileWriter fw = new FileWriter(file);
+                PrintWriter pw = new PrintWriter(fw);
+                pw.print(textForSQL);
+                pw.flush();
+                pw.close();
+            } catch (IOException ex) {
+                reportError("Error Saving SQL", ex);
+            }
+        }
+    }
+
+    private ProjectController getProjectController() {
+        return getApplication().getFrameController().getProjectController();
+    }
+
+    public void closeAction() {
+        view.dispose();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
new file mode 100644
index 0000000..ba68857
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptionsView.java
@@ -0,0 +1,134 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+
+import org.apache.cayenne.modeler.Application;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Wizard for altering the database to match the data map.
+ */
+public class MergerOptionsView extends JDialog {
+
+    protected JTextArea sql;
+    protected JButton generateButton;
+    protected JButton cancelButton;
+    protected JButton saveSqlButton;
+
+    protected Component tables;
+    protected JTabbedPane tabs;
+
+    public MergerOptionsView(Component tables) {
+        super(Application.getFrame());
+        
+        // create widgets
+        this.generateButton = new JButton("Migrate");
+        this.cancelButton = new JButton("Close");
+        this.saveSqlButton = new JButton("Save SQL");
+
+        this.tables = tables;
+        this.tabs = new JTabbedPane(SwingConstants.TOP);
+        this.sql = new JTextArea();
+        sql.setEditable(false);
+        sql.setLineWrap(true);
+        sql.setWrapStyleWord(true);
+
+        JPanel sqlTextPanel = new JPanel(new BorderLayout());
+        sqlTextPanel.add(new JScrollPane(
+                sql,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
+
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout(
+                "fill:min(50dlu;pref):grow",
+                "p, 9dlu, p, 3dlu, fill:40dlu:grow"));
+        builder.setDefaultDialogBorder();
+        builder.addSeparator("Generated SQL", cc.xywh(1, 3, 1, 1));
+        builder.add(sqlTextPanel, cc.xy(1, 5));
+
+        tabs.addTab("Operations", new JScrollPane(
+                tables,
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
+        tabs.addTab("Generated SQL", builder.getPanel());
+
+        // we need the right preferred size so that dialog "pack()" produces decent
+        // default size...
+        tabs.setPreferredSize(new Dimension(600, 350));
+
+        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
+        buttons.add(saveSqlButton);
+        buttons.add(Box.createHorizontalStrut(20));
+        buttons.add(cancelButton);
+        buttons.add(generateButton);
+
+        Container contentPane = this.getContentPane();
+        contentPane.setLayout(new BorderLayout());
+        contentPane.add(tabs, BorderLayout.CENTER);
+        contentPane.add(buttons, BorderLayout.SOUTH);
+    }
+
+    public JButton getCancelButton() {
+        return cancelButton;
+    }
+
+    public JTabbedPane getTabs() {
+        return tabs;
+    }
+
+    /*
+     * public JCheckBox getCreateFK() { return createFK; } public JCheckBox getCreatePK() {
+     * return createPK; } public JCheckBox getCreateTables() { return createTables; }
+     * public JCheckBox getDropPK() { return dropPK; } public JCheckBox getDropTables() {
+     * return dropTables; }
+     */
+
+    public JButton getGenerateButton() {
+        return generateButton;
+    }
+
+    public JButton getSaveSqlButton() {
+        return saveSqlButton;
+    }
+
+    public JTextArea getSql() {
+        return sql;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
new file mode 100644
index 0000000..52d6ce3
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
@@ -0,0 +1,240 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import org.apache.cayenne.dbsync.merge.MergeDirection;
+import org.apache.cayenne.dbsync.merge.MergerToken;
+import org.apache.cayenne.dbsync.merge.TokenComparator;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.swing.BindingBuilder;
+import org.apache.cayenne.swing.ObjectBinding;
+
+import javax.swing.*;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class MergerTokenSelectorController extends CayenneController {
+
+    protected MergerTokenSelectorView view;
+    protected ObjectBinding tableBinding;
+
+    protected MergerToken token;
+    protected int permanentlyExcludedCount;
+    protected Set<MergerToken> excludedTokens;
+    protected List<MergerToken> selectableTokensList;
+    protected MergerTokenFactory mergerTokenFactory;
+
+    public MergerTokenSelectorController(CayenneController parent) {
+        super(parent);
+        this.view = new MergerTokenSelectorView();
+        this.excludedTokens = new HashSet<MergerToken>();
+        this.selectableTokensList = new ArrayList<MergerToken>();
+        initController();
+    }
+
+    public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
+        this.mergerTokenFactory = mergerTokenFactory;
+    }
+
+    public void setTokens(List<MergerToken> tokens) {
+        selectableTokensList.clear();
+        selectableTokensList.addAll(tokens);
+        excludedTokens.addAll(tokens);
+    }
+
+    public List<MergerToken> getSelectedTokens() {
+        List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
+        t.removeAll(excludedTokens);
+        return Collections.unmodifiableList(t);
+    }
+
+    public List<MergerToken> getSelectableTokens() {
+        return Collections.unmodifiableList(selectableTokensList);
+    }
+    
+    public void removeToken(MergerToken token) {
+        selectableTokensList.remove(token);
+        excludedTokens.remove(token);
+
+        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+        model.fireTableDataChanged();
+    }
+
+    // ----- properties -----
+
+    public Component getView() {
+        return view;
+    }
+
+    /**
+     * Called by table binding script to set current token.
+     */
+    public void setToken(MergerToken token) {
+        this.token = token;
+    }
+
+    /**
+     * Returns {@link MergerToken}s that are excluded from DB generation.
+     */
+    /*
+     * public Collection getExcludedTokens() { return excludedTokens; }
+     */
+
+    public boolean isIncluded() {
+        if (token == null) {
+            return false;
+        }
+
+        return !excludedTokens.contains(token);
+    }
+
+    public void setIncluded(boolean b) {
+        if (token == null) {
+            return;
+        }
+
+        if (b) {
+            excludedTokens.remove(token);
+        }
+        else {
+            excludedTokens.add(token);
+        }
+
+        tableSelectedAction();
+    }
+
+    /**
+     * A callback action that updates the state of Select All checkbox.
+     */
+    public void tableSelectedAction() {
+        int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
+
+        if (unselectedCount == selectableTokensList.size()) {
+            view.getCheckAll().setSelected(false);
+        }
+        else if (unselectedCount == 0) {
+            view.getCheckAll().setSelected(true);
+        }
+    }
+
+    // ------ other stuff ------
+
+    protected void initController() {
+        BindingBuilder builder = new BindingBuilder(
+                getApplication().getBindingFactory(),
+                this);
+
+        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
+        builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
+
+        TableModel model = new MergerTokenTableModel(this);
+
+        MergeDirection[] dirs = new MergeDirection[] {
+                MergeDirection.TO_DB, MergeDirection.TO_MODEL
+        };
+
+        view.getTokens().setModel(model);
+
+        TableColumnModel columnModel = view.getTokens().getColumnModel();
+        
+        // dropdown for direction column
+        JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
+        directionCombo.setEditable(false);
+        TableColumn directionColumn = columnModel.getColumn(
+                MergerTokenTableModel.COL_DIRECTION);
+        directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
+
+        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
+        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
+        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
+        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
+    }
+
+    public boolean isSelected(MergerToken token) {
+        return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
+    }
+
+    public void select(MergerToken token, boolean select) {
+        if (select) {
+            excludedTokens.remove(token);
+        }
+        else {
+            excludedTokens.add(token);
+        }
+    }
+
+    public void setDirection(MergerToken token, MergeDirection direction) {
+        if (token.getDirection().equals(direction)) {
+            return;
+        }
+        int i = selectableTokensList.indexOf(token);
+        MergerToken reverse = token.createReverse(mergerTokenFactory);
+        selectableTokensList.set(i, reverse);
+        if (excludedTokens.remove(token)) {
+            excludedTokens.add(reverse);
+        }
+        
+        /**
+         * Repaint, so that "Operation" column updates properly
+         */
+        view.getTokens().repaint();
+    }
+
+    public void checkAllAction() {
+
+        boolean isCheckAllSelected = view.getCheckAll().isSelected();
+
+        if (isCheckAllSelected) {
+            excludedTokens.clear();
+        }
+        else {
+            excludedTokens.addAll(selectableTokensList);
+        }
+
+        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+        model.fireTableDataChanged();
+    }
+
+    public void reverseAllAction() {
+        
+        for (int i = 0; i < selectableTokensList.size(); i++) {
+            MergerToken token = selectableTokensList.get(i);
+            MergerToken reverse = token.createReverse(mergerTokenFactory);
+            selectableTokensList.set(i, reverse);
+            if (excludedTokens.remove(token)) {
+                excludedTokens.add(reverse);
+            }
+        }
+
+        Collections.sort(selectableTokensList, new TokenComparator());
+        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
+        model.fireTableDataChanged();
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
new file mode 100644
index 0000000..263fb7c
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorView.java
@@ -0,0 +1,106 @@
+/*****************************************************************
+ *   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.db.merge;
+
+import java.awt.BorderLayout;
+import java.awt.FlowLayout;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.factories.ButtonBarFactory;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ */
+public class MergerTokenSelectorView extends JPanel {
+
+    protected JTable tokens;
+    protected JCheckBox checkAll;
+    protected JLabel checkAllLabel;
+    protected JButton reverseAll;
+
+    public MergerTokenSelectorView() {
+
+        this.checkAll = new JCheckBox();
+        this.checkAllLabel = new JLabel("Check All Operations");
+        this.reverseAll = new JButton("Reverse All Operations");
+
+        checkAll.addItemListener(new ItemListener() {
+
+            public void itemStateChanged(ItemEvent event) {
+                if (checkAll.isSelected()) {
+                    checkAllLabel.setText("Uncheck All Operations");
+                }
+                else {
+                    checkAllLabel.setText("Check All Operations");
+                }
+            }
+        });
+
+        // assemble
+        JPanel checkAllPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
+        checkAllPanel.add(checkAll);
+        checkAllPanel.add(checkAllLabel);
+        JPanel topPanel = new JPanel();
+        topPanel.setLayout(new BorderLayout());
+        topPanel.add(checkAllPanel, BorderLayout.WEST);
+        topPanel.add(ButtonBarFactory.buildRightAlignedBar(reverseAll), BorderLayout.EAST);
+
+        tokens = new JTable();
+        tokens.setRowHeight(25);
+        tokens.setRowMargin(3);
+
+        CellConstraints cc = new CellConstraints();
+        PanelBuilder builder = new PanelBuilder(new FormLayout(
+                "fill:min(50dlu;pref):grow",
+                "p, 3dlu, fill:40dlu:grow"));
+        builder.setDefaultDialogBorder();
+        builder.addSeparator("Select Operations", cc.xy(1, 1));
+        builder.add(new JScrollPane(
+                tokens,
+                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER), cc.xy(1, 3));
+
+        setLayout(new BorderLayout());
+        add(topPanel, BorderLayout.NORTH);
+        add(builder.getPanel(), BorderLayout.CENTER);
+    }
+
+    public JTable getTokens() {
+        return tokens;
+    }
+
+    public JCheckBox getCheckAll() {
+        return checkAll;
+    }
+    
+    public JButton getReverseAll() {
+        return reverseAll;
+    }
+}


[04/10] cayenne git commit: CAY-2172 Split DB actions to different packages Clean up ReverseEngineeringAction Clean up DataSource select dialogs

Posted by sk...@apache.org.
CAY-2172
Split DB actions to different packages
Clean up ReverseEngineeringAction
Clean up DataSource select dialogs


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

Branch: refs/heads/master
Commit: 7da0e8975da0eb266962ade0162f245b5dbc4978
Parents: 43b3080
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Dec 13 18:15:02 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Dec 13 18:15:02 2016 +0300

----------------------------------------------------------------------
 .../cayenne/modeler/action/DBWizardAction.java  |  95 +----
 .../modeler/action/GenerateDBAction.java        |   8 +-
 .../cayenne/modeler/action/MigrateAction.java   |  42 +-
 .../action/ReverseEngineeringAction.java        | 123 ++++--
 .../modeler/dialog/db/ConnectionWizard.java     |  87 ----
 .../modeler/dialog/db/DBGeneratorOptions.java   | 345 ----------------
 .../dialog/db/DBGeneratorOptionsView.java       | 178 --------
 .../modeler/dialog/db/DataSourceController.java | 219 ----------
 .../modeler/dialog/db/DataSourceView.java       | 100 -----
 .../modeler/dialog/db/DataSourceWizard.java     |  80 ++--
 .../modeler/dialog/db/DbLoaderHelper.java       | 401 -------------------
 .../dialog/db/DbLoaderOptionsDialog.java        | 247 ------------
 .../dialog/db/DbMigrateOptionsDialog.java       | 175 --------
 .../modeler/dialog/db/MergerOptions.java        | 395 ------------------
 .../modeler/dialog/db/MergerOptionsView.java    | 134 -------
 .../db/MergerTokenSelectorController.java       | 239 -----------
 .../dialog/db/MergerTokenSelectorView.java      | 106 -----
 .../dialog/db/MergerTokenTableModel.java        | 128 ------
 .../dialog/db/ModelerDbImportAction.java        |  71 ----
 .../dialog/db/TableSelectorController.java      | 251 ------------
 .../modeler/dialog/db/TableSelectorView.java    |  94 -----
 .../dialog/db/gen/DBGeneratorOptions.java       | 332 +++++++++++++++
 .../dialog/db/gen/DBGeneratorOptionsView.java   | 178 ++++++++
 .../dialog/db/gen/TableSelectorController.java  | 251 ++++++++++++
 .../dialog/db/gen/TableSelectorView.java        |  94 +++++
 .../dialog/db/load/DbImportProjectSaver.java    |  74 ++++
 .../modeler/dialog/db/load/DbLoaderContext.java | 176 ++++++++
 .../dialog/db/load/DbLoaderOptionsDialog.java   | 247 ++++++++++++
 .../modeler/dialog/db/load/LoadDataMapTask.java |  94 +++++
 .../modeler/dialog/db/load/LoaderDelegate.java  |  71 ++++
 .../dialog/db/load/ModelerDbImportAction.java   |  53 +++
 .../dialog/db/load/ModelerSyncModule.java       |  44 ++
 .../dialog/db/merge/DbMigrateOptionsDialog.java | 176 ++++++++
 .../modeler/dialog/db/merge/MergerOptions.java  | 395 ++++++++++++++++++
 .../dialog/db/merge/MergerOptionsView.java      | 134 +++++++
 .../db/merge/MergerTokenSelectorController.java | 240 +++++++++++
 .../db/merge/MergerTokenSelectorView.java       | 106 +++++
 .../dialog/db/merge/MergerTokenTableModel.java  | 129 ++++++
 .../cayenne/modeler/util/DbAdapterInfo.java     |   2 +-
 39 files changed, 2936 insertions(+), 3378 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index 1d2b32f..a3e652a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -19,16 +19,8 @@
 
 package org.apache.cayenne.modeler.action;
 
-import java.util.Collection;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory;
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DataNodeDefaults;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
 /**
@@ -39,88 +31,13 @@ public abstract class DBWizardAction extends CayenneAction {
         super(name, application);
     }
 
-    // ==== Guessing user preferences... *****
-
-    protected DataNodeDescriptor getPreferredNode() {
-        ProjectController projectController = getProjectController();
-        DataNodeDescriptor node = projectController.getCurrentDataNode();
-
-        // try a node that belongs to the current DataMap ...
-        if (node == null) {
-            DataMap map = projectController.getCurrentDataMap();
-            if (map != null) {
-                Collection<DataNodeDescriptor> nodes = ((DataChannelDescriptor) projectController
-                        .getProject()
-                        .getRootNode()).getNodeDescriptors();
-                for (DataNodeDescriptor n : nodes) {
-                    if (n.getDataMapNames().contains(map.getName())) {
-                        node = n;
-                        break;
-                    }
-                }
-            }
-        }
-
-        return node;
-    }
-
-    protected String preferredDataSourceLabel(DBConnectionInfo nodeInfo) {
-        if (nodeInfo == null) {
-
-            // only driver nodes have meaningful connection info set
-            DataNodeDescriptor node = getPreferredNode();
-            return (node != null && XMLPoolingDataSourceFactory.class.getName().equals(
-                    node.getDataSourceFactoryType())) ? "DataNode Connection Info" : null;
-        }
-
-        return nodeInfo.getNodeName();
-    }
-
-    /**
-     * Determines the most reasonable default DataSource choice.
-     */
-    protected DBConnectionInfo preferredDataSource() {
-        DataNodeDescriptor node = getPreferredNode();
-
-        // no current node...
-        if (node == null) {
-            return null;
-        }
-
-        // if node has local DS set, use it
-        DataNodeDefaults nodeDefaults = (DataNodeDefaults) getApplication()
-                .getCayenneProjectPreferences()
-                .getProjectDetailObject(
-                        DataNodeDefaults.class,
-                        getProjectController().getPreferenceForDataDomain().node(
-                                "DataNode").node(node.getName()));
-
-        String key = (nodeDefaults != null) ? nodeDefaults.getLocalDataSource() : null;
-        if (key != null) {
-            DBConnectionInfo info = (DBConnectionInfo) getApplication()
-                    .getCayenneProjectPreferences()
-                    .getDetailObject(DBConnectionInfo.class)
-                    .getObject(key);
-
-            if (info != null) {
-                return info;
-            }
-        }
-
-        // extract data from the node
-        if (!XMLPoolingDataSourceFactory.class.getName().equals(
-                node.getDataSourceFactoryType())) {
+    protected DataSourceWizard dataSourceWizardDialog(String title) {
+        // connect
+        DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), title);
+        if (!connectWizard.startupAction()) {
             return null;
         }
 
-        // create transient object..
-        DBConnectionInfo nodeInfo = new DBConnectionInfo();
-
-        nodeInfo.copyFrom(node.getDataSourceDescriptor());
-
-        nodeInfo.setDbAdapter(node.getAdapterType());
-
-        return nodeInfo;
+        return connectWizard;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
index 0173304..1cf6301 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
@@ -22,7 +22,7 @@ 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.db.DBGeneratorOptions;
+import org.apache.cayenne.modeler.dialog.db.gen.DBGeneratorOptions;
 import org.apache.cayenne.project.Project;
 
 import java.awt.event.ActionEvent;
@@ -48,13 +48,13 @@ public class GenerateDBAction extends DBWizardAction {
         DataMap dataMap = getProjectController().getCurrentDataMap();
 
         if (dataMap != null) {
-            dataMaps = new ArrayList<DataMap>();
+            dataMaps = new ArrayList<>();
             dataMaps.add(dataMap);
-            new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps).startupAction();
         } else {
             Project project = getProjectController().getProject();
             dataMaps = ((DataChannelDescriptor) project.getRootNode()).getDataMaps();
-            new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps).startupAction();
         }
+        new DBGeneratorOptions(getProjectController(), "Generate DB Schema: Options", dataMaps)
+                .startupAction();
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 00e27bf..29cd6a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -19,18 +19,16 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DataSourceController;
-import org.apache.cayenne.modeler.dialog.db.DbMigrateOptionsDialog;
-import org.apache.cayenne.modeler.dialog.db.MergerOptions;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
 
 import javax.sql.DataSource;
-import javax.swing.*;
+import javax.swing.JOptionPane;
 import java.awt.event.ActionEvent;
 import java.util.Collections;
 import java.util.List;
@@ -50,27 +48,16 @@ public class MigrateAction extends DBWizardAction {
 
     public void performAction(ActionEvent e) {
 
-        DBConnectionInfo nodeInfo = preferredDataSource();
-        String nodeKey = preferredDataSourceLabel(nodeInfo);
-
-        DataSourceController connectWizard = new DataSourceController(
-                getProjectController(),
-                "Migrate DB Schema: Connect to Database",
-                nodeKey,
-                nodeInfo);
-
-        if (!connectWizard.startupAction()) {
-            // canceled
+        DataSourceWizard connectWizard = dataSourceWizardDialog("Migrate DB Schema: Connect to Database");
+        if(connectWizard == null) {
             return;
         }
 
         DataMap map = getProjectController().getCurrentDataMap();
-        //migarte options
-
-        // sanity check
         if (map == null) {
             throw new IllegalStateException("No current DataMap selected.");
         }
+
         //showOptions dialog
         String selectedSchema = null;
         String selectedCatalog = null;
@@ -107,22 +94,17 @@ public class MigrateAction extends DBWizardAction {
     }
 
     @SuppressWarnings("unchecked")
-    private List<String> getCatalogs(DataSourceController connectWizard) throws Exception {
-        DbAdapter adapter = connectWizard.getConnectionInfo()
-                .makeAdapter(getApplication().getClassLoadingService());
-        if(!adapter.supportsCatalogsOnReverseEngineering()) {
+    private List<String> getCatalogs(DataSourceWizard connectWizard) throws Exception {
+        if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
             return (List<String>)Collections.EMPTY_LIST;
         }
 
-        DataSource dataSource = connectWizard.getConnectionInfo()
-                .makeDataSource(getApplication().getClassLoadingService());
+        DataSource dataSource = connectWizard.getDataSource();
         return DbLoader.loadCatalogs(dataSource.getConnection());
     }
 
-    private List<String> getSchemas(DataSourceController connectWizard) throws Exception {
-        DataSource dataSource = connectWizard.getConnectionInfo()
-                .makeDataSource(getApplication().getClassLoadingService());
-
+    private List<String> getSchemas(DataSourceWizard connectWizard) throws Exception {
+        DataSource dataSource = connectWizard.getDataSource();
         return DbLoader.loadSchemas(dataSource.getConnection());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index 183b00b..8088639 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,22 +19,25 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.ConnectionWizard;
-import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.dialog.db.load.DbLoaderContext;
+import org.apache.cayenne.modeler.dialog.db.load.DbLoaderOptionsDialog;
+import org.apache.cayenne.modeler.dialog.db.load.LoadDataMapTask;
 
-import javax.swing.*;
 import java.awt.event.ActionEvent;
-import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.SwingUtilities;
 
 /**
  * Action that imports database structure into a DataMap.
  */
 public class ReverseEngineeringAction extends DBWizardAction {
 
-    public ReverseEngineeringAction(Application application) {
+    ReverseEngineeringAction(Application application) {
         super(getActionName(), application);
     }
 
@@ -47,49 +50,89 @@ public class ReverseEngineeringAction extends DBWizardAction {
      */
     @Override
     public void performAction(ActionEvent event) {
-        // guess node connection
-        DBConnectionInfo nodeInfo = preferredDataSource();
-        String nodeKey = preferredDataSourceLabel(nodeInfo);
-
-        // connect
-        ConnectionWizard connectWizard = new ConnectionWizard(
-                getProjectController(),
-                "Reengineer DB Schema: Connect to Database",
-                nodeKey,
-                nodeInfo);
-
-        if (!connectWizard.startupAction()) {
-            // canceled
+        final DbLoaderContext context = new DbLoaderContext();
+        final DataSourceWizard connectWizard = dataSourceWizardDialog("Reengineer DB Schema: Connect to Database");
+        if(connectWizard == null) {
             return;
         }
 
-        // TODO: doesn't look like we are closing this connection anywhere...
-        Connection connection = connectWizard.getConnection();
-        DbAdapter adapter = connectWizard.getAdapter();
-        DBConnectionInfo dataSourceInfo = connectWizard.getConnectionInfo();
+        context.setProjectController(getProjectController());
+        try {
+            context.setConnection(connectWizard.getDataSource().getConnection());
+        } catch (SQLException ex) {
+            return;
+        }
 
-        // from here pass control to DbLoaderHelper, running it from a thread separate
-        // from EventDispatch
+        final DbLoaderOptionsDialog loaderOptionsDialog = loaderOptionDialog(connectWizard, context);
+        if(!context.buildConfig(connectWizard, loaderOptionsDialog)) {
+            return;
+        }
 
-        final DbLoaderHelper helper = new DbLoaderHelper(
-                getProjectController(),
-                connection,
-                adapter,
-                dataSourceInfo);
-        Thread th = new Thread(new Runnable() {
+        runLoaderInThread(context, new Runnable() {
+            @Override
+            public void run() {
+                application.getUndoManager().discardAllEdits();
+                try {
+                    context.getConnection().close();
+                } catch (SQLException ignored) {
+                }
+            }
+        });
+    }
 
+    private void runLoaderInThread(final DbLoaderContext context,
+                                   final Runnable callback) {
+        Thread th = new Thread(new Runnable() {
             public void run() {
-                helper.execute();
+                LoadDataMapTask task = new LoadDataMapTask(Application.getFrame(), "Reengineering DB", context);
+                task.startAndWait();
+                SwingUtilities.invokeLater(callback);
+            }
+        });
+        th.start();
+    }
 
-                SwingUtilities.invokeLater(new Runnable() {
+    private DbLoaderOptionsDialog loaderOptionDialog(DataSourceWizard connectWizard, DbLoaderContext context) {
+        if(connectWizard == null) {
+            return null;
+        }
 
-                    public void run() {
-                        application.getUndoManager().discardAllEdits();
-                    }
-                });
+        List<String> catalogs = Collections.emptyList();
+        List<String> schemas = Collections.emptyList();
+        try {
+            schemas = DbLoader.loadSchemas(context.getConnection());
+            if (connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) {
+                catalogs = DbLoader.loadCatalogs(context.getConnection());
             }
-        });
+        } catch (SQLException ex) {
+            context.processWarn(ex, "Error Loading catalogs and schemas");
+        }
 
-        th.start();
+        if (context.isStopping()) {
+            return null;
+        }
+
+        // use this catalog as the default...
+        String currentCatalog = null;
+        String currentSchema = null;
+        try {
+            currentCatalog = context.getConnection().getCatalog();
+            currentSchema = context.getConnection().getSchema();
+        } catch (SQLException e) {
+            context.processWarn(e, "Error getting catalog or schema");
+        }
+
+        final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
+                schemas, catalogs,
+                currentSchema, currentCatalog
+        );
+        dialog.setVisible(true);
+        dialog.dispose();
+
+        if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
+            return null;
+        }
+
+        return dialog;
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
deleted file mode 100644
index 45a8bca..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
+++ /dev/null
@@ -1,87 +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.db;
-
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.modeler.ClassLoadingService;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-
-import java.sql.Connection;
-
-/**
- * A component for choosing a DataSource. Users can choose from the DataSources configured
- * in preferences, and one extra set of connection settings. This object will create and
- * keep open a JDBC connection. It is caller responsibility to dispose of it properly.
- * 
- */
-// TODO: after refactoring DbLoader to accept a DataSource instead of connection this
-// dialog should be merged with superclass - DataSourceWizard.
-public class ConnectionWizard extends DataSourceWizard {
-    protected Connection connection;
-    protected DbAdapter adapter;
-    
-    public ConnectionWizard(CayenneController parent, String title,
-                            String altDataSourceKey, DBConnectionInfo altDataSource) {
-        super(parent, title, altDataSourceKey, altDataSource);
-    }
-
-    /**
-     * Overrides superclass to keep an open connection around for the caller's use.
-     */
-    public void okAction() {
-        // build connection and adapter...
-
-        DBConnectionInfo info = getConnectionInfo();
-        ClassLoadingService classLoader = getApplication().getClassLoadingService();
-
-        try {
-            this.adapter = info.makeAdapter(classLoader);
-        }
-        catch (Throwable th) {
-            reportError("DbAdapter Error", th);
-            return;
-        }
-
-        try {
-            this.connection = info.makeDataSource(classLoader).getConnection();
-        }
-        catch (Throwable th) {
-            reportError("Connection Error", th);
-            return;
-        }
-
-        onClose(false);
-    }
-
-    /**
-     * Returns configured DB connection.
-     */
-    public Connection getConnection() {
-        return connection;
-    }
-
-    /**
-     * Returns configured DbAdapter.
-     */
-    public DbAdapter getAdapter() {
-        return adapter;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
deleted file mode 100644
index 1747c87..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptions.java
+++ /dev/null
@@ -1,345 +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.db;
-
-import org.apache.cayenne.access.DbGenerator;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.log.NoopJdbcEventLogger;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DBGeneratorDefaults;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.DbAdapterInfo;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-import org.apache.cayenne.validation.ValidationResult;
-
-import javax.sql.DataSource;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.Component;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-/**
- */
-public class DBGeneratorOptions extends CayenneController {
-
-    protected DBGeneratorOptionsView view;
-    protected ObjectBinding[] optionBindings;
-    protected ObjectBinding sqlBinding;
-    protected ObjectBinding adapterBinding;
-
-    protected DBConnectionInfo connectionInfo;
-    protected Collection<DataMap> dataMaps;
-    protected DBGeneratorDefaults generatorDefaults;
-    protected Collection<DbGenerator> generators;
-    protected String textForSQL;
-
-    protected TableSelectorController tables;
-
-    public DBGeneratorOptions(ProjectController parent, String title, Collection<DataMap> dataMaps) {
-        super(parent);
-
-        this.dataMaps = dataMaps;
-        this.tables = new TableSelectorController(parent);
-        this.view = new DBGeneratorOptionsView(tables.getView());
-        this.connectionInfo = new DBConnectionInfo();
-        this.generatorDefaults = new DBGeneratorDefaults(parent
-                .getPreferenceForProject()
-                .node("DbGenerator"));
-
-        this.view.setTitle(title);
-        initController();
-        connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
-
-        tables.updateTables(dataMaps);
-        prepareGenerator();
-        generatorDefaults.configureGenerator(generators);
-        createSQL();
-        refreshView();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    public DBGeneratorDefaults getGeneratorDefaults() {
-        return generatorDefaults;
-    }
-
-    public String getTextForSQL() {
-        return textForSQL;
-    }
-
-    protected void initController() {
-
-        DefaultComboBoxModel adapterModel = new DefaultComboBoxModel(
-                DbAdapterInfo.getStandardAdapters());
-        view.getAdapters().setModel(adapterModel);
-        view.getAdapters().setSelectedIndex(0);
-
-        BindingBuilder builder = new BindingBuilder(
-                getApplication().getBindingFactory(),
-                this);
-
-        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
-        adapterBinding = builder.bindToComboSelection(
-                view.getAdapters(),
-                "connectionInfo.dbAdapter",
-                "refreshSQLAction()",
-                "org.apache.cayenne.dba.JdbcAdapter");
-
-        optionBindings = new ObjectBinding[5];
-        optionBindings[0] = builder.bindToStateChangeAndAction(
-                view.getCreateFK(),
-                "generatorDefaults.createFK",
-                "refreshSQLAction()");
-        optionBindings[1] = builder.bindToStateChangeAndAction(
-                view.getCreatePK(),
-                "generatorDefaults.createPK",
-                "refreshSQLAction()");
-        optionBindings[2] = builder.bindToStateChangeAndAction(
-                view.getCreateTables(),
-                "generatorDefaults.createTables",
-                "refreshSQLAction()");
-        optionBindings[3] = builder.bindToStateChangeAndAction(
-                view.getDropPK(),
-                "generatorDefaults.dropPK",
-                "refreshSQLAction()");
-        optionBindings[4] = builder.bindToStateChangeAndAction(
-                view.getDropTables(),
-                "generatorDefaults.dropTables",
-                "refreshSQLAction()");
-
-        builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
-        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
-        builder.bindToAction(view.getCancelButton(), "closeAction()");
-
-        // refresh SQL if different tables were selected
-        view.getTabs().addChangeListener(new ChangeListener() {
-
-            public void stateChanged(ChangeEvent e) {
-                if (view.getTabs().getSelectedIndex() == 0) {
-                    // this assumes that some tables where checked/unchecked... not very
-                    // efficient
-                    refreshGeneratorAction();
-                }
-            }
-        });
-    }
-
-    /**
-     * Creates new internal DbGenerator instance.
-     */
-    protected void prepareGenerator() {
-        try {
-            DbAdapter adapter = connectionInfo.makeAdapter(getApplication()
-                    .getClassLoadingService());
-            generators = new ArrayList<DbGenerator>();
-            for (DataMap dataMap : dataMaps) {
-                this.generators.add(new DbGenerator(
-                        adapter,
-                        dataMap,
-                        tables.getExcludedTables(),
-                        null,
-                        NoopJdbcEventLogger.getInstance()));
-            }
-        } catch (Exception ex) {
-            reportError("Error loading adapter", ex);
-        }
-    }
-
-    /**
-     * Returns SQL statements generated for selected schema generation options.
-     */
-    protected void createSQL() {
-        // convert them to string representation for display
-        StringBuffer buf = new StringBuffer();
-        for (DbGenerator generator : generators) {
-            Iterator<String> it = generator.configuredStatements().iterator();
-            String batchTerminator = generator.getAdapter().getBatchTerminator();
-
-            String lineEnd = (batchTerminator != null)
-                    ? "\n" + batchTerminator + "\n\n"
-                    : "\n\n";
-
-            while (it.hasNext()) {
-                buf.append(it.next()).append(lineEnd);
-            }
-        }
-
-        textForSQL = buf.toString();
-    }
-
-    protected void refreshView() {
-        getView().setEnabled(connectionInfo != null);
-
-        for (ObjectBinding optionBinding : optionBindings) {
-            optionBinding.updateView();
-        }
-
-        sqlBinding.updateView();
-    }
-
-    // ===============
-    // Actions
-    // ===============
-
-    /**
-     * Starts options dialog.
-     */
-    public void startupAction() {
-        view.pack();
-        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        view.setModal(true);
-        makeCloseableOnEscape();
-        centerView();
-        view.setVisible(true);
-    }
-
-    public void refreshGeneratorAction() {
-        prepareGenerator();
-        refreshSQLAction();
-    }
-
-    /**
-     * Updates a text area showing generated SQL.
-     */
-    public void refreshSQLAction() {
-        // sync generator with defaults, make SQL, then sync the view...
-        adapterBinding.updateView();
-        connectionInfo.setDbAdapter((String) view.getAdapters().getSelectedItem());
-        prepareGenerator();
-        generatorDefaults.configureGenerator(generators);
-        createSQL();
-        sqlBinding.updateView();
-    }
-
-    /**
-     * Performs configured schema operations via DbGenerator.
-     */
-    public void generateSchemaAction() {
-
-        DataSourceController connectWizard = new DataSourceController(
-                this.getParent(),
-                "Generate DB Schema: Connect to Database",
-                null,
-                null);
-
-        if (!connectWizard.startupAction()) {
-            // canceled
-            return;
-        }
-
-        this.connectionInfo = connectWizard.getConnectionInfo();
-
-        refreshGeneratorAction();
-
-        Collection<ValidationResult> failures = new ArrayList<ValidationResult>();
-
-        // sanity check...
-        for (DbGenerator generator : generators) {
-            if (generator.isEmpty(true)) {
-                JOptionPane.showMessageDialog(getView(), "Nothing to generate.");
-                return;
-            }
-
-            try {
-
-                DataSource dataSource = connectionInfo.makeDataSource(getApplication()
-                        .getClassLoadingService());
-                generator.runGenerator(dataSource);
-                failures.add(generator.getFailures());
-            } catch (Throwable th) {
-                reportError("Schema Generation Error", th);
-            }
-        }
-
-        if (failures.size() == 0) {
-            JOptionPane.showMessageDialog(getView(), "Schema Generation Complete.");
-        } else {
-            new ValidationResultBrowser(this)
-                    .startupAction(
-                            "Schema Generation Complete",
-                            "Schema generation finished. The following problem(s) were ignored.",
-                            failures);
-        }
-    }
-
-    /**
-     * Allows user to save generated SQL in a file.
-     */
-    public void storeSQLAction() {
-        JFileChooser fc = new JFileChooser();
-        fc.setDialogType(JFileChooser.SAVE_DIALOG);
-        fc.setDialogTitle("Save SQL Script");
-
-        File projectDir = new File(getApplication()
-                .getProject()
-                .getConfigurationResource()
-                .getURL()
-                .getPath());
-
-        if (projectDir != null) {
-            fc.setCurrentDirectory(projectDir);
-        }
-
-        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
-            refreshGeneratorAction();
-
-            try {
-                File file = fc.getSelectedFile();
-                FileWriter fw = new FileWriter(file);
-                PrintWriter pw = new PrintWriter(fw);
-                pw.print(textForSQL);
-                pw.flush();
-                pw.close();
-            }
-            catch (IOException ex) {
-                reportError("Error Saving SQL", ex);
-            }
-        }
-    }
-
-    public void closeAction() {
-        view.dispose();
-    }
-
-    public DBConnectionInfo getConnectionInfo() {
-        return this.connectionInfo;
-    }
-
-    public void setConnectionInfo(DBConnectionInfo connectionInfo) {
-        this.connectionInfo = connectionInfo;
-        refreshView();
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
deleted file mode 100644
index 0c54f9e..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DBGeneratorOptionsView.java
+++ /dev/null
@@ -1,178 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.JTextArea;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingConstants;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * Wizard for generating the database from the data map.
- */
-public class DBGeneratorOptionsView extends JDialog {
-
-    protected JTextArea sql;
-    protected JButton generateButton;
-    protected JButton cancelButton;
-    protected JButton saveSqlButton;
-    protected JCheckBox dropTables;
-    protected JCheckBox createTables;
-    protected JCheckBox createFK;
-    protected JCheckBox createPK;
-    protected JCheckBox dropPK;
-    protected Component tables;
-    protected JTabbedPane tabs;
-    protected JComboBox adapters;
-
-    public DBGeneratorOptionsView(Component tables) {
-        // create widgets
-        this.generateButton = new JButton("Generate");
-        this.cancelButton = new JButton("Close");
-        this.saveSqlButton = new JButton("Save SQL");
-        this.dropTables = new JCheckBox("Drop Tables");
-        this.createTables = new JCheckBox("Create Tables");
-        this.createFK = new JCheckBox("Create FK Support");
-        this.createPK = new JCheckBox("Create Primary Key Support");
-        this.dropPK = new JCheckBox("Drop Primary Key Support");
-        this.tables = tables;
-        this.tabs = new JTabbedPane(SwingConstants.TOP);
-        this.adapters = new JComboBox();
-        adapters.setEditable(true);
-        this.sql = new JTextArea();
-        sql.setEditable(false);
-        sql.setLineWrap(true);
-        sql.setWrapStyleWord(true);
-
-        // assemble...
-        JPanel optionsPane = new JPanel(new GridLayout(3, 2));
-        optionsPane.add(dropTables);
-        optionsPane.add(createTables);
-        optionsPane.add(new JLabel());
-        optionsPane.add(createFK);
-        optionsPane.add(dropPK);
-        optionsPane.add(createPK);
-
-        JPanel sqlTextPanel = new JPanel(new BorderLayout());
-        sqlTextPanel.add(new JScrollPane(
-                sql,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER);
-        
-        JPanel adapterPanel = new JPanel(new BorderLayout());
-        adapterPanel.add(adapters);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "fill:min(50dlu;pref):grow",
-                "p, 3dlu, p, 9dlu, p, 3dlu, p, 3dlu, p, 3dlu, fill:40dlu:grow"));
-        builder.setDefaultDialogBorder();
-        builder.addSeparator("Options", cc.xywh(1, 1, 1, 1));
-        builder.add(optionsPane, cc.xy(1, 3, "left,fill"));
-        builder.addSeparator("Adapter", cc.xywh(1, 5, 1, 1));
-        builder.add(adapterPanel, cc.xy(1, 7));
-        builder.addSeparator("Generated SQL", cc.xywh(1, 9, 1, 1));
-        builder.add(sqlTextPanel, cc.xy(1, 11));
-
-        tabs.addTab("SQL Options", builder.getPanel());
-        tabs.addTab("Tables", new JScrollPane(
-                tables,
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED));
-
-        // we need the right preferred size so that dialog "pack()" produces decent
-        // default size...
-        tabs.setPreferredSize(new Dimension(450, 500));
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(saveSqlButton);
-        buttons.add(Box.createHorizontalStrut(20));
-        buttons.add(cancelButton);
-        buttons.add(generateButton);
-
-        Container contentPane = this.getContentPane();
-        contentPane.setLayout(new BorderLayout());
-        contentPane.add(tabs, BorderLayout.CENTER);
-        contentPane.add(buttons, BorderLayout.SOUTH);
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-
-    public JTabbedPane getTabs() {
-        return tabs;
-    }
-
-    public JCheckBox getCreateFK() {
-        return createFK;
-    }
-
-    public JCheckBox getCreatePK() {
-        return createPK;
-    }
-
-    public JCheckBox getCreateTables() {
-        return createTables;
-    }
-
-    public JCheckBox getDropPK() {
-        return dropPK;
-    }
-
-    public JCheckBox getDropTables() {
-        return dropTables;
-    }
-
-    public JButton getGenerateButton() {
-        return generateButton;
-    }
-
-    public JButton getSaveSqlButton() {
-        return saveSqlButton;
-    }
-
-    public JTextArea getSql() {
-        return sql;
-    }
-    
-    public JComboBox getAdapters() {
-        return adapters;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
deleted file mode 100644
index 2ba7819..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
+++ /dev/null
@@ -1,219 +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.db;
-
-import java.awt.Component;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.apache.cayenne.modeler.ClassLoadingService;
-import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.swing.BindingBuilder;
-import org.apache.cayenne.swing.ObjectBinding;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.WindowConstants;
-
-public class DataSourceController extends CayenneController {
-
-    protected DataSourceView view;
-
-    protected DBConnectionInfo altDataSource;
-    protected String altDataSourceKey;
-    protected ObjectBinding dataSourceBinding;
-    protected Map dataSources;
-
-    protected String dataSourceKey;
-
-    // this object is a clone of an object selected from the dropdown, as we
-    // need to allow
-    // local temporary modifications
-    protected DBConnectionInfo connectionInfo;
-
-    protected boolean canceled;
-
-    public DataSourceController(CayenneController parent, String title, String altDataSourceKey,
-                                DBConnectionInfo altDataSource) {
-        super(parent);
-
-        this.view = createView();
-        this.view.setTitle(title);
-        this.altDataSource = altDataSource;
-        this.altDataSourceKey = altDataSourceKey;
-        this.connectionInfo = new DBConnectionInfo();
-
-        initBindings();
-    }
-
-    /**
-     * Creates swing dialog for this wizard
-     */
-    protected DataSourceView createView() {
-        return new DataSourceView(this);
-    }
-
-    protected void initBindings() {
-        BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), this);
-
-        dataSourceBinding = builder.bindToComboSelection(view.getDataSources(), "dataSourceKey");
-
-        builder.bindToAction(view.getCancelButton(), "cancelAction()");
-        builder.bindToAction(view.getOkButton(), "okAction()");
-        builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
-    }
-
-    public String getDataSourceKey() {
-        return dataSourceKey;
-    }
-
-    public void setDataSourceKey(String dataSourceKey) {
-        this.dataSourceKey = dataSourceKey;
-
-        // update a clone object that will be used to obtain connection...
-        DBConnectionInfo currentInfo = (DBConnectionInfo) dataSources.get(dataSourceKey);
-        if (currentInfo != null) {
-            currentInfo.copyTo(connectionInfo);
-        } else {
-            connectionInfo = new DBConnectionInfo();
-        }
-
-        view.getConnectionInfo().setConnectionInfo(connectionInfo);
-    }
-
-    /**
-     * Main action method that pops up a dialog asking for user selection.
-     * Returns true if the selection was confirmed, false - if canceled.
-     */
-    public boolean startupAction() {
-        this.canceled = true;
-
-        refreshDataSources();
-
-        view.pack();
-        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
-        view.setModal(true);
-        makeCloseableOnEscape();
-        centerView();
-        view.setVisible(true);
-
-        return !canceled;
-    }
-
-    public DBConnectionInfo getConnectionInfo() {
-        return connectionInfo;
-    }
-
-    /**
-     * Tests that the entered information is valid and can be used to open a
-     * conneciton. Does not store the open connection.
-     */
-    public void okAction() {
-        DBConnectionInfo info = getConnectionInfo();
-        ClassLoadingService classLoader = getApplication().getClassLoadingService();
-
-        // try making an adapter...
-        try {
-            info.makeAdapter(classLoader);
-        } catch (Throwable th) {
-            reportError("DbAdapter Error", th);
-            return;
-        }
-
-        // doing connection testing...
-        // attempt opening the connection, and close it right away
-        try {
-
-            try (Connection connection = info.makeDataSource(classLoader).getConnection();) {
-                //
-            } catch (SQLException ex) {
-                // ignore close error
-            }
-        } catch (Throwable th) {
-            reportError("Connection Error", th);
-            return;
-        }
-
-        // set success flag, and unblock the caller...
-        canceled = false;
-        view.dispose();
-    }
-
-    public void cancelAction() {
-        canceled = true;
-        view.dispose();
-    }
-
-    /**
-     * Opens preferences panel to allow configuration of DataSource presets.
-     */
-    public void dataSourceConfigAction() {
-        PreferenceDialog prefs = new PreferenceDialog(this);
-        prefs.showDataSourceEditorAction(dataSourceKey);
-        refreshDataSources();
-    }
-
-    public Component getView() {
-        return view;
-    }
-
-    protected void refreshDataSources() {
-        this.dataSources = getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
-                .getChildrenPreferences();
-
-        // 1.2 migration fix - update data source adapter names
-        Iterator it = dataSources.values().iterator();
-
-        final String _12package = "org.objectstyle.cayenne.";
-        while (it.hasNext()) {
-            DBConnectionInfo info = (DBConnectionInfo) it.next();
-            if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
-                info.setDbAdapter("org.apache.cayenne." + info.getDbAdapter().substring(_12package.length()));
-
-                // info.getObjectContext().commitChanges();
-            }
-        }
-
-        if (altDataSourceKey != null && !dataSources.containsKey(altDataSourceKey) && altDataSource != null) {
-            dataSources.put(altDataSourceKey, altDataSource);
-        }
-
-        Object[] keys = dataSources.keySet().toArray();
-        Arrays.sort(keys);
-        view.getDataSources().setModel(new DefaultComboBoxModel(keys));
-
-        if (getDataSourceKey() == null) {
-            String key = null;
-
-            if (altDataSourceKey != null) {
-                key = altDataSourceKey;
-            } else if (keys.length > 0) {
-                key = keys[0].toString();
-            }
-
-            setDataSourceKey(key);
-            dataSourceBinding.updateView();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
deleted file mode 100644
index 3258a54..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
+++ /dev/null
@@ -1,100 +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.db;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.pref.DBConnectionInfoEditor;
-import org.apache.cayenne.modeler.util.CayenneController;
-
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- */
-public class DataSourceView extends JDialog {
-
-    protected JComboBox dataSources;
-    protected JButton configButton;
-    protected JButton okButton;
-    protected JButton cancelButton;
-    protected DBConnectionInfoEditor connectionInfo;
-
-    public DataSourceView(CayenneController controller) {
-        super(Application.getFrame());
-
-        this.dataSources = new JComboBox();
-
-        this.configButton = new JButton("...");
-        this.configButton.setToolTipText("configure local DataSource");
-        this.okButton = new JButton("Continue");
-        this.cancelButton = new JButton("Cancel");
-        this.connectionInfo = new DBConnectionInfoEditor(controller);
-
-        CellConstraints cc = new CellConstraints();
-        PanelBuilder builder = new PanelBuilder(new FormLayout(
-                "20dlu:grow, pref, 3dlu, fill:max(150dlu;pref), 3dlu, fill:20dlu",
-                "p"));
-        builder.setDefaultDialogBorder();
-
-        builder.addLabel("Saved DataSources:", cc.xy(2, 1));
-        builder.add(dataSources, cc.xy(4, 1));
-        builder.add(configButton, cc.xy(6, 1));
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(cancelButton);
-        buttons.add(okButton);
-
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.NORTH);
-        getContentPane().add(connectionInfo.getView(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);
-
-        setTitle("DB Connection Info");
-    }
-
-    public JComboBox getDataSources() {
-        return dataSources;
-    }
-
-    public JButton getCancelButton() {
-        return cancelButton;
-    }
-
-    public JButton getConfigButton() {
-        return configButton;
-    }
-
-    public JButton getOkButton() {
-        return okButton;
-    }
-
-    public DBConnectionInfoEditor getConnectionInfo() {
-        return connectionInfo;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
index 5fa3987..814f589 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.dialog.db;
 
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
@@ -29,6 +30,7 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 
+import javax.sql.DataSource;
 import javax.swing.*;
 import java.awt.*;
 import java.sql.Connection;
@@ -44,32 +46,28 @@ import java.util.prefs.Preferences;
  */
 public class DataSourceWizard extends CayenneController {
 
-	protected DataSourceWizardView view;
-
-	protected DBConnectionInfo altDataSource;
-	protected String altDataSourceKey;
-	protected ObjectBinding dataSourceBinding;
-	protected Map<String, DBConnectionInfo> dataSources;
-
-	protected String dataSourceKey;
+	private DataSourceWizardView view;
+	private ObjectBinding dataSourceBinding;
+	private Map<String, DBConnectionInfo> dataSources;
+	private String dataSourceKey;
 
 	// this object is a clone of an object selected from the dropdown, as we
 	// need to allow
 	// local temporary modifications
-	protected DBConnectionInfo connectionInfo;
+	private DBConnectionInfo connectionInfo;
+
+	private boolean canceled;
 
-	protected boolean canceled;
+	private DataSourceModificationListener dataSourceListener;
 
-	protected DataSourceModificationListener dataSourceListener;
+	private DbAdapter adapter;
+	private DataSource dataSource;
 
-	public DataSourceWizard(CayenneController parent, String title, String altDataSourceKey,
-                            DBConnectionInfo altDataSource) {
+	public DataSourceWizard(CayenneController parent, String title) {
 		super(parent);
 
 		this.view = createView();
 		this.view.setTitle(title);
-		this.altDataSource = altDataSource;
-		this.altDataSourceKey = altDataSourceKey;
 		this.connectionInfo = new DBConnectionInfo();
 
 		initBindings();
@@ -79,7 +77,7 @@ public class DataSourceWizard extends CayenneController {
 	/**
 	 * Creates swing dialog for this wizard
 	 */
-	protected DataSourceWizardView createView() {
+	private DataSourceWizardView createView() {
 		return new DataSourceWizardView(this);
 	}
 
@@ -93,7 +91,7 @@ public class DataSourceWizard extends CayenneController {
 		builder.bindToAction(view.getConfigButton(), "dataSourceConfigAction()");
 	}
 
-	protected void initDataSourceListener() {
+	private void initDataSourceListener() {
 		dataSourceListener = new DataSourceModificationListener() {
 			@Override
 			public void callbackDataSourceRemoved(DataSourceModificationEvent e) {}
@@ -108,7 +106,7 @@ public class DataSourceWizard extends CayenneController {
 				.addDataSourceModificationListener(dataSourceListener);
 	}
 
-	protected void initFavouriteDataSource() {
+	private void initFavouriteDataSource() {
 		Preferences pref = getApplication().getPreferencesNode(GeneralPreferences.class, "");
 		String favouriteDataSource = pref.get(GeneralPreferences.FAVOURITE_DATA_SOURCE, null);
 		if(favouriteDataSource != null && dataSources.containsKey(favouriteDataSource)) {
@@ -117,7 +115,7 @@ public class DataSourceWizard extends CayenneController {
 		}
 	}
 
-	protected void removeDataSourceListener() {
+	private void removeDataSourceListener() {
 		getApplication().getFrameController().getProjectController()
 				.removeDataSourceModificationListener(dataSourceListener);
 	}
@@ -172,28 +170,17 @@ public class DataSourceWizard extends CayenneController {
 		DBConnectionInfo info = getConnectionInfo();
 		ClassLoadingService classLoader = getApplication().getClassLoadingService();
 
-		// try making an adapter...
-		try {
-			info.makeAdapter(classLoader);
-		} catch (Throwable th) {
-			reportError("DbAdapter Error", th);
-			return;
-		}
-
 		// doing connection testing...
-		// attempt opening the connection, and close it right away
 		try {
-
-			try (Connection connection = info.makeDataSource(classLoader).getConnection();) {
-				//
-			} catch (SQLException ex) {
-				// ignore close error
+			this.adapter = info.makeAdapter(classLoader);
+			this.dataSource = info.makeDataSource(classLoader);
+			try (Connection connection = dataSource.getConnection()) {
+			} catch (SQLException ignore) {
 			}
 		} catch (Throwable th) {
 			reportError("Connection Error", th);
 			return;
 		}
-
 		onClose(false);
 	}
 
@@ -228,8 +215,9 @@ public class DataSourceWizard extends CayenneController {
 		return view;
 	}
 
-	protected void refreshDataSources() {
-		this.dataSources = getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
+	@SuppressWarnings("unchecked")
+	private void refreshDataSources() {
+		this.dataSources = (Map<String, DBConnectionInfo>)getApplication().getCayenneProjectPreferences().getDetailObject(DBConnectionInfo.class)
 				.getChildrenPreferences();
 
 		// 1.2 migration fix - update data source adapter names
@@ -237,23 +225,16 @@ public class DataSourceWizard extends CayenneController {
 		for(DBConnectionInfo info : dataSources.values()) {
 			if (info.getDbAdapter() != null && info.getDbAdapter().startsWith(_12package)) {
 				info.setDbAdapter("org.apache.cayenne." + info.getDbAdapter().substring(_12package.length()));
-				// info.getObjectContext().commitChanges();
 			}
 		}
 
-		if (altDataSourceKey != null && !dataSources.containsKey(altDataSourceKey) && altDataSource != null) {
-			dataSources.put(altDataSourceKey, altDataSource);
-		}
-
 		String[] keys = dataSources.keySet().toArray(new String[0]);
 		Arrays.sort(keys);
 		view.getDataSources().setModel(new DefaultComboBoxModel<>(keys));
 
 		String key = null;
 		if (getDataSourceKey() == null || !dataSources.containsKey(getDataSourceKey())) {
-			if (altDataSourceKey != null) {
-				key = altDataSourceKey;
-			} else if (keys.length > 0) {
+			if (keys.length > 0) {
 				key = keys[0];
 			}
 		}
@@ -261,4 +242,15 @@ public class DataSourceWizard extends CayenneController {
 		setDataSourceKey(key != null ? key : getDataSourceKey());
 		dataSourceBinding.updateView();
 	}
+
+	public DataSource getDataSource() {
+		return dataSource;
+	}
+
+	/**
+	 * Returns configured DbAdapter.
+	 */
+	public DbAdapter getAdapter() {
+		return adapter;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
deleted file mode 100644
index d314214..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
+++ /dev/null
@@ -1,401 +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.db;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.configuration.ConfigurationNameMapper;
-import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.server.DataSourceFactory;
-import org.apache.cayenne.configuration.server.DbAdapterFactory;
-import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbimport.Catalog;
-import org.apache.cayenne.dbimport.IncludeProcedure;
-import org.apache.cayenne.dbimport.IncludeTable;
-import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbimport.Schema;
-import org.apache.cayenne.dbsync.DbSyncModule;
-import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.dbsync.reverse.db.DbLoader;
-import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
-import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
-import org.apache.cayenne.di.DIBootstrap;
-import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.event.EntityEvent;
-import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.dialog.DbImportProjectSaver;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.LongRunningTask;
-import org.apache.cayenne.modeler.util.ProjectUtil;
-import org.apache.cayenne.tools.configuration.ToolsModule;
-import org.apache.cayenne.tools.dbimport.DbImportAction;
-import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
-import org.apache.cayenne.tools.dbimport.DbImportModule;
-import org.apache.cayenne.util.Util;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.swing.*;
-import java.io.File;
-import java.sql.Connection;
-import java.sql.SQLException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Stateful helper class that encapsulates access to DbLoader.
- */
-public class DbLoaderHelper {
-
-    // TODO: this is a temp hack... need to delegate to DbAdapter, or
-    // configurable in preferences...
-    private static final Collection<String> EXCLUDED_TABLES = Arrays.asList("AUTO_PK_SUPPORT", "auto_pk_support");
-
-    private static Log LOGGER = LogFactory.getLog(DbLoaderHelper.class);
-
-    protected boolean stoppingReverseEngineering;
-    protected boolean existingMap;
-    protected ProjectController projectController;
-    protected Connection connection;
-    protected DataMap dataMap;
-    protected DbAdapter adapter;
-    protected DbImportConfiguration config;
-    protected String loadStatusNote;
-
-    public DbLoaderHelper(ProjectController projectController,
-                          Connection connection,
-                          DbAdapter adapter,
-                          DBConnectionInfo dbConnectionInfo) {
-
-        this.projectController = projectController;
-        this.adapter = adapter;
-
-        this.config = new DbImportConfiguration();
-        this.config.setAdapter(adapter.getClass().getName());
-        this.config.setUsername(dbConnectionInfo.getUserName());
-        this.config.setPassword(dbConnectionInfo.getPassword());
-        this.config.setDriver(dbConnectionInfo.getJdbcDriver());
-        this.config.setUrl(dbConnectionInfo.getUrl());
-
-        this.connection = connection;
-    }
-
-    public boolean isStoppingReverseEngineering() {
-        return stoppingReverseEngineering;
-    }
-
-    public void setStoppingReverseEngineering(boolean stopReverseEngineering) {
-        this.stoppingReverseEngineering = stopReverseEngineering;
-    }
-
-    public DataMap getDataMap() {
-        return dataMap;
-    }
-
-    /**
-     * Performs reverse engineering of the DB using internal DbLoader. This
-     * method should be invoked outside EventDispatchThread, or it will throw an
-     * exception.
-     */
-    public void execute() {
-        stoppingReverseEngineering = false;
-
-        // load catalogs...
-        List<String> catalogs = Collections.emptyList();
-        if (adapter.supportsCatalogsOnReverseEngineering()) {
-            catalogs = new LoadCatalogsTask(Application.getFrame(), "Loading Catalogs").startAndWait();
-        }
-
-        if (stoppingReverseEngineering) {
-            return;
-        }
-
-        // load schemas...
-        List<String> schemas = new LoadSchemasTask(Application.getFrame(), "Loading Schemas").startAndWait();
-
-        if (stoppingReverseEngineering) {
-            return;
-        }
-
-        // use this catalog as the default...
-        String currentCatalog = null;
-        try {
-            currentCatalog = connection.getCatalog();
-        } catch (SQLException e) {
-            LOGGER.warn("Error getting catalog.", e);
-        }
-
-        String currentSchema = null;
-        try {
-            // 'getSchema' is Java 1.7 API ... hope this works with all drivers...
-            currentSchema = connection.getSchema();
-        } catch (SQLException e) {
-            LOGGER.warn("Error getting schema.", e);
-        }
-
-        final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
-                schemas,
-                catalogs,
-                currentSchema,
-                currentCatalog);
-
-        try {
-            // since we are not inside EventDispatcher Thread, must run it via SwingUtilities
-            SwingUtilities.invokeAndWait(new Runnable() {
-
-                public void run() {
-                    dialog.setVisible(true);
-                    dialog.dispose();
-                }
-            });
-        } catch (Throwable th) {
-            processException(th, "Error Reengineering Database");
-            return;
-        }
-
-        if (dialog.getChoice() == DbLoaderOptionsDialog.CANCEL) {
-            return;
-        }
-
-        ReverseEngineering reverseEngineering = new ReverseEngineering();
-
-        reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
-        reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
-        reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
-        reverseEngineering.addIncludeProcedure(new IncludeProcedure(dialog.getProcedureNamePattern()));
-
-        config.setMeaningfulPkTables(dialog.getMeaningfulPk());
-        config.setNamingStrategy(dialog.getNamingStrategy());
-
-        new LoadDataMapTask(Application.getFrame(), "Reengineering DB", reverseEngineering).startAndWait();
-    }
-
-    protected void processException(final Throwable th, final String message) {
-        LOGGER.info("Exception on reverse engineering", Util.unwindException(th));
-        SwingUtilities.invokeLater(new Runnable() {
-
-            public void run() {
-                JOptionPane.showMessageDialog(Application.getFrame(), th.getMessage(), message,
-                        JOptionPane.ERROR_MESSAGE);
-            }
-        });
-    }
-
-
-    private final class LoaderDelegate extends DefaultDbLoaderDelegate {
-
-        @Override
-        public void dbEntityAdded(DbEntity entity) {
-            checkCanceled();
-
-            loadStatusNote = "Importing table '" + entity.getName() + "'...";
-
-            // TODO: hack to prevent PK tables from being visible... this should
-            // really be delegated to DbAdapter to decide...
-            if (EXCLUDED_TABLES.contains(entity.getName()) && entity.getDataMap() != null) {
-                entity.getDataMap().removeDbEntity(entity.getName());
-            } else if (existingMap) {
-                projectController.fireDbEntityEvent(new EntityEvent(this, entity, MapEvent.ADD));
-            }
-        }
-
-        @Override
-        public void dbEntityRemoved(DbEntity entity) {
-            checkCanceled();
-
-            if (existingMap) {
-                projectController.fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
-            }
-        }
-
-        @Override
-        public boolean dbRelationship(DbEntity entity) {
-            checkCanceled();
-
-            loadStatusNote = "Load relationships for '" + entity.getName() + "'...";
-
-            return true;
-        }
-
-        @Override
-        public boolean dbRelationshipLoaded(DbEntity entity, DbRelationship relationship) {
-            checkCanceled();
-
-            loadStatusNote = "Load relationship: '" + entity.getName() + "'; '" + relationship.getName() + "'...";
-
-            return true;
-        }
-
-        void checkCanceled() {
-            if (isStoppingReverseEngineering()) {
-                throw new CayenneRuntimeException("Reengineering was canceled.");
-            }
-        }
-    }
-
-    abstract class DbLoaderTask<T> extends LongRunningTask<T> {
-
-        public DbLoaderTask(JFrame frame, String title) {
-            super(frame, title);
-            setMinValue(0);
-            setMaxValue(10);
-        }
-
-        @Override
-        protected String getCurrentNote() {
-            return loadStatusNote;
-        }
-
-        @Override
-        protected int getCurrentValue() {
-            return getMinValue();
-        }
-
-        @Override
-        protected boolean isIndeterminate() {
-            return true;
-        }
-
-        @Override
-        public boolean isCanceled() {
-            return isStoppingReverseEngineering();
-        }
-
-        @Override
-        public void setCanceled(boolean b) {
-            if (b) {
-                loadStatusNote = "Canceling..";
-            }
-
-            setStoppingReverseEngineering(b);
-        }
-    }
-
-    final class LoadCatalogsTask extends DbLoaderTask<List<String>> {
-
-        public LoadCatalogsTask(JFrame frame, String title) {
-            super(frame, title);
-        }
-
-        @Override
-        protected void execute() {
-            loadStatusNote = "Loading available catalogs...";
-
-            try {
-                result = DbLoader.loadCatalogs(connection);
-            } catch (Throwable th) {
-                processException(th, "Error Loading Catalogs");
-            }
-        }
-    }
-
-    final class LoadSchemasTask extends DbLoaderTask<List<String>> {
-
-        public LoadSchemasTask(JFrame frame, String title) {
-            super(frame, title);
-        }
-
-        @Override
-        protected void execute() {
-            loadStatusNote = "Loading available schemas...";
-
-            try {
-                result = DbLoader.loadSchemas(connection);
-            } catch (Throwable th) {
-                processException(th, "Error Loading Schemas");
-            }
-        }
-    }
-
-    public final class LoadDataMapTask extends DbLoaderTask {
-
-        private ReverseEngineering reverseEngineering;
-
-        public LoadDataMapTask(JFrame frame, String title, ReverseEngineering reverseEngineering) {
-            super(frame, title);
-            this.reverseEngineering = reverseEngineering;
-        }
-
-        @Override
-        protected void execute() {
-
-            loadStatusNote = "Preparing...";
-
-            DbLoaderHelper.this.dataMap = projectController.getCurrentDataMap();
-            DbLoaderHelper.this.existingMap = dataMap != null;
-
-            if (!existingMap) {
-
-                ConfigurationNode root = projectController.getProject().getRootNode();
-
-                dataMap = new DataMap();
-                dataMap.setName(NameBuilder.builder(dataMap, root).name());
-            }
-
-            if (isCanceled()) {
-                return;
-            }
-
-            if (dataMap.getConfigurationSource() != null) {
-                config.setTargetDataMap(new File(dataMap.getConfigurationSource().getURL().getPath()));
-            }
-
-            FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
-            config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
-
-            DbImportAction importAction = createAction(dataMap);
-            try {
-                importAction.execute(config);
-            } catch (Exception e) {
-                processException(e, "Error importing database schema.");
-            }
-            ProjectUtil.cleanObjMappings(dataMap);
-        }
-
-        protected DbImportAction createAction(DataMap targetDataMap) {
-            Injector injector = DIBootstrap.createInjector(new DbSyncModule(),
-                    new ToolsModule(LOGGER),
-                    new DbImportModule());
-
-            return new ModelerDbImportAction(
-                    LOGGER,
-                    new DbImportProjectSaver(projectController, injector.getInstance(ConfigurationNameMapper.class)),
-                    injector.getInstance(DataSourceFactory.class),
-                    injector.getInstance(DbAdapterFactory.class),
-                    injector.getInstance(MapLoader.class),
-                    injector.getInstance(MergerTokenFactoryProvider.class),
-                    targetDataMap,
-                    createDbLoader(config));
-        }
-
-        protected DbLoader createDbLoader(DbImportConfiguration configuration) {
-            return new DbLoader(connection, adapter, new LoaderDelegate(), configuration.createNameGenerator());
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/7da0e897/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
deleted file mode 100644
index 6911586..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
+++ /dev/null
@@ -1,247 +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.db;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.FormLayout;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-import java.util.Vector;
-
-/**
- * Dialog for selecting database reverse-engineering parameters.
- */
-public class DbLoaderOptionsDialog extends CayenneDialog {
-
-    public static final String WILDCARD_PATTERN = ".*";
-
-    public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-    protected JLabel catalogLabel;
-    protected JComboBox<String> catalogSelector;
-    protected JLabel schemaLabel;
-    protected JComboBox<String> schemaSelector;
-    protected JTextField tableNamePatternField;
-    protected JTextField meaningfulPk;
-    protected JTextField procNamePatternField;
-    protected JLabel procedureLabel;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-
-
-    protected JComboBox<String> strategyCombo;
-    protected String strategy;
-    protected int choice;
-
-    /**
-     * Creates and initializes new ChooseSchemaDialog.
-     */
-    public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
-                                 String dbCatalog) {
-        super(Application.getFrame(), "Reengineer DB Schema: Select Options");
-
-        init();
-        initController();
-        initFromModel(schemas, catalogs, currentSchema, dbCatalog);
-
-        pack();
-        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setModal(true);
-        centerWindow();
-    }
-
-    /** Sets up the graphical components. */
-    protected void init() {
-
-        // create widgets...
-        selectButton = new JButton("Continue");
-        cancelButton = new JButton("Cancel");
-        catalogSelector = new JComboBox<>();
-        schemaSelector = new JComboBox<>();
-        tableNamePatternField = new JTextField();
-        tableNamePatternField.setToolTipText("<html>Regular expression to filter table names.<br>" +
-                "Default expression <b>.*</b> includes all tables.</html>");
-        procNamePatternField = new JTextField();
-        procNamePatternField.setToolTipText("<html>Regular expression to filter stored procedures names.<br>" +
-                "Default expression .* includes all stored procedures.</html>");
-        meaningfulPk = new JTextField();
-        meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
-                "Multiple expressions divided by comma can be used.<br>" +
-                "Example: <b>^table1,^table2,^prefix.*</b></html>");
-        strategyCombo = new JComboBox<>();
-        strategyCombo.setEditable(true);
-
-        // assemble
-        FormLayout layout = new FormLayout(
-                "right:pref, 3dlu, fill:max(170dlu;pref):grow",
-                "");
-        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        builder.setDefaultDialogBorder();
-
-        catalogLabel = builder.append("Select Catalog:", catalogSelector);
-        schemaLabel = builder.append("Select Schema:", schemaSelector);
-        builder.append("Table Name Pattern:", tableNamePatternField);
-        procedureLabel = builder.append("Procedure Name Pattern:", procNamePatternField);
-        builder.append("Naming Strategy:", strategyCombo);
-        builder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
-
-        JPanel buttons = new JPanel(new FlowLayout(FlowLayout.RIGHT));
-        buttons.add(cancelButton);
-        buttons.add(selectButton);
-
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
-        getContentPane().add(buttons, BorderLayout.SOUTH);
-    }
-
-    protected void initController() {
-        selectButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processSelect();
-            }
-        });
-        cancelButton.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                processCancel();
-            }
-        });
-    }
-
-    protected void initFromModel(
-            Collection<String> schemas,
-            Collection<String> catalogs,
-            String currentSchema,
-            String currentCatalog) {
-
-        this.choice = CANCEL;
-        this.tableNamePatternField.setText(WILDCARD_PATTERN);
-        this.procNamePatternField.setText(WILDCARD_PATTERN);
-
-        Vector<String> arr = NameGeneratorPreferences
-                .getInstance()
-                .getLastUsedStrategies();
-        strategyCombo.setModel(new DefaultComboBoxModel<>(arr));
-
-        boolean showSchemaSelector = schemas != null && !schemas.isEmpty();
-        schemaSelector.setVisible(showSchemaSelector);
-        schemaLabel.setVisible(showSchemaSelector);
-
-        if (showSchemaSelector) {
-
-            schemaSelector.setModel(new DefaultComboBoxModel<>(schemas.toArray(new String[0])));
-
-            if (currentSchema != null) {
-                for (String schema : schemas) {
-                    if (currentSchema.equalsIgnoreCase(schema)) {
-                        schemaSelector.setSelectedItem(schema);
-                        break;
-                    }
-                }
-            }
-        }
-
-        boolean showCatalogSelector = catalogs != null && !catalogs.isEmpty();
-        catalogSelector.setVisible(showCatalogSelector);
-        catalogLabel.setVisible(showCatalogSelector);
-
-        if (showCatalogSelector) {
-            catalogSelector.setModel(new DefaultComboBoxModel<>(catalogs.toArray(new String[0])));
-
-            if (currentCatalog != null && !currentCatalog.isEmpty()) {
-                for (String catalog : catalogs) {
-                    if (currentCatalog.equalsIgnoreCase(catalog)) {
-                        catalogSelector.setSelectedItem(catalog);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-
-    public int getChoice() {
-        return choice;
-    }
-
-    private void processSelect() {
-        strategy = (String) strategyCombo.getSelectedItem();
-
-        choice = SELECT;
-        setVisible(false);
-    }
-
-    private void processCancel() {
-        choice = CANCEL;
-        setVisible(false);
-    }
-
-    /**
-     * Returns selected catalog.
-     */
-    public String getSelectedCatalog() {
-        String catalog = (String) catalogSelector.getSelectedItem();
-        return "".equals(catalog) ? null : catalog;
-    }
-
-    /**
-     * Returns selected schema.
-     */
-    public String getSelectedSchema() {
-        String schema = (String) schemaSelector.getSelectedItem();
-        return "".equals(schema) ? null : schema;
-    }
-
-    /**
-     * Returns the tableNamePattern.
-     */
-    public String getTableNamePattern() {
-        return "".equals(tableNamePatternField.getText()) ? null : tableNamePatternField
-                .getText();
-    }
-
-    public String getMeaningfulPk() {
-        return "".equals(meaningfulPk.getText()) ? null : meaningfulPk
-                .getText();
-    }
-
-    /**
-     * Returns the procedure name pattern.
-     */
-    public String getProcedureNamePattern() {
-        return "".equals(procNamePatternField.getText()) ? null : procNamePatternField
-                .getText();
-    }
-
-    /**
-     * Returns configured naming strategy
-     */
-    public String getNamingStrategy() {
-        return strategy;
-    }
-}


[10/10] cayenne git commit: Merge branch '157'

Posted by sk...@apache.org.
Merge branch '157'


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

Branch: refs/heads/master
Commit: 27138761c90564ce772b9370ce9bb4f5a222156a
Parents: 1a647b2 a1f10f4
Author: Savva Kolbachev <s....@gmail.com>
Authored: Mon Dec 19 14:45:45 2016 +0300
Committer: Savva Kolbachev <s....@gmail.com>
Committed: Mon Dec 19 14:45:45 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 .../cayenne/modeler/action/DBWizardAction.java  | 130 +++---
 .../modeler/action/GenerateDBAction.java        |   9 +-
 .../cayenne/modeler/action/MigrateAction.java   |  82 +---
 .../action/ReverseEngineeringAction.java        |  85 ++--
 .../modeler/dialog/DbImportProjectSaver.java    |  77 ----
 .../modeler/dialog/db/ConnectionWizard.java     |  87 ----
 .../modeler/dialog/db/DBGeneratorOptions.java   | 345 ----------------
 .../dialog/db/DBGeneratorOptionsView.java       | 178 --------
 .../modeler/dialog/db/DataSourceController.java | 219 ----------
 .../modeler/dialog/db/DataSourceView.java       | 100 -----
 .../modeler/dialog/db/DataSourceWizard.java     |  80 ++--
 .../dialog/db/DbActionOptionsDialog.java        | 178 ++++++++
 .../modeler/dialog/db/DbLoaderHelper.java       | 401 -------------------
 .../dialog/db/DbLoaderOptionsDialog.java        | 247 ------------
 .../dialog/db/DbMigrateOptionsDialog.java       | 175 --------
 .../modeler/dialog/db/MergerOptions.java        | 394 ------------------
 .../modeler/dialog/db/MergerOptionsView.java    | 134 -------
 .../db/MergerTokenSelectorController.java       | 239 -----------
 .../dialog/db/MergerTokenSelectorView.java      | 106 -----
 .../dialog/db/MergerTokenTableModel.java        | 128 ------
 .../dialog/db/ModelerDbImportAction.java        |  67 ----
 .../dialog/db/TableSelectorController.java      | 251 ------------
 .../modeler/dialog/db/TableSelectorView.java    |  94 -----
 .../dialog/db/gen/DBGeneratorOptions.java       | 332 +++++++++++++++
 .../dialog/db/gen/DBGeneratorOptionsView.java   | 178 ++++++++
 .../dialog/db/gen/TableSelectorController.java  | 251 ++++++++++++
 .../dialog/db/gen/TableSelectorView.java        |  94 +++++
 .../dialog/db/load/DbImportProjectSaver.java    |  74 ++++
 .../modeler/dialog/db/load/DbLoaderContext.java | 183 +++++++++
 .../dialog/db/load/DbLoaderOptionsDialog.java   | 117 ++++++
 .../modeler/dialog/db/load/LoadDataMapTask.java |  97 +++++
 .../modeler/dialog/db/load/LoaderDelegate.java  |  71 ++++
 .../dialog/db/load/ModelerDbImportAction.java   |  53 +++
 .../dialog/db/load/ModelerSyncModule.java       |  44 ++
 .../modeler/dialog/db/merge/MergerOptions.java  | 394 ++++++++++++++++++
 .../dialog/db/merge/MergerOptionsView.java      | 134 +++++++
 .../db/merge/MergerTokenSelectorController.java | 240 +++++++++++
 .../db/merge/MergerTokenSelectorView.java       | 106 +++++
 .../dialog/db/merge/MergerTokenTableModel.java  | 129 ++++++
 .../cayenne/modeler/util/DbAdapterInfo.java     |   2 +-
 41 files changed, 2829 insertions(+), 3477 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/27138761/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/RELEASE-NOTES.txt
index 7281967,ca2395c..55b2757
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@@ -19,7 -19,7 +19,8 @@@ CAY-2165 Explicit "contribution" API fo
  CAY-2166 Auto-loading of Cayenne modules
  CAY-2168 Split DbLoader to parts and clean it up
  CAY-2169 Split DbMerger to parts and clean it up
+ CAY-2172 Cleanup Modeler import and migrate db actions
 +CAY-2176 Java 7 diamond class generation templates
  
  Bug Fixes:
  


[06/10] cayenne git commit: Merge branch 'master' into CAY-2172

Posted by sk...@apache.org.
Merge branch 'master' into CAY-2172

# Conflicts:
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderHelper.java
#	modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java


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

Branch: refs/heads/master
Commit: 391c564be288412898c3861bc08305fabb1403b8
Parents: 190ab7c 25ae44a
Author: stariy <st...@gmail.com>
Authored: Wed Dec 14 22:47:27 2016 +0300
Committer: stariy <st...@gmail.com>
Committed: Wed Dec 14 22:47:27 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/merge/AbstractMerger.java    |  92 ++++
 .../cayenne/dbsync/merge/AbstractToDbToken.java | 130 -----
 .../dbsync/merge/AbstractToModelToken.java      | 125 -----
 .../cayenne/dbsync/merge/AddColumnToDb.java     |  74 ---
 .../cayenne/dbsync/merge/AddColumnToModel.java  |  52 --
 .../dbsync/merge/AddRelationshipToDb.java       |  87 ---
 .../dbsync/merge/AddRelationshipToModel.java    |  89 ----
 .../cayenne/dbsync/merge/ChainMerger.java       |  71 +++
 .../cayenne/dbsync/merge/CreateTableToDb.java   |  86 ---
 .../dbsync/merge/CreateTableToModel.java        |  98 ----
 .../cayenne/dbsync/merge/DataMapMerger.java     | 156 ++++++
 .../dbsync/merge/DbAttributeDictionary.java     |  44 ++
 .../cayenne/dbsync/merge/DbAttributeMerger.java | 168 ++++++
 .../dbsync/merge/DbEntityDictionary.java        |  66 +++
 .../cayenne/dbsync/merge/DbEntityMerger.java    | 127 +++++
 .../apache/cayenne/dbsync/merge/DbMerger.java   | 396 --------------
 .../dbsync/merge/DbRelationshipDictionary.java  |  83 +++
 .../dbsync/merge/DbRelationshipMerger.java      | 133 +++++
 .../dbsync/merge/DefaultModelMergeDelegate.java |  89 ----
 .../merge/DefaultValueForNullProvider.java      |  62 ---
 .../cayenne/dbsync/merge/DropColumnToDb.java    |  61 ---
 .../cayenne/dbsync/merge/DropColumnToModel.java |  77 ---
 .../dbsync/merge/DropRelationshipToDb.java      |  83 ---
 .../dbsync/merge/DropRelationshipToModel.java   |  49 --
 .../cayenne/dbsync/merge/DropTableToDb.java     |  51 --
 .../cayenne/dbsync/merge/DropTableToModel.java  |  51 --
 .../cayenne/dbsync/merge/DummyReverseToken.java |  65 ---
 .../dbsync/merge/EmptyValueForNullProvider.java |  40 --
 .../dbsync/merge/EntityMergeSupport.java        | 515 ------------------
 .../cayenne/dbsync/merge/MergeDirection.java    |  70 ---
 .../org/apache/cayenne/dbsync/merge/Merger.java |  30 ++
 .../cayenne/dbsync/merge/MergerContext.java     | 170 ------
 .../cayenne/dbsync/merge/MergerDictionary.java  |  54 ++
 .../dbsync/merge/MergerDictionaryDiff.java      | 117 ++++
 .../cayenne/dbsync/merge/MergerDiffPair.java    |  39 ++
 .../cayenne/dbsync/merge/MergerToken.java       |  57 --
 .../dbsync/merge/ModelMergeDelegate.java        |  62 ---
 .../dbsync/merge/ProxyModelMergeDelegate.java   | 108 ----
 .../cayenne/dbsync/merge/SetAllowNullToDb.java  |  58 --
 .../dbsync/merge/SetAllowNullToModel.java       |  45 --
 .../cayenne/dbsync/merge/SetColumnTypeToDb.java | 111 ----
 .../dbsync/merge/SetColumnTypeToModel.java      |  95 ----
 .../cayenne/dbsync/merge/SetNotNullToDb.java    |  52 --
 .../cayenne/dbsync/merge/SetNotNullToModel.java |  45 --
 .../cayenne/dbsync/merge/SetPrimaryKeyToDb.java |  87 ---
 .../dbsync/merge/SetPrimaryKeyToModel.java      |  80 ---
 .../dbsync/merge/SetValueForNullToDb.java       |  48 --
 .../cayenne/dbsync/merge/TokenComparator.java   |  46 --
 .../dbsync/merge/ValueForNullProvider.java      |  41 --
 .../merge/context/EntityMergeSupport.java       | 516 ++++++++++++++++++
 .../dbsync/merge/context/MergeDirection.java    |  71 +++
 .../dbsync/merge/context/MergerContext.java     | 174 ++++++
 .../merge/factory/DB2MergerTokenFactory.java    |   4 +-
 .../factory/DefaultMergerTokenFactory.java      |  46 +-
 .../merge/factory/DerbyMergerTokenFactory.java  |   8 +-
 .../factory/FirebirdMergerTokenFactory.java     |  10 +-
 .../merge/factory/H2MergerTokenFactory.java     |   8 +-
 .../merge/factory/HSQLMergerTokenFactory.java   |  10 +-
 .../merge/factory/IngresMergerTokenFactory.java |  14 +-
 .../merge/factory/MergerTokenFactory.java       |   4 +-
 .../merge/factory/MySQLMergerTokenFactory.java  |  12 +-
 .../factory/OpenBaseMergerTokenFactory.java     |  12 +-
 .../merge/factory/OracleMergerTokenFactory.java |  10 +-
 .../factory/PostgresMergerTokenFactory.java     |   4 +-
 .../factory/SQLServerMergerTokenFactory.java    |  10 +-
 .../merge/factory/SybaseMergerTokenFactory.java |  12 +-
 .../token/DefaultValueForNullProvider.java      |  63 +++
 .../dbsync/merge/token/DummyReverseToken.java   |  68 +++
 .../merge/token/EmptyValueForNullProvider.java  |  41 ++
 .../cayenne/dbsync/merge/token/MergerToken.java |  58 ++
 .../dbsync/merge/token/TokenComparator.java     |  58 ++
 .../merge/token/ValueForNullProvider.java       |  42 ++
 .../merge/token/db/AbstractToDbToken.java       | 134 +++++
 .../dbsync/merge/token/db/AddColumnToDb.java    |  76 +++
 .../merge/token/db/AddRelationshipToDb.java     |  84 +++
 .../dbsync/merge/token/db/CreateTableToDb.java  |  89 ++++
 .../dbsync/merge/token/db/DropColumnToDb.java   |  63 +++
 .../merge/token/db/DropRelationshipToDb.java    |  85 +++
 .../dbsync/merge/token/db/DropTableToDb.java    |  53 ++
 .../dbsync/merge/token/db/SetAllowNullToDb.java |  60 +++
 .../merge/token/db/SetColumnTypeToDb.java       | 113 ++++
 .../dbsync/merge/token/db/SetNotNullToDb.java   |  54 ++
 .../merge/token/db/SetPrimaryKeyToDb.java       |  89 ++++
 .../merge/token/db/SetValueForNullToDb.java     |  52 ++
 .../merge/token/model/AbstractToModelToken.java | 129 +++++
 .../merge/token/model/AddColumnToModel.java     |  56 ++
 .../token/model/AddRelationshipToModel.java     |  92 ++++
 .../merge/token/model/CreateTableToModel.java   | 101 ++++
 .../merge/token/model/DropColumnToModel.java    |  80 +++
 .../token/model/DropRelationshipToModel.java    |  52 ++
 .../merge/token/model/DropTableToModel.java     |  54 ++
 .../merge/token/model/SetAllowNullToModel.java  |  48 ++
 .../merge/token/model/SetColumnTypeToModel.java |  98 ++++
 .../merge/token/model/SetNotNullToModel.java    |  48 ++
 .../merge/token/model/SetPrimaryKeyToModel.java |  83 +++
 .../reverse/db/DbAttributesBaseLoader.java      | 107 ----
 .../dbsync/reverse/db/DbAttributesLoader.java   |  43 --
 .../reverse/db/DbAttributesPerSchemaLoader.java | 131 -----
 .../cayenne/dbsync/reverse/db/DbLoader.java     | 534 -------------------
 .../reverse/db/DbLoaderConfiguration.java       |  84 ---
 .../dbsync/reverse/db/DbLoaderDelegate.java     |  63 ---
 .../reverse/db/DbRelationshipDetected.java      |  53 --
 .../dbsync/reverse/db/DbTableLoader.java        | 183 -------
 .../reverse/db/DefaultDbLoaderDelegate.java     |  63 ---
 .../cayenne/dbsync/reverse/db/ExportedKey.java  | 233 --------
 .../reverse/db/LoggingDbLoaderDelegate.java     |  61 ---
 .../dbsync/reverse/dbload/AbstractLoader.java   |  43 ++
 .../dbsync/reverse/dbload/AttributeLoader.java  | 137 +++++
 .../dbsync/reverse/dbload/DbLoadDataStore.java  |  90 ++++
 .../cayenne/dbsync/reverse/dbload/DbLoader.java | 118 ++++
 .../reverse/dbload/DbLoaderConfiguration.java   |  85 +++
 .../dbsync/reverse/dbload/DbLoaderDelegate.java |  63 +++
 .../reverse/dbload/DbRelationshipDetected.java  |  54 ++
 .../reverse/dbload/DefaultDbLoaderDelegate.java |  64 +++
 .../dbload/DefaultModelMergeDelegate.java       |  90 ++++
 .../dbsync/reverse/dbload/EntityLoader.java     | 106 ++++
 .../dbsync/reverse/dbload/ExportedKey.java      | 220 ++++++++
 .../reverse/dbload/ExportedKeyLoader.java       |  74 +++
 .../reverse/dbload/LoggingDbLoaderDelegate.java |  61 +++
 .../reverse/dbload/ModelMergeDelegate.java      |  65 +++
 .../dbload/PerCatalogAndSchemaLoader.java       |  58 ++
 .../dbsync/reverse/dbload/PerEntityLoader.java  |  64 +++
 .../dbsync/reverse/dbload/PrimaryKeyLoader.java |  60 +++
 .../reverse/dbload/ProcedureColumnLoader.java   | 127 +++++
 .../dbsync/reverse/dbload/ProcedureLoader.java  |  77 +++
 .../reverse/dbload/ProxyModelMergeDelegate.java | 109 ++++
 .../reverse/dbload/RelationshipLoader.java      | 168 ++++++
 .../dbsync/reverse/filters/TableFilter.java     |   7 +-
 .../dbsync/merge/AddColumnToModelIT.java        |  98 ----
 .../dbsync/merge/CreateTableToModelIT.java      |  97 ----
 .../cayenne/dbsync/merge/DataMapMergerTest.java | 400 ++++++++++++++
 .../cayenne/dbsync/merge/DbMergerTest.java      | 334 ------------
 .../dbsync/merge/DropColumnToModelIT.java       | 235 --------
 .../dbsync/merge/DropRelationshipToModelIT.java | 190 -------
 .../dbsync/merge/DropTableToModelIT.java        |  94 ----
 .../dbsync/merge/EntityMergeSupportIT.java      |   1 +
 .../apache/cayenne/dbsync/merge/MergeCase.java  |  21 +-
 .../dbsync/merge/SetAllowNullToDbIT.java        |  66 ---
 .../cayenne/dbsync/merge/SetNotNullToDbIT.java  |  62 ---
 .../dbsync/merge/SetPrimaryKeyToDbIT.java       |  58 --
 .../dbsync/merge/TokenComparatorTest.java       | 101 ----
 .../cayenne/dbsync/merge/TokensReverseTest.java |  90 ----
 .../merge/TokensToModelExecutionTest.java       |  80 ---
 .../cayenne/dbsync/merge/ValueForNullIT.java    | 126 -----
 .../dbsync/merge/token/TokenComparatorTest.java | 113 ++++
 .../dbsync/merge/token/TokensReverseTest.java   |  90 ++++
 .../merge/token/TokensToModelExecutionTest.java |  82 +++
 .../dbsync/merge/token/ValueForNullIT.java      | 129 +++++
 .../merge/token/db/SetAllowNullToDbIT.java      |  68 +++
 .../dbsync/merge/token/db/SetNotNullToDbIT.java |  64 +++
 .../merge/token/db/SetPrimaryKeyToDbIT.java     |  60 +++
 .../merge/token/model/AddColumnToModelIT.java   | 101 ++++
 .../merge/token/model/CreateTableToModelIT.java | 100 ++++
 .../merge/token/model/DropColumnToModelIT.java  | 238 +++++++++
 .../token/model/DropRelationshipToModelIT.java  | 192 +++++++
 .../merge/token/model/DropTableToModelIT.java   |  97 ++++
 .../cayenne/dbsync/reverse/db/DbLoaderIT.java   | 408 --------------
 .../reverse/dbload/AttributeLoaderIT.java       | 154 ++++++
 .../dbsync/reverse/dbload/BaseLoaderIT.java     |  91 ++++
 .../dbsync/reverse/dbload/DbLoaderIT.java       | 122 +++++
 .../dbsync/reverse/dbload/EntityLoaderIT.java   |  98 ++++
 .../reverse/dbload/ExportedKeyLoaderIT.java     |  85 +++
 .../reverse/dbload/PrimaryKeyLoaderIT.java      |  60 +++
 .../reverse/dbload/RelationshipsLoaderIT.java   |  98 ++++
 .../dbsync/reverse/filters/TableFilterTest.java |  81 ++-
 .../java/org/apache/cayenne/map/DbEntity.java   |   4 +-
 .../tools/dbimport/DbImportConfiguration.java   |  12 +-
 .../tools/dbimport/DefaultDbImportAction.java   |  42 +-
 .../dbimport/DefaultDbImportActionTest.java     | 151 +++---
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 .../getting-started/src/docbkx/delete.xml       |  10 +-
 .../getting-started/src/docbkx/index.xml        |   4 +-
 .../getting-started/src/docbkx/java-classes.xml |  32 +-
 .../src/docbkx/object-context.xml               |  39 +-
 .../src/docbkx/object-relational-mapping.xml    |  69 ++-
 .../getting-started/src/docbkx/part1.xml        |   4 +-
 .../getting-started/src/docbkx/part2.xml        |   4 +-
 .../getting-started/src/docbkx/part3.xml        |   4 +-
 .../getting-started/src/docbkx/part4.xml        |   4 +-
 .../src/docbkx/persistent-objects.xml           |  37 +-
 .../getting-started/src/docbkx/select-query.xml |  24 +-
 .../getting-started/src/docbkx/setup.xml        |  28 +-
 .../src/docbkx/starting-project.xml             |  98 ++--
 .../getting-started/src/docbkx/webapp.xml       | 119 +++--
 .../getting-started/src/images/base-datamap.png | Bin 91074 -> 94872 bytes
 .../src/images/base-datanode.png                | Bin 81748 -> 96978 bytes
 .../src/images/chrome-webapp.png                | Bin 0 -> 42124 bytes
 .../src/images/eclipse-generatedclasses.png     | Bin 141000 -> 0 bytes
 .../src/images/eclipse-mvnrun.png               | Bin 147012 -> 0 bytes
 .../src/images/eclipse-xmlfiles.png             | Bin 27801 -> 0 bytes
 .../src/images/firefox-webapp.png               | Bin 25898 -> 0 bytes
 .../src/images/icon-attribute.gif               | Bin 0 -> 1171 bytes
 .../getting-started/src/images/icon-datamap.gif | Bin 0 -> 755 bytes
 .../src/images/icon-dbentity.gif                | Bin 0 -> 1171 bytes
 .../getting-started/src/images/icon-info.gif    | Bin 0 -> 755 bytes
 .../getting-started/src/images/icon-info.png    | Bin 0 -> 1098 bytes
 .../getting-started/src/images/icon-node.gif    | Bin 0 -> 331 bytes
 .../src/images/icon-objentity.gif               | Bin 0 -> 755 bytes
 .../src/images/icon-relationship.gif            | Bin 0 -> 1171 bytes
 .../src/images/icon-relationship.png            | Bin 0 -> 835 bytes
 .../getting-started/src/images/icon-sync.gif    | Bin 0 -> 331 bytes
 .../src/images/idea-configuration-menu.png      | Bin 0 -> 32911 bytes
 .../src/images/idea-generated-classes.png       | Bin 0 -> 198808 bytes
 .../src/images/idea-run-configuration.png       | Bin 0 -> 93059 bytes
 .../src/images/idea-xmlfiles.png                | Bin 0 -> 27783 bytes
 .../src/images/maven-plugin-install.png         | Bin 97455 -> 0 bytes
 .../src/images/modeler-artistid.png             | Bin 59372 -> 65879 bytes
 .../src/images/modeler-dbrelationship.png       | Bin 42245 -> 41730 bytes
 .../src/images/modeler-deleterule.png           | Bin 69992 -> 83349 bytes
 .../src/images/modeler-started.png              | Bin 133410 -> 98815 bytes
 .../src/images/tutorial-eclipse-project.png     | Bin 70937 -> 0 bytes
 .../src/images/tutorial-idea-project.png        | Bin 0 -> 48037 bytes
 .../modeler/action/CreateObjEntityAction.java   |   2 +-
 .../modeler/action/DbEntitySyncAction.java      |   2 +-
 .../cayenne/modeler/action/MigrateAction.java   |   1 +
 .../modeler/action/ObjEntitySyncAction.java     |   2 +-
 .../modeler/dialog/db/merge/MergerOptions.java  |  33 +-
 .../db/merge/MergerTokenSelectorController.java |   6 +-
 .../dialog/db/merge/MergerTokenTableModel.java  |   4 +-
 .../dialog/objentity/EntitySyncController.java  |   2 +-
 220 files changed, 8975 insertions(+), 7525 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index ccf6d3e,0648d2c..af0dcd0
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@@ -19,15 -19,21 +19,16 @@@
  
  package org.apache.cayenne.modeler.action;
  
 -import org.apache.cayenne.dba.DbAdapter;
  import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
+ import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
  import org.apache.cayenne.map.DataMap;
  import org.apache.cayenne.modeler.Application;
 -import org.apache.cayenne.modeler.dialog.db.DataSourceController;
 -import org.apache.cayenne.modeler.dialog.db.DbMigrateOptionsDialog;
 -import org.apache.cayenne.modeler.dialog.db.MergerOptions;
 -import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 +import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 +import org.apache.cayenne.modeler.dialog.db.merge.DbMigrateOptionsDialog;
 +import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
  
 -import javax.sql.DataSource;
 -import javax.swing.*;
  import java.awt.event.ActionEvent;
 -import java.util.Collections;
 -import java.util.List;
 +import java.util.Collection;
  
  /**
   * Action that alter database schema to match a DataMap.

http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
index a914cf1,0000000..26564a3
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerOptions.java
@@@ -1,395 -1,0 +1,394 @@@
 +/*****************************************************************
 + *   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.db.merge;
 +
 +import org.apache.cayenne.CayenneRuntimeException;
 +import org.apache.cayenne.configuration.event.DataMapEvent;
 +import org.apache.cayenne.dba.DbAdapter;
- import org.apache.cayenne.dbsync.merge.AbstractToDbToken;
- import org.apache.cayenne.dbsync.merge.DbMerger;
- import org.apache.cayenne.dbsync.merge.DefaultModelMergeDelegate;
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerContext;
- import org.apache.cayenne.dbsync.merge.MergerToken;
- import org.apache.cayenne.dbsync.merge.ModelMergeDelegate;
- import org.apache.cayenne.dbsync.merge.ProxyModelMergeDelegate;
++import org.apache.cayenne.dbsync.merge.token.db.AbstractToDbToken;
++import org.apache.cayenne.dbsync.merge.DataMapMerger;
++import org.apache.cayenne.dbsync.reverse.dbload.DefaultModelMergeDelegate;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.context.MergerContext;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
++import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
++import org.apache.cayenne.dbsync.reverse.dbload.ProxyModelMergeDelegate;
 +import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 +import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 +import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 +import org.apache.cayenne.dbsync.naming.NoStemStemmer;
- import org.apache.cayenne.dbsync.reverse.db.DbLoader;
- import org.apache.cayenne.dbsync.reverse.db.DbLoaderConfiguration;
- import org.apache.cayenne.dbsync.reverse.db.LoggingDbLoaderDelegate;
++import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
++import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderConfiguration;
++import org.apache.cayenne.dbsync.reverse.dbload.LoggingDbLoaderDelegate;
 +import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 +import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 +import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
 +import org.apache.cayenne.map.DataMap;
 +import org.apache.cayenne.map.ObjEntity;
 +import org.apache.cayenne.map.event.MapEvent;
 +import org.apache.cayenne.modeler.Application;
 +import org.apache.cayenne.modeler.ProjectController;
 +import org.apache.cayenne.modeler.dialog.ValidationResultBrowser;
 +import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 +import org.apache.cayenne.modeler.util.CayenneController;
 +import org.apache.cayenne.project.Project;
 +import org.apache.cayenne.resource.Resource;
 +import org.apache.cayenne.swing.BindingBuilder;
 +import org.apache.cayenne.swing.ObjectBinding;
 +import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
 +import org.apache.cayenne.validation.ValidationResult;
 +import org.apache.commons.logging.LogFactory;
 +
 +import javax.sql.DataSource;
 +import javax.swing.JFileChooser;
 +import javax.swing.JOptionPane;
 +import javax.swing.WindowConstants;
 +import javax.swing.event.ChangeEvent;
 +import javax.swing.event.ChangeListener;
 +import java.awt.Component;
 +import java.io.File;
 +import java.io.FileWriter;
 +import java.io.IOException;
 +import java.io.PrintWriter;
 +import java.sql.Connection;
 +import java.sql.SQLException;
 +import java.util.Collection;
 +import java.util.Iterator;
 +import java.util.LinkedList;
 +import java.util.List;
 +
 +public class MergerOptions extends CayenneController {
 +
 +    protected MergerOptionsView view;
 +    protected ObjectBinding sqlBinding;
 +
 +    protected DBConnectionInfo connectionInfo;
 +    protected DataMap dataMap;
 +    protected DbAdapter adapter;
 +    protected String textForSQL;
 +
 +    protected MergerTokenSelectorController tokens;
 +    protected String defaultCatalog;
 +    protected String defaultSchema;
 +    private MergerTokenFactoryProvider mergerTokenFactoryProvider;
 +
 +    public MergerOptions(ProjectController parent,
 +                         String title,
 +                         DBConnectionInfo connectionInfo,
 +                         DataMap dataMap,
 +                         String defaultCatalog,
 +                         String defaultSchema,
 +                         MergerTokenFactoryProvider mergerTokenFactoryProvider) {
 +        super(parent);
 +
 +        this.mergerTokenFactoryProvider = mergerTokenFactoryProvider;
 +        this.dataMap = dataMap;
 +        this.tokens = new MergerTokenSelectorController(parent);
 +        this.view = new MergerOptionsView(tokens.getView());
 +        this.connectionInfo = connectionInfo;
 +        this.defaultCatalog = defaultCatalog;
 +        this.defaultSchema = defaultSchema;
 +        this.view.setTitle(title);
 +        initController();
 +
 +        prepareMigrator();
 +        createSQL();
 +        refreshView();
 +    }
 +
 +    public Component getView() {
 +        return view;
 +    }
 +
 +    public String getTextForSQL() {
 +        return textForSQL;
 +    }
 +
 +    protected void initController() {
 +
 +        BindingBuilder builder = new BindingBuilder(
 +                getApplication().getBindingFactory(),
 +                this);
 +
 +        sqlBinding = builder.bindToTextArea(view.getSql(), "textForSQL");
 +
 +        builder.bindToAction(view.getGenerateButton(), "generateSchemaAction()");
 +        builder.bindToAction(view.getSaveSqlButton(), "storeSQLAction()");
 +        builder.bindToAction(view.getCancelButton(), "closeAction()");
 +
 +        // refresh SQL if different tables were selected
 +        view.getTabs().addChangeListener(new ChangeListener() {
 +
 +            public void stateChanged(ChangeEvent e) {
 +                if (view.getTabs().getSelectedIndex() == 1) {
 +                    // this assumes that some tables where checked/unchecked... not very
 +                    // efficient
 +                    refreshGeneratorAction();
 +                }
 +            }
 +        });
 +    }
 +
 +    /**
 +     * check database and create the {@link List} of {@link MergerToken}s
 +     */
 +    protected void prepareMigrator() {
 +        try {
 +            adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
 +
 +            MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
 +            tokens.setMergerTokenFactory(mergerTokenFactory);
 +
 +
 +            FiltersConfig filters = FiltersConfig.create(defaultCatalog, defaultSchema, TableFilter.everything(),
 +                    PatternFilter.INCLUDE_NOTHING);
 +
-             DbMerger merger = DbMerger.builder(mergerTokenFactory)
++            DataMapMerger merger = DataMapMerger.builder(mergerTokenFactory)
 +                    .filters(filters)
 +                    .build();
 +
 +            DbLoaderConfiguration config = new DbLoaderConfiguration();
 +            config.setFiltersConfig(filters);
 +
 +            DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
 +
-             DataMap dbImport = new DataMap();
++            DataMap dbImport;
 +            try (Connection conn = dataSource.getConnection();) {
-                 new DbLoader(conn,
-                         adapter,
++                dbImport = new DbLoader(adapter, conn,
++                        config,
 +                        new LoggingDbLoaderDelegate(LogFactory.getLog(DbLoader.class)),
 +                        new DefaultObjectNameGenerator(NoStemStemmer.getInstance()))
-                         .load(dbImport, config);
- 
++                        .load();
 +            } catch (SQLException e) {
 +                throw new CayenneRuntimeException("Can't doLoad dataMap from db.", e);
 +            }
 +
 +            tokens.setTokens(merger.createMergeTokens(dataMap, dbImport));
 +        } catch (Exception ex) {
 +            reportError("Error loading adapter", ex);
 +        }
 +    }
 +
 +    /**
 +     * Returns SQL statements generated for selected schema generation options.
 +     */
 +    protected void createSQL() {
 +        // convert them to string representation for display
 +        StringBuilder buf = new StringBuilder();
 +
 +        Iterator<MergerToken> it = tokens.getSelectedTokens().iterator();
 +        String batchTerminator = adapter.getBatchTerminator();
 +
 +        String lineEnd = batchTerminator != null ? "\n" + batchTerminator + "\n\n" : "\n\n";
 +        while (it.hasNext()) {
 +            MergerToken token = it.next();
 +
 +            if (token instanceof AbstractToDbToken) {
 +                AbstractToDbToken tdb = (AbstractToDbToken) token;
 +                for (String sql : tdb.createSql(adapter)) {
 +                    buf.append(sql);
 +                    buf.append(lineEnd);
 +                }
 +            }
 +        }
 +
 +        textForSQL = buf.toString();
 +    }
 +
 +    protected void refreshView() {
 +        sqlBinding.updateView();
 +    }
 +
 +    // ===============
 +    // Actions
 +    // ===============
 +
 +    /**
 +     * Starts options dialog.
 +     */
 +    public void startupAction() {
 +        view.pack();
 +        view.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 +        view.setModal(true);
 +        makeCloseableOnEscape();
 +        centerView();
 +        view.setVisible(true);
 +    }
 +
 +    public void refreshGeneratorAction() {
 +        refreshSQLAction();
 +    }
 +
 +    /**
 +     * Updates a text area showing generated SQL.
 +     */
 +    public void refreshSQLAction() {
 +        createSQL();
 +        sqlBinding.updateView();
 +    }
 +
 +    /**
 +     * Performs configured schema operations via DbGenerator.
 +     */
 +    public void generateSchemaAction() {
 +        refreshGeneratorAction();
 +
 +        // sanity check...
 +        List<MergerToken> tokensToMigrate = tokens.getSelectedTokens();
 +        if (tokensToMigrate.isEmpty()) {
 +            JOptionPane.showMessageDialog(getView(), "Nothing to migrate.");
 +            return;
 +        }
 +
 +        DataSource dataSource;
 +        try {
 +            dataSource = connectionInfo.makeDataSource(getApplication()
 +                    .getClassLoadingService());
 +        } catch (SQLException ex) {
 +            reportError("Migration Error", ex);
 +            return;
 +        }
 +
 +        final Collection<ObjEntity> loadedObjEntities = new LinkedList<>();
 +
 +        MergerContext mergerContext = MergerContext.builder(dataMap)
 +                .syntheticDataNode(dataSource, adapter)
 +                .delegate(createDelegate(loadedObjEntities))
 +                .build();
 +
 +        boolean modelChanged = applyTokens(tokensToMigrate, mergerContext);
 +
 +        DefaultDbImportAction.flattenManyToManyRelationships(
 +                dataMap,
 +                loadedObjEntities,
 +                mergerContext.getNameGenerator());
 +
 +        notifyProjectModified(modelChanged);
 +
 +        reportFailures(mergerContext);
 +    }
 +
 +    private ModelMergeDelegate createDelegate(final Collection<ObjEntity> loadedObjEntities) {
 +        return new ProxyModelMergeDelegate(new DefaultModelMergeDelegate()) {
 +            @Override
 +            public void objEntityAdded(ObjEntity ent) {
 +                loadedObjEntities.add(ent);
 +                super.objEntityAdded(ent);
 +            }
 +        };
 +    }
 +
 +    private boolean applyTokens(List<MergerToken> tokensToMigrate, MergerContext mergerContext) {
 +        boolean modelChanged = false;
 +
 +        try {
 +            for (MergerToken tok : tokensToMigrate) {
 +                int numOfFailuresBefore = getFailuresCount(mergerContext);
 +
 +                tok.execute(mergerContext);
 +
 +                if (!modelChanged && tok.getDirection().equals(MergeDirection.TO_MODEL)) {
 +                    modelChanged = true;
 +                }
 +                if (numOfFailuresBefore == getFailuresCount(mergerContext)) {
 +                    // looks like the token executed without failures
 +                    tokens.removeToken(tok);
 +                }
 +            }
 +        } catch (Throwable th) {
 +            reportError("Migration Error", th);
 +        }
 +
 +        return modelChanged;
 +    }
 +
 +    private int getFailuresCount(MergerContext mergerContext) {
 +        return mergerContext.getValidationResult().getFailures().size();
 +    }
 +
 +    private void reportFailures(MergerContext mergerContext) {
 +        ValidationResult failures = mergerContext.getValidationResult();
 +        if (failures == null || !failures.hasFailures()) {
 +            JOptionPane.showMessageDialog(getView(), "Migration Complete.");
 +        } else {
 +            new ValidationResultBrowser(this).startupAction(
 +                    "Migration Complete",
 +                    "Migration finished. The following problem(s) were ignored.",
 +                    failures);
 +        }
 +    }
 +
 +    private void notifyProjectModified(boolean modelChanged) {
 +        if(!modelChanged) {
 +            return;
 +        }
 +
 +        // mark the model as unsaved
 +        Project project = getApplication().getProject();
 +        project.setModified(true);
 +
 +        ProjectController projectController = getProjectController();
 +        projectController.setDirty(true);
 +
 +        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
 +                dataMap, MapEvent.REMOVE));
 +        projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(),
 +                dataMap, MapEvent.ADD));
 +    }
 +
 +    /**
 +     * Allows user to save generated SQL in a file.
 +     */
 +    public void storeSQLAction() {
 +        JFileChooser fc = new JFileChooser();
 +        fc.setDialogType(JFileChooser.SAVE_DIALOG);
 +        fc.setDialogTitle("Save SQL Script");
 +
 +        Resource projectDir = getApplication().getProject().getConfigurationResource();
 +
 +        if (projectDir != null) {
 +            fc.setCurrentDirectory(new File(projectDir.getURL().getPath()));
 +        }
 +
 +        if (fc.showSaveDialog(getView()) == JFileChooser.APPROVE_OPTION) {
 +            refreshGeneratorAction();
 +
 +            try {
 +                File file = fc.getSelectedFile();
 +                FileWriter fw = new FileWriter(file);
 +                PrintWriter pw = new PrintWriter(fw);
 +                pw.print(textForSQL);
 +                pw.flush();
 +                pw.close();
 +            } catch (IOException ex) {
 +                reportError("Error Saving SQL", ex);
 +            }
 +        }
 +    }
 +
 +    private ProjectController getProjectController() {
 +        return getApplication().getFrameController().getProjectController();
 +    }
 +
 +    public void closeAction() {
 +        view.dispose();
 +    }
 +
 +}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
index 52d6ce3,0000000..7f6d4da
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenSelectorController.java
@@@ -1,240 -1,0 +1,240 @@@
 +/*****************************************************************
 + *   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.db.merge;
 +
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerToken;
- import org.apache.cayenne.dbsync.merge.TokenComparator;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
++import org.apache.cayenne.dbsync.merge.token.TokenComparator;
 +import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 +import org.apache.cayenne.modeler.Application;
 +import org.apache.cayenne.modeler.util.CayenneController;
 +import org.apache.cayenne.swing.BindingBuilder;
 +import org.apache.cayenne.swing.ObjectBinding;
 +
 +import javax.swing.*;
 +import javax.swing.table.AbstractTableModel;
 +import javax.swing.table.TableColumn;
 +import javax.swing.table.TableColumnModel;
 +import javax.swing.table.TableModel;
 +import java.awt.*;
 +import java.util.ArrayList;
 +import java.util.Collections;
 +import java.util.HashSet;
 +import java.util.List;
 +import java.util.Set;
 +
 +public class MergerTokenSelectorController extends CayenneController {
 +
 +    protected MergerTokenSelectorView view;
 +    protected ObjectBinding tableBinding;
 +
 +    protected MergerToken token;
 +    protected int permanentlyExcludedCount;
 +    protected Set<MergerToken> excludedTokens;
 +    protected List<MergerToken> selectableTokensList;
 +    protected MergerTokenFactory mergerTokenFactory;
 +
 +    public MergerTokenSelectorController(CayenneController parent) {
 +        super(parent);
 +        this.view = new MergerTokenSelectorView();
 +        this.excludedTokens = new HashSet<MergerToken>();
 +        this.selectableTokensList = new ArrayList<MergerToken>();
 +        initController();
 +    }
 +
 +    public void setMergerTokenFactory(MergerTokenFactory mergerTokenFactory) {
 +        this.mergerTokenFactory = mergerTokenFactory;
 +    }
 +
 +    public void setTokens(List<MergerToken> tokens) {
 +        selectableTokensList.clear();
 +        selectableTokensList.addAll(tokens);
 +        excludedTokens.addAll(tokens);
 +    }
 +
 +    public List<MergerToken> getSelectedTokens() {
 +        List<MergerToken> t = new ArrayList<MergerToken>(selectableTokensList);
 +        t.removeAll(excludedTokens);
 +        return Collections.unmodifiableList(t);
 +    }
 +
 +    public List<MergerToken> getSelectableTokens() {
 +        return Collections.unmodifiableList(selectableTokensList);
 +    }
 +    
 +    public void removeToken(MergerToken token) {
 +        selectableTokensList.remove(token);
 +        excludedTokens.remove(token);
 +
 +        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
 +        model.fireTableDataChanged();
 +    }
 +
 +    // ----- properties -----
 +
 +    public Component getView() {
 +        return view;
 +    }
 +
 +    /**
 +     * Called by table binding script to set current token.
 +     */
 +    public void setToken(MergerToken token) {
 +        this.token = token;
 +    }
 +
 +    /**
 +     * Returns {@link MergerToken}s that are excluded from DB generation.
 +     */
 +    /*
 +     * public Collection getExcludedTokens() { return excludedTokens; }
 +     */
 +
 +    public boolean isIncluded() {
 +        if (token == null) {
 +            return false;
 +        }
 +
 +        return !excludedTokens.contains(token);
 +    }
 +
 +    public void setIncluded(boolean b) {
 +        if (token == null) {
 +            return;
 +        }
 +
 +        if (b) {
 +            excludedTokens.remove(token);
 +        }
 +        else {
 +            excludedTokens.add(token);
 +        }
 +
 +        tableSelectedAction();
 +    }
 +
 +    /**
 +     * A callback action that updates the state of Select All checkbox.
 +     */
 +    public void tableSelectedAction() {
 +        int unselectedCount = excludedTokens.size() - permanentlyExcludedCount;
 +
 +        if (unselectedCount == selectableTokensList.size()) {
 +            view.getCheckAll().setSelected(false);
 +        }
 +        else if (unselectedCount == 0) {
 +            view.getCheckAll().setSelected(true);
 +        }
 +    }
 +
 +    // ------ other stuff ------
 +
 +    protected void initController() {
 +        BindingBuilder builder = new BindingBuilder(
 +                getApplication().getBindingFactory(),
 +                this);
 +
 +        builder.bindToAction(view.getCheckAll(), "checkAllAction()");
 +        builder.bindToAction(view.getReverseAll(), "reverseAllAction()");
 +
 +        TableModel model = new MergerTokenTableModel(this);
 +
 +        MergeDirection[] dirs = new MergeDirection[] {
 +                MergeDirection.TO_DB, MergeDirection.TO_MODEL
 +        };
 +
 +        view.getTokens().setModel(model);
 +
 +        TableColumnModel columnModel = view.getTokens().getColumnModel();
 +        
 +        // dropdown for direction column
 +        JComboBox directionCombo = Application.getWidgetFactory().createComboBox(dirs, false);
 +        directionCombo.setEditable(false);
 +        TableColumn directionColumn = columnModel.getColumn(
 +                MergerTokenTableModel.COL_DIRECTION);
 +        directionColumn.setCellEditor(new DefaultCellEditor(directionCombo));
 +
 +        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setPreferredWidth(50);
 +        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setPreferredWidth(100);
 +        columnModel.getColumn(MergerTokenTableModel.COL_SELECT).setMaxWidth(50);
 +        columnModel.getColumn(MergerTokenTableModel.COL_DIRECTION).setMaxWidth(100);
 +    }
 +
 +    public boolean isSelected(MergerToken token) {
 +        return (selectableTokensList.contains(token) && !excludedTokens.contains(token));
 +    }
 +
 +    public void select(MergerToken token, boolean select) {
 +        if (select) {
 +            excludedTokens.remove(token);
 +        }
 +        else {
 +            excludedTokens.add(token);
 +        }
 +    }
 +
 +    public void setDirection(MergerToken token, MergeDirection direction) {
 +        if (token.getDirection().equals(direction)) {
 +            return;
 +        }
 +        int i = selectableTokensList.indexOf(token);
 +        MergerToken reverse = token.createReverse(mergerTokenFactory);
 +        selectableTokensList.set(i, reverse);
 +        if (excludedTokens.remove(token)) {
 +            excludedTokens.add(reverse);
 +        }
 +        
 +        /**
 +         * Repaint, so that "Operation" column updates properly
 +         */
 +        view.getTokens().repaint();
 +    }
 +
 +    public void checkAllAction() {
 +
 +        boolean isCheckAllSelected = view.getCheckAll().isSelected();
 +
 +        if (isCheckAllSelected) {
 +            excludedTokens.clear();
 +        }
 +        else {
 +            excludedTokens.addAll(selectableTokensList);
 +        }
 +
 +        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
 +        model.fireTableDataChanged();
 +    }
 +
 +    public void reverseAllAction() {
 +        
 +        for (int i = 0; i < selectableTokensList.size(); i++) {
 +            MergerToken token = selectableTokensList.get(i);
 +            MergerToken reverse = token.createReverse(mergerTokenFactory);
 +            selectableTokensList.set(i, reverse);
 +            if (excludedTokens.remove(token)) {
 +                excludedTokens.add(reverse);
 +            }
 +        }
 +
 +        Collections.sort(selectableTokensList, new TokenComparator());
 +        AbstractTableModel model = (AbstractTableModel) view.getTokens().getModel();
 +        model.fireTableDataChanged();
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/391c564b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
----------------------------------------------------------------------
diff --cc modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
index 4fc78f0,0000000..7a04f16
mode 100644,000000..100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/merge/MergerTokenTableModel.java
@@@ -1,129 -1,0 +1,129 @@@
 +/*****************************************************************
 + *   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.db.merge;
 +
- import org.apache.cayenne.dbsync.merge.MergeDirection;
- import org.apache.cayenne.dbsync.merge.MergerToken;
++import org.apache.cayenne.dbsync.merge.context.MergeDirection;
++import org.apache.cayenne.dbsync.merge.token.MergerToken;
 +
 +import javax.swing.table.AbstractTableModel;
 +import java.util.List;
 +
 +
 +public class MergerTokenTableModel extends AbstractTableModel {
 +
 +    public static final int COL_SELECT = 0;
 +    public static final int COL_DIRECTION = 1;
 +    public static final int COL_NAME = 2;
 +    public static final int COL_VALUE = 3;
 +
 +    private MergerTokenSelectorController controller;
 +
 +    private List<MergerToken> tokens;
 +
 +    public MergerTokenTableModel(MergerTokenSelectorController controller) {
 +        this.controller = controller;
 +        this.tokens = controller.getSelectableTokens();
 +    }
 +
 +    private MergerTokenSelectorController getController() {
 +        return controller;
 +    }
 +
 +    public Class getColumnClass(int columnIndex) {
 +        switch (columnIndex) {
 +            case COL_SELECT:
 +                return Boolean.class;
 +            case COL_DIRECTION:
 +                // TODO: correct?
 +                return String.class;
 +            case COL_NAME:
 +            case COL_VALUE:
 +                return String.class;
 +        }
 +
 +        return null;
 +    }
 +
 +    public int getColumnCount() {
 +        return 4;
 +    }
 +
 +    public String getColumnName(int columnIndex) {
 +        switch (columnIndex) {
 +            case COL_SELECT:
 +                return "";
 +            case COL_NAME:
 +                return "Operation";
 +            case COL_DIRECTION:
 +                return "Direction";
 +            case COL_VALUE:
 +                return "";
 +        }
 +
 +        return null;
 +    }
 +
 +    public int getRowCount() {
 +        return tokens.size();
 +    }
 +
 +    public MergerToken getToken(int rowIndex) {
 +        return tokens.get(rowIndex);
 +    }
 +
 +    public Object getValueAt(int rowIndex, int columnIndex) {
 +        MergerToken token = getToken(rowIndex);
 +        switch (columnIndex) {
 +            case COL_SELECT:
 +                return Boolean.valueOf(getController().isSelected(token));
 +            case COL_NAME:
 +                return token.getTokenName();
 +            case COL_DIRECTION:
 +                return token.getDirection();
 +            case COL_VALUE:
 +                return token.getTokenValue();
 +        }
 +        return null;
 +    }
 +
 +    public boolean isCellEditable(int rowIndex, int columnIndex) {
 +        switch (columnIndex) {
 +            case COL_SELECT:
 +            case COL_DIRECTION:
 +                return true;
 +        }
 +        return false;
 +    }
 +
 +    public void setValueAt(Object value, int rowIndex, int columnIndex) {
 +        MergerToken token = getToken(rowIndex);
 +        switch (columnIndex) {
 +            case COL_SELECT:
 +                Boolean val = (Boolean) value;
 +                getController().select(token, val.booleanValue());
 +                break;
 +            case COL_DIRECTION:
 +                MergeDirection direction = (MergeDirection) value;
 +                getController().setDirection(token, direction);
 +                break;
 +        }
 +    }
 +
 +}


[09/10] cayenne git commit: Merge with master

Posted by sk...@apache.org.
Merge with master


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

Branch: refs/heads/master
Commit: a1f10f42e9da3fe7df3c91c14536a25526f3c691
Parents: 06c9183 d8b17c1
Author: Nikita Timofeev <st...@gmail.com>
Authored: Thu Dec 15 12:11:25 2016 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Thu Dec 15 12:11:25 2016 +0300

----------------------------------------------------------------------
 docs/doc/src/main/resources/RELEASE-NOTES.txt | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/a1f10f42/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --cc docs/doc/src/main/resources/RELEASE-NOTES.txt
index 0c1637d,740698c..ca2395c
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@@ -18,7 -18,7 +18,8 @@@ CAY-2164 Relocate builder bootstrap met
  CAY-2165 Explicit "contribution" API for easier expansion of DI collections and maps
  CAY-2166 Auto-loading of Cayenne modules
  CAY-2168 Split DbLoader to parts and clean it up
+ CAY-2169 Split DbMerger to parts and clean it up
 +CAY-2172 Cleanup Modeler import and migrate db actions
  
  Bug Fixes: