You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2020/06/17 10:15:36 UTC

[cayenne] branch master updated (4cffda9 -> 666c8c2)

This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git.


    from 4cffda9  code cleanup
     new 17edf6f  Modeler: refactor actions that use DataSourceWizard
     new 666c8c2  Modeler: code cleanup

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../modeler/action/DBConnectionAwareAction.java    | 109 ++++++++++++++
 .../cayenne/modeler/action/DBWizardAction.java     | 113 --------------
 .../modeler/action/GetDbConnectionAction.java      |  34 +----
 .../cayenne/modeler/action/LoadDbSchemaAction.java |  60 +-------
 .../cayenne/modeler/action/MigrateAction.java      |  79 +++++++++-
 .../modeler/action/ReverseEngineeringAction.java   |  69 +--------
 .../modeler/dialog/db/DataSourceWizard.java        |  62 ++++----
 .../modeler/dialog/db/gen/DBGeneratorOptions.java  |   3 +-
 .../editor/dbimport/DraggableTreePanel.java        | 167 +++++++++------------
 .../editor/dbimport/PrintColumnsBiFunction.java    |   2 +-
 10 files changed, 296 insertions(+), 402 deletions(-)
 create mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java


[cayenne] 02/02: Modeler: code cleanup

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 666c8c2689ebb33e805050c0daeec867f42bf78e
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Wed Jun 17 13:15:22 2020 +0300

    Modeler: code cleanup
---
 .../editor/dbimport/DraggableTreePanel.java        | 167 +++++++++------------
 .../editor/dbimport/PrintColumnsBiFunction.java    |   2 +-
 2 files changed, 74 insertions(+), 95 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java
index b058108..320ac40 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java
@@ -64,7 +64,7 @@ import java.awt.event.KeyListener;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -135,24 +135,22 @@ public class DraggableTreePanel extends JScrollPane {
 
     private void initListeners() {
         sourceTree.addKeyListener(new SourceTreeKeyListener());
-        targetTree.addKeyListener(new TargetTreeKeyListener());
-        targetTree.addTreeSelectionListener(new TargetTreeSelectionListener());
-        targetTree.setTransferHandler(new TargetTreeTransferHandler());
         sourceTree.setTransferHandler(new SourceTreeTransferHandler());
         sourceTree.addTreeSelectionListener(new SourceTreeSelectionListener());
         sourceTree.addMouseListener(new ResetFocusMouseAdapter());
+
+        targetTree.addKeyListener(new TargetTreeKeyListener());
+        targetTree.setTransferHandler(new TargetTreeTransferHandler());
+        targetTree.addTreeSelectionListener(new TargetTreeSelectionListener());
         targetTree.setDragEnabled(true);
     }
 
     private boolean canBeInverted() {
-        if (sourceTree.getSelectionPath() != null) {
-            DbImportTreeNode selectedElement = sourceTree.getSelectedNode();
-            if (selectedElement == null) {
-                return false;
-            }
-            return levels.get(selectedElement.getUserObject().getClass()) < SECOND_LEVEL;
+        DbImportTreeNode selectedElement = sourceTree.getSelectedNode();
+        if (selectedElement == null) {
+            return false;
         }
-        return false;
+        return levels.get(selectedElement.getUserObject().getClass()) < SECOND_LEVEL;
     }
 
     private void initElement() {
@@ -160,16 +158,16 @@ public class DraggableTreePanel extends JScrollPane {
         sourceTree.setCellRenderer(new ColorTreeRenderer());
         sourceTree.setDropMode(DropMode.INSERT);
 
-        MoveImportNodeAction action = projectController.getApplication().
-                getActionManager().getAction(MoveImportNodeAction.class);
+        MoveImportNodeAction action = projectController.getApplication().getActionManager()
+                .getAction(MoveImportNodeAction.class);
         action.setPanel(this);
         action.setSourceTree(sourceTree);
         action.setTargetTree(targetTree);
         moveButton = (CayenneAction.CayenneToolbarButton) action.buildButton();
         moveButton.setShowingText(true);
         moveButton.setText(MOVE_BUTTON_LABEL);
-        MoveInvertNodeAction actionInv = projectController.getApplication().
-                getActionManager().getAction(MoveInvertNodeAction.class);
+        MoveInvertNodeAction actionInv = projectController.getApplication().getActionManager()
+                .getAction(MoveInvertNodeAction.class);
         actionInv.setPanel(this);
         actionInv.setSourceTree(sourceTree);
         actionInv.setTargetTree(targetTree);
@@ -195,72 +193,60 @@ public class DraggableTreePanel extends JScrollPane {
         levels.put(IncludeProcedure.class, FIFTH_LEVEL);
         levels.put(ExcludeProcedure.class, FIFTH_LEVEL);
 
-        List<Class<?>> rootLevelClasses = new ArrayList<>();
-        rootLevelClasses.add(Catalog.class);
-        rootLevelClasses.add(Schema.class);
-        rootLevelClasses.add(IncludeTable.class);
-        rootLevelClasses.add(ExcludeTable.class);
-        rootLevelClasses.add(IncludeColumn.class);
-        rootLevelClasses.add(ExcludeColumn.class);
-        rootLevelClasses.add(IncludeProcedure.class);
-        rootLevelClasses.add(ExcludeProcedure.class);
-
-        List<Class<?>> catalogLevelClasses = new ArrayList<>();
-        catalogLevelClasses.add(Schema.class);
-        catalogLevelClasses.add(IncludeTable.class);
-        catalogLevelClasses.add(ExcludeTable.class);
-        catalogLevelClasses.add(IncludeColumn.class);
-        catalogLevelClasses.add(ExcludeColumn.class);
-        catalogLevelClasses.add(IncludeProcedure.class);
-        catalogLevelClasses.add(ExcludeProcedure.class);
-
-        List<Class<?>> schemaLevelClasses = new ArrayList<>();
-        schemaLevelClasses.add(IncludeTable.class);
-        schemaLevelClasses.add(ExcludeTable.class);
-        schemaLevelClasses.add(IncludeColumn.class);
-        schemaLevelClasses.add(ExcludeColumn.class);
-        schemaLevelClasses.add(IncludeProcedure.class);
-        schemaLevelClasses.add(ExcludeProcedure.class);
-
-        List<Class<?>> includeTableLevelClasses = new ArrayList<>();
-        includeTableLevelClasses.add(IncludeColumn.class);
-        includeTableLevelClasses.add(ExcludeColumn.class);
-
-        insertableLevels.put(ReverseEngineering.class, rootLevelClasses);
-        insertableLevels.put(Catalog.class, catalogLevelClasses);
-        insertableLevels.put(Schema.class, schemaLevelClasses);
-        insertableLevels.put(IncludeTable.class, includeTableLevelClasses);
+        insertableLevels.put(ReverseEngineering.class, Arrays.asList(
+                Catalog.class, Schema.class,
+                IncludeTable.class, ExcludeTable.class,
+                IncludeColumn.class, ExcludeColumn.class,
+                IncludeProcedure.class, ExcludeProcedure.class
+        ));
+
+        insertableLevels.put(Catalog.class, Arrays.asList(
+                Schema.class,
+                IncludeTable.class, ExcludeTable.class,
+                IncludeColumn.class, ExcludeColumn.class,
+                IncludeProcedure.class, ExcludeProcedure.class
+        ));
+
+        insertableLevels.put(Schema.class, Arrays.asList(
+                IncludeTable.class, ExcludeTable.class,
+                IncludeColumn.class, ExcludeColumn.class,
+                IncludeProcedure.class, ExcludeProcedure.class
+        ));
+
+        insertableLevels.put(IncludeTable.class, Arrays.asList(
+                IncludeColumn.class, ExcludeColumn.class
+        ));
     }
 
     private boolean canBeMoved() {
-        if (sourceTree.getSelectionPath() != null) {
-            DbImportTreeNode selectedElement = sourceTree.getSelectedNode();
-            if (selectedElement == null) {
+        DbImportTreeNode selectedElement = sourceTree.getSelectedNode();
+        if (selectedElement == null) {
+            return false;
+        }
+
+        if (selectedElement.isIncludeColumn() || selectedElement.isExcludeColumn()) {
+            DbImportTreeNode node = targetTree.findNode(targetTree.getRootNode(), selectedElement.getParent(), 0);
+            if(node != null && node.isExcludeTable()) {
                 return false;
             }
-            if (selectedElement.isIncludeColumn() || selectedElement.isExcludeColumn()) {
-                DbImportTreeNode node = targetTree.findNode(targetTree.getRootNode(), selectedElement.getParent(), 0);
-                if(node != null && node.isExcludeTable()) {
-                    return false;
-                }
-            }
-            Class<?> draggableElementClass = selectedElement.getUserObject().getClass();
-            Class<?> reverseEngineeringElementClass;
-            if (targetTree.getSelectionPath() != null) {
-                selectedElement = targetTree.getSelectedNode();
-                DbImportTreeNode parent = selectedElement.getParent();
-                if (parent != null) {
-                    reverseEngineeringElementClass = parent.getUserObject().getClass();
-                } else {
-                    reverseEngineeringElementClass = selectedElement.getUserObject().getClass();
-                }
+        }
+
+        Class<?> draggableElementClass = selectedElement.getUserObject().getClass();
+        Class<?> reverseEngineeringElementClass;
+        if (targetTree.getSelectionPath() != null) {
+            selectedElement = targetTree.getSelectedNode();
+            DbImportTreeNode parent = selectedElement.getParent();
+            if (parent != null) {
+                reverseEngineeringElementClass = parent.getUserObject().getClass();
             } else {
-                reverseEngineeringElementClass = ReverseEngineering.class;
+                reverseEngineeringElementClass = selectedElement.getUserObject().getClass();
             }
-            List<Class<?>> containsList = insertableLevels.get(reverseEngineeringElementClass);
-            return containsList.contains(draggableElementClass);
+        } else {
+            reverseEngineeringElementClass = ReverseEngineering.class;
         }
-        return false;
+
+        List<Class<?>> containsList = insertableLevels.get(reverseEngineeringElementClass);
+        return containsList.contains(draggableElementClass);
     }
 
     public JButton getMoveButton() {
@@ -273,10 +259,10 @@ public class DraggableTreePanel extends JScrollPane {
 
     public TreeManipulationAction getActionByNodeType(Class<?> nodeType) {
         Class<? extends TreeManipulationAction> actionClass = actions.get(nodeType);
-        if (actionClass != null) {
-            return projectController.getApplication().getActionManager().getAction(actionClass);
+        if (actionClass == null) {
+            return null;
         }
-        return null;
+        return projectController.getApplication().getActionManager().getAction(actionClass);
     }
 
     public void bindReverseEngineeringToDatamap(DataMap dataMap, ReverseEngineering reverseEngineering) {
@@ -298,8 +284,9 @@ public class DraggableTreePanel extends JScrollPane {
         public Transferable createTransferable(JComponent c) {
             JTree tree = (JTree) c;
             TreePath[] paths = tree.getSelectionPaths();
-            DbImportTreeNode[] nodes = new DbImportTreeNode[paths.length];
-            for (int i = 0; i < paths.length; i++) {
+            int pathLength = paths == null ? 0 : paths.length;
+            DbImportTreeNode[] nodes = new DbImportTreeNode[pathLength];
+            for (int i = 0; i < pathLength; i++) {
                 nodes[i] = (DbImportTreeNode) paths[i].getLastPathComponent();
             }
             return new Transferable() {
@@ -362,13 +349,9 @@ public class DraggableTreePanel extends JScrollPane {
             if (root.getChildCount() > 0) {
                 model.nodesChanged(root, new int[]{root.getChildCount() - 1});
             }
-            if (canBeMoved()) {
-                moveButton.setEnabled(true);
-                moveInvertButton.setEnabled(canBeInverted());
-            } else {
-                moveButton.setEnabled(false);
-                moveInvertButton.setEnabled(false);
-            }
+            boolean canBeMoved = canBeMoved();
+            moveButton.setEnabled(canBeMoved);
+            moveInvertButton.setEnabled(canBeMoved && canBeInverted());
         }
     }
 
@@ -402,8 +385,8 @@ public class DraggableTreePanel extends JScrollPane {
                 return false;
             }
             if (transferData != null) {
-                MoveImportNodeAction action = projectController.getApplication().
-                        getActionManager().getAction(MoveImportNodeAction.class);
+                MoveImportNodeAction action = projectController.getApplication().getActionManager()
+                        .getAction(MoveImportNodeAction.class);
                 action.setSourceTree(sourceTree);
                 action.setTargetTree(targetTree);
                 action.setPanel(DraggableTreePanel.this);
@@ -418,13 +401,9 @@ public class DraggableTreePanel extends JScrollPane {
         @Override
         public void valueChanged(TreeSelectionEvent e) {
             if (sourceTree.getLastSelectedPathComponent() != null) {
-                if (canBeMoved()) {
-                    moveButton.setEnabled(true);
-                    moveInvertButton.setEnabled(canBeInverted());
-                } else {
-                    moveInvertButton.setEnabled(false);
-                    moveButton.setEnabled(false);
-                }
+                boolean canBeMoved = canBeMoved();
+                moveButton.setEnabled(canBeMoved);
+                moveInvertButton.setEnabled(canBeMoved && canBeInverted());
             }
         }
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
index b7003fe..1458bec 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
 
 public class PrintColumnsBiFunction implements BiFunction<FilterContainer, DbImportTreeNode, Void> {
 
-    private DbImportTree dbImportTree;
+    private final DbImportTree dbImportTree;
 
     public PrintColumnsBiFunction(DbImportTree dbImportTree) {
         this.dbImportTree = dbImportTree;


[cayenne] 01/02: Modeler: refactor actions that use DataSourceWizard

Posted by nt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 17edf6f2a3cd302d59abe8034c7b10dd6f8d2561
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Wed Jun 17 13:13:20 2020 +0300

    Modeler: refactor actions that use DataSourceWizard
---
 .../modeler/action/DBConnectionAwareAction.java    | 109 ++++++++++++++++++++
 .../cayenne/modeler/action/DBWizardAction.java     | 113 ---------------------
 .../modeler/action/GetDbConnectionAction.java      |  34 +------
 .../cayenne/modeler/action/LoadDbSchemaAction.java |  60 +----------
 .../cayenne/modeler/action/MigrateAction.java      |  79 ++++++++++++--
 .../modeler/action/ReverseEngineeringAction.java   |  69 ++-----------
 .../modeler/dialog/db/DataSourceWizard.java        |  62 +++++------
 .../modeler/dialog/db/gen/DBGeneratorOptions.java  |   3 +-
 8 files changed, 222 insertions(+), 307 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java
new file mode 100644
index 0000000..d006889
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java
@@ -0,0 +1,109 @@
+/*****************************************************************
+ *   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
+ *
+ *    https://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.action;
+
+import java.util.prefs.Preferences;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.pref.DataMapDefaults;
+import org.apache.cayenne.modeler.util.CayenneAction;
+
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.*;
+
+/**
+ * Base action that provides DBConnectionInfo for the current DataMap or calls {@link DataSourceWizard} dialog to
+ * create one.
+ *
+ * @since 4.2
+ */
+public abstract class DBConnectionAwareAction extends CayenneAction {
+
+    public DBConnectionAwareAction(String name, Application application) {
+        super(name, application);
+    }
+
+    protected DBConnectionInfo getConnectionInfo(String title) {
+        DBConnectionInfo connectionInfo;
+        if (datamapPrefNotExist()) {
+            DataSourceWizard connectWizard = getDataSourceWizard(title);
+            if (connectWizard == null) {
+                return null;
+            }
+            connectionInfo = connectWizard.getConnectionInfo();
+            saveConnectionInfo(connectWizard);
+        } else {
+            connectionInfo = getConnectionInfoFromPreferences();
+        }
+        return connectionInfo;
+    }
+
+    protected DataSourceWizard getDataSourceWizard(String title, String[] buttons) {
+        DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), title, buttons);
+        if (!connectWizard.startupAction()) {
+            return null;
+        }
+        return connectWizard;
+    }
+
+    protected DataSourceWizard getDataSourceWizard(String title) {
+        DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), title);
+        if (!connectWizard.startupAction()) {
+            return null;
+        }
+        return connectWizard;
+    }
+
+    protected boolean datamapPrefNotExist() {
+        Preferences dataMapPreference = getProjectController().
+                getDataMapPreferences(getProjectController().getCurrentDataMap())
+                .getCurrentPreference();
+        return dataMapPreference == null || dataMapPreference.get(URL_PROPERTY, null) == null;
+    }
+
+    protected DBConnectionInfo getConnectionInfoFromPreferences() {
+        DBConnectionInfo connectionInfo = new DBConnectionInfo();
+        DataMapDefaults dataMapDefaults = getProjectController()
+                .getDataMapPreferences(getProjectController().getCurrentDataMap());
+        connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null));
+        connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, null));
+        connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY, null));
+        connectionInfo.setPassword(dataMapDefaults.getCurrentPreference().get(PASSWORD_PROPERTY, null));
+        connectionInfo.setJdbcDriver(dataMapDefaults.getCurrentPreference().get(JDBC_DRIVER_PROPERTY, null));
+        return connectionInfo;
+    }
+
+    protected void saveConnectionInfo(DataSourceWizard connectWizard) {
+        DataMapDefaults dataMapDefaults = getProjectController().
+                getDataMapPreferences(getProjectController().getCurrentDataMap());
+
+        String dbAdapter = connectWizard.getConnectionInfo().getDbAdapter();
+        if(dbAdapter != null) {
+            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, dbAdapter);
+        } else {
+            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
+        }
+        dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
+        dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
+        dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
+        dataMapDefaults.getCurrentPreference().put(JDBC_DRIVER_PROPERTY, connectWizard.getConnectionInfo().getJdbcDriver());
+    }
+}
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
deleted file mode 100644
index a08b34d..0000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ /dev/null
@@ -1,113 +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
- *
- *    https://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.action;
-
-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;
-import org.apache.cayenne.modeler.util.CayenneAction;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.swing.*;
-import java.sql.Connection;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-public abstract class DBWizardAction<T extends DbActionOptionsDialog> extends CayenneAction {
-	private static Logger LOGGER = LoggerFactory.getLogger(DBWizardAction.class);
-	
-    public DBWizardAction(String name, Application application) {
-        super(name, application);
-    }
-
-    protected DataSourceWizard dataSourceWizardDialog(String title) {
-        // connect
-        DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), title);
-        if (!connectWizard.startupAction()) {
-            return null;
-        }
-
-        return connectWizard;
-    }
-
-    protected abstract T createDialog(Collection<String> catalogs, Collection<String> schemas, String currentCatalog, String currentSchema, int command);
-
-    protected T loaderOptionDialog(DataSourceWizard connectWizard) {
-
-        // use this catalog as the default...
-        List<String> catalogs;
-        List<String> schemas;
-        String currentCatalog;
-        String currentSchema = null;
-        try(Connection connection = connectWizard.getDataSource().getConnection()) {
-            catalogs = getCatalogs(connectWizard, connection);
-            schemas = getSchemas(connection);
-            if (catalogs.isEmpty() && schemas.isEmpty()) {
-                return null;
-            }
-            currentCatalog = connection.getCatalog();
-			
-			try {
-	            currentSchema = connection.getSchema();
-			} catch (Throwable th) {
-                LOGGER.warn("Error getting schema.", th);
-			}
-        } catch (Exception ex) {
-            JOptionPane.showMessageDialog(
-                    Application.getFrame(),
-                    ex.getMessage(),
-                    "Error loading schemas dialog",
-                    JOptionPane.ERROR_MESSAGE);
-            return null;
-        }
-        T optionsDialog = getStartDialog(catalogs, schemas, currentCatalog, currentSchema);
-        optionsDialog.setVisible(true);
-        while ((optionsDialog.getChoice() != DbActionOptionsDialog.CANCEL)) {
-            if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
-                return optionsDialog;
-            }
-            optionsDialog = createDialog(catalogs, schemas, currentCatalog, currentSchema, optionsDialog.getChoice());
-            optionsDialog.setVisible(true);
-        }
-
-        return null;
-    }
-
-    private T getStartDialog(List<String> catalogs, List<String> schemas, String currentCatalog, String currentSchema) {
-        int command = DbActionOptionsDialog.SELECT;
-        return createDialog(catalogs, schemas, currentCatalog, currentSchema, command);
-    }
-
-    @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);
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
index 2e83a27..d870fea 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
@@ -20,23 +20,14 @@
 package org.apache.cayenne.modeler.action;
 
 import java.awt.event.ActionEvent;
-import java.util.Collection;
 
 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.pref.DataMapDefaults;
-
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
 
 /**
  * @since 4.1
  */
-public class GetDbConnectionAction extends DBWizardAction<DbActionOptionsDialog> {
+public class GetDbConnectionAction extends DBConnectionAwareAction {
 
     public static final String DIALOG_TITLE = "Configure Connection to Database";
     private static final String ACTION_NAME = "Configure Connection";
@@ -51,30 +42,11 @@ public class GetDbConnectionAction extends DBWizardAction<DbActionOptionsDialog>
     }
 
     @Override
-    protected DbActionOptionsDialog createDialog(final Collection<String> catalogs, final Collection<String> schemas,
-                                                 final String currentCatalog, final String currentSchema, final int command) {
-        // NOOP
-        return null;
-    }
-
-    @Override
     public void performAction(final ActionEvent e) {
-        final DataSourceWizard connectWizard = dataSourceWizardDialog(DIALOG_TITLE);
+        DataSourceWizard connectWizard = getDataSourceWizard(DIALOG_TITLE, new String[]{"Continue", "Cancel"});
         if (connectWizard == null) {
             return;
         }
-
-        final DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-
-        if (connectWizard.getConnectionInfo().getDbAdapter() != null) {
-            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
-        } else {
-            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
-        }
-        dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
-        dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
-        dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
-        dataMapDefaults.getCurrentPreference().put(JDBC_DRIVER_PROPERTY, connectWizard.getConnectionInfo().getJdbcDriver());
+        saveConnectionInfo(connectWizard);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
index 1d3975c..8d46749 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
@@ -23,14 +23,12 @@ import javax.swing.JOptionPane;
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
 import java.sql.SQLException;
-import java.util.prefs.Preferences;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
 import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
 import org.apache.cayenne.modeler.editor.dbimport.DatabaseSchemaLoader;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportModel;
@@ -39,21 +37,13 @@ import org.apache.cayenne.modeler.editor.dbimport.DraggableTreePanel;
 import org.apache.cayenne.modeler.editor.dbimport.PrintColumnsBiFunction;
 import org.apache.cayenne.modeler.editor.dbimport.PrintTablesBiFunction;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-import org.apache.cayenne.modeler.util.CayenneAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
-
 /**
  * @since 4.1
  */
-public class LoadDbSchemaAction extends CayenneAction {
+public class LoadDbSchemaAction extends DBConnectionAwareAction {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(LoadDbSchemaAction.class);
 
@@ -84,16 +74,10 @@ public class LoadDbSchemaAction extends CayenneAction {
             draggableTreePanel.getMoveButton().setEnabled(false);
             draggableTreePanel.getMoveInvertButton().setEnabled(false);
             try {
-                DBConnectionInfo connectionInfo;
-                if (datamapPrefNotExist()) {
-                    final DataSourceWizard connectWizard = new DataSourceWizard(getProjectController(), "Load Db Schema");
-                    if (!connectWizard.startupAction()) {
-                        return;
-                    }
-                    connectionInfo = connectWizard.getConnectionInfo();
-                    saveConnectionInfo(connectWizard);
-                } else {
-                    connectionInfo = getConnectionInfoFromPreferences();
+
+                DBConnectionInfo connectionInfo = getConnectionInfo("Load Db Schema");
+                if(connectionInfo == null) {
+                    return;
                 }
 
                 if (tablePath != null) {
@@ -161,40 +145,6 @@ public class LoadDbSchemaAction extends CayenneAction {
                         new PrintColumnsBiFunction(draggableTreePanel.getSourceTree()));
     }
 
-    private boolean datamapPrefNotExist() {
-        Preferences dataMapPreference = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap())
-                .getCurrentPreference();
-        return dataMapPreference == null || dataMapPreference.get(URL_PROPERTY, null) == null;
-    }
-
-    private DBConnectionInfo getConnectionInfoFromPreferences() {
-        DBConnectionInfo connectionInfo = new DBConnectionInfo();
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null));
-        connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, null));
-        connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY, null));
-        connectionInfo.setPassword(dataMapDefaults.getCurrentPreference().get(PASSWORD_PROPERTY, null));
-        connectionInfo.setJdbcDriver(dataMapDefaults.getCurrentPreference().get(JDBC_DRIVER_PROPERTY, null));
-        return connectionInfo;
-    }
-
-    private void saveConnectionInfo(DataSourceWizard connectWizard) {
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        String dbAdapter = connectWizard.getConnectionInfo().getDbAdapter();
-        if(dbAdapter != null) {
-            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, connectWizard.getConnectionInfo().getDbAdapter());
-        } else {
-            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
-        }
-        dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
-        dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
-        dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
-        dataMapDefaults.getCurrentPreference().put(JDBC_DRIVER_PROPERTY, connectWizard.getConnectionInfo().getJdbcDriver());
-    }
-
     public void setDraggableTreePanel(DraggableTreePanel draggableTreePanel) {
         this.draggableTreePanel = draggableTreePanel;
     }
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 5c41b31..61fcd29 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,19 +20,28 @@
 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.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.dialog.db.merge.MergerOptions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.awt.event.ActionEvent;
+import java.sql.Connection;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.JOptionPane;
 
 /**
  * Action that alter database schema to match a DataMap.
  */
-public class MigrateAction extends DBWizardAction<DbActionOptionsDialog> {
+public class MigrateAction extends DBConnectionAwareAction {
+
+    private static Logger LOGGER = LoggerFactory.getLogger(MigrateAction.class);
 
     private boolean dialogShown;
 
@@ -46,7 +55,7 @@ public class MigrateAction extends DBWizardAction<DbActionOptionsDialog> {
 
     public void performAction(ActionEvent e) {
 
-        DataSourceWizard connectWizard = dataSourceWizardDialog("Migrate DB Schema: Connect to Database");
+        DataSourceWizard connectWizard = getDataSourceWizard("Migrate DB Schema: Connect to Database");
         if(connectWizard == null) {
             return;
         }
@@ -76,16 +85,72 @@ public class MigrateAction extends DBWizardAction<DbActionOptionsDialog> {
                 map, selectedCatalog, selectedSchema, mergerTokenFactoryProvider).startupAction();
     }
 
-    @Override
     protected DbActionOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
                                                  String currentCatalog, String currentSchema, int command) {
         dialogShown = true;
-        switch (command) {
-            case DbActionOptionsDialog.SELECT:
-                return new DbActionOptionsDialog(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
+        if (command == DbActionOptionsDialog.SELECT) {
+            return new DbActionOptionsDialog(Application.getFrame(), "Migrate DB Schema: Select Catalog and Schema",
                     catalogs, schemas, currentCatalog, currentSchema);
-            default:
+        }
+        return null;
+    }
+
+    protected DbActionOptionsDialog loaderOptionDialog(DataSourceWizard connectWizard) {
+
+        // use this catalog as the default...
+        List<String> catalogs;
+        List<String> schemas;
+        String currentCatalog;
+        String currentSchema = null;
+        try(Connection connection = connectWizard.getDataSource().getConnection()) {
+            catalogs = getCatalogs(connectWizard, connection);
+            schemas = getSchemas(connection);
+            if (catalogs.isEmpty() && schemas.isEmpty()) {
                 return null;
+            }
+            currentCatalog = connection.getCatalog();
+
+            try {
+                currentSchema = connection.getSchema();
+            } catch (Throwable th) {
+                LOGGER.warn("Error getting schema.", th);
+            }
+        } catch (Exception ex) {
+            JOptionPane.showMessageDialog(
+                    Application.getFrame(),
+                    ex.getMessage(),
+                    "Error loading schemas dialog",
+                    JOptionPane.ERROR_MESSAGE);
+            return null;
+        }
+        DbActionOptionsDialog optionsDialog = getStartDialog(catalogs, schemas, currentCatalog, currentSchema);
+        optionsDialog.setVisible(true);
+        while ((optionsDialog.getChoice() != DbActionOptionsDialog.CANCEL)) {
+            if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
+                return optionsDialog;
+            }
+            optionsDialog = createDialog(catalogs, schemas, currentCatalog, currentSchema, optionsDialog.getChoice());
+            optionsDialog.setVisible(true);
+        }
+
+        return null;
+    }
+
+    private DbActionOptionsDialog getStartDialog(List<String> catalogs, List<String> schemas, String currentCatalog, String currentSchema) {
+        int command = DbActionOptionsDialog.SELECT;
+        return createDialog(catalogs, schemas, currentCatalog, currentSchema, command);
+    }
+
+    @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);
     }
 }
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 400d2e6..7930d39 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
@@ -23,35 +23,24 @@ import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
 import java.awt.event.ActionEvent;
 import java.sql.SQLException;
-import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.prefs.Preferences;
 
 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.dialog.db.DbActionOptionsDialog;
 import org.apache.cayenne.modeler.dialog.db.load.DbLoadResultDialog;
 import org.apache.cayenne.modeler.dialog.db.load.DbLoaderContext;
 import org.apache.cayenne.modeler.dialog.db.load.LoadDataMapTask;
 import org.apache.cayenne.modeler.editor.DbImportController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.pref.DataMapDefaults;
-
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
 
 /**
  * Action that imports database structure into a DataMap.
  */
-public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDialog> {
+public class ReverseEngineeringAction extends DBConnectionAwareAction {
 
     private static final String ACTION_NAME = "Reengineer Database Schema";
     private static final String ICON_NAME = "icon-dbi-runImport.png";
@@ -86,17 +75,12 @@ public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDial
 
     private void startImport(){
         final DbLoaderContext context = new DbLoaderContext(application.getMetaData());
-        DBConnectionInfo connectionInfo;
-        if (datamapPrefNotExist()) {
-            final DataSourceWizard connectWizard = dataSourceWizardDialog(DIALOG_TITLE);
-            if (connectWizard == null) {
-                return;
-            }
-            connectionInfo = connectWizard.getConnectionInfo();
-            saveConnectionInfo(connectWizard);
-        } else {
-            connectionInfo = getConnectionInfoFromPreferences();
+
+        DBConnectionInfo connectionInfo = getConnectionInfo(DIALOG_TITLE);
+        if(connectionInfo == null) {
+            return;
         }
+
         context.setProjectController(getProjectController());
         try {
             context.setConnection(connectionInfo.makeDataSource(getApplication().getClassLoadingService()).getConnection());
@@ -148,40 +132,6 @@ public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDial
         this.dataMaps = new HashSet<>();
     }
 
-    private DBConnectionInfo getConnectionInfoFromPreferences() {
-        DBConnectionInfo connectionInfo = new DBConnectionInfo();
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null));
-        connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, null));
-        connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY, null));
-        connectionInfo.setPassword(dataMapDefaults.getCurrentPreference().get(PASSWORD_PROPERTY, null));
-        connectionInfo.setJdbcDriver(dataMapDefaults.getCurrentPreference().get(JDBC_DRIVER_PROPERTY, null));
-        return connectionInfo;
-    }
-
-    private void saveConnectionInfo(DataSourceWizard connectWizard) {
-        DataMapDefaults dataMapDefaults = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap());
-        String dbAdapter = connectWizard.getConnectionInfo().getDbAdapter();
-        if(dbAdapter != null) {
-            dataMapDefaults.getCurrentPreference().put(DB_ADAPTER_PROPERTY, dbAdapter);
-        } else {
-            dataMapDefaults.getCurrentPreference().remove(DB_ADAPTER_PROPERTY);
-        }
-        dataMapDefaults.getCurrentPreference().put(URL_PROPERTY, connectWizard.getConnectionInfo().getUrl());
-        dataMapDefaults.getCurrentPreference().put(USER_NAME_PROPERTY, connectWizard.getConnectionInfo().getUserName());
-        dataMapDefaults.getCurrentPreference().put(PASSWORD_PROPERTY, connectWizard.getConnectionInfo().getPassword());
-        dataMapDefaults.getCurrentPreference().put(JDBC_DRIVER_PROPERTY, connectWizard.getConnectionInfo().getJdbcDriver());
-    }
-
-    private boolean datamapPrefNotExist() {
-        Preferences dataMapPreference = getProjectController().
-                getDataMapPreferences(getProjectController().getCurrentDataMap())
-                .getCurrentPreference();
-        return dataMapPreference == null || dataMapPreference.get(URL_PROPERTY, null) == null;
-    }
-
     private void runLoaderInThread(final DbLoaderContext context, final Runnable callback) {
         Thread th = new Thread(() -> {
             LoadDataMapTask task = new LoadDataMapTask(Application.getFrame(), "Reengineering DB", context);
@@ -191,13 +141,6 @@ public class ReverseEngineeringAction extends DBWizardAction<DbActionOptionsDial
         th.start();
     }
 
-    @Override
-    protected DbActionOptionsDialog createDialog(Collection<String> catalogs, Collection<String> schemas,
-                                                 String currentCatalog, String currentSchema, int command) {
-        // NOOP
-        return null;
-    }
-
     public void setView(DbImportView view) {
         this.view = view;
     }
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 4070b5a..9ad45a4 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
@@ -33,7 +33,6 @@ import java.util.prefs.Preferences;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.action.GetDbConnectionAction;
 import org.apache.cayenne.modeler.dialog.pref.GeneralPreferences;
 import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
 import org.apache.cayenne.modeler.event.DataSourceModificationEvent;
@@ -44,11 +43,7 @@ import org.apache.cayenne.modeler.util.CayenneController;
 import org.apache.cayenne.swing.BindingBuilder;
 import org.apache.cayenne.swing.ObjectBinding;
 
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.DB_ADAPTER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.JDBC_DRIVER_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.PASSWORD_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.URL_PROPERTY;
-import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERTY;
+import static org.apache.cayenne.modeler.pref.DBConnectionInfo.*;
 
 /**
  * A subclass of ConnectionWizard that tests configured DataSource, but does not
@@ -57,52 +52,43 @@ import static org.apache.cayenne.modeler.pref.DBConnectionInfo.USER_NAME_PROPERT
  */
 public class DataSourceWizard extends CayenneController {
 
-	private DataSourceWizardView view;
+	private final ProjectController projectController;
+	private final DataSourceWizardView view;
+	private final String[] buttons;
+
 	private ObjectBinding dataSourceBinding;
 	private Map<String, DBConnectionInfo> dataSources;
 	private String dataSourceKey;
-	private ProjectController projectController;
-
-	// this object is a clone of an object selected from the dropdown, as we
-	// need to allow
-	// local temporary modifications
+	// this object is a clone of an object selected from the dropdown, as we need to allow local temporary modifications
 	private DBConnectionInfo connectionInfo;
-
+	private DbAdapter adapter;
+	private DataSource dataSource;
 	private boolean canceled;
-
 	private DataSourceModificationListener dataSourceListener;
 
-	private DbAdapter adapter;
-	private DataSource dataSource;
+	public DataSourceWizard(ProjectController parent, String title) {
+		this(parent, title, new String[]{"Continue", "Cancel"});
+	}
 
-	public DataSourceWizard(final CayenneController parent, final String title) {
+	public DataSourceWizard(ProjectController parent, String title, String[] buttons) {
 		super(parent);
 
-		this.view = createView(title);
-		this.view.setTitle(title);
+		this.buttons = buttons;
 		this.connectionInfo = new DBConnectionInfo();
-		this.projectController = (ProjectController) parent;
+		this.projectController = parent;
+
+		this.view = createView();
+		this.view.setTitle(title);
 
 		initBindings();
 		initDataSourceListener();
 	}
 
-	private String[] getLabelsForDialog(final String viewTitle) {
-		switch (viewTitle) {
-			case GetDbConnectionAction.DIALOG_TITLE: {
-				return new String[]{"Save", "Cancel"};
-			}
-			default:
-				return new String[]{"Continue", "Cancel"};
-		}
-	}
-
 	/**
 	 * Creates swing dialog for this wizard
 	 */
-	private DataSourceWizardView createView(final String viewTitle) {
-		final String[] labels = getLabelsForDialog(viewTitle);
-		return new DataSourceWizardView(this, labels);
+	private DataSourceWizardView createView() {
+		return new DataSourceWizardView(this, buttons);
 	}
 
 	protected void initBindings() {
@@ -145,9 +131,9 @@ public class DataSourceWizard extends CayenneController {
 	}
 
 	private DBConnectionInfo getConnectionInfoFromPreferences() {
-		final DBConnectionInfo connectionInfo = new DBConnectionInfo();
-		final DataMapDefaults dataMapDefaults = projectController.
-				getDataMapPreferences(projectController.getCurrentDataMap());
+		DBConnectionInfo connectionInfo = new DBConnectionInfo();
+		DataMapDefaults dataMapDefaults = getProjectController()
+				.getDataMapPreferences(getProjectController().getCurrentDataMap());
 		connectionInfo.setDbAdapter(dataMapDefaults.getCurrentPreference().get(DB_ADAPTER_PROPERTY, null));
 		connectionInfo.setUrl(dataMapDefaults.getCurrentPreference().get(URL_PROPERTY, null));
 		connectionInfo.setUserName(dataMapDefaults.getCurrentPreference().get(USER_NAME_PROPERTY, null));
@@ -156,6 +142,10 @@ public class DataSourceWizard extends CayenneController {
 		return connectionInfo;
 	}
 
+	private ProjectController getProjectController() {
+		return projectController;
+	}
+
 	public String getDataSourceKey() {
 		return dataSourceKey;
 	}
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
index 4d05655..0261d23 100644
--- 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
@@ -249,8 +249,7 @@ public class DBGeneratorOptions extends CayenneController {
      */
     public void generateSchemaAction() {
 
-        DataSourceWizard connectWizard = new DataSourceWizard(
-                this.getParent(),
+        DataSourceWizard connectWizard = new DataSourceWizard((ProjectController) this.getParent(),
                 "Generate DB Schema: Connect to Database");
         if (!connectWizard.startupAction()) {
             return;