http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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
new file mode 100644
index 0000000..287e703
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -0,0 +1,77 @@
+/*****************************************************************
+ *   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.action;
+
+import java.awt.event.ActionEvent;
+import java.sql.Connection;
+
+import javax.swing.SwingUtilities;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
+import org.apache.cayenne.map.naming.NameCheckers;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.CayenneModelerController;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringController;
+import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper;
+import org.apache.cayenne.modeler.dialog.db.ReverseEngineeringScrollPane;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.util.CayenneAction;
+
+/**
+ * Action that imports database structure into a DataMap.
+ */
+public class ReverseEngineeringAction extends CayenneAction {
+
+    public static String getActionName() {
+        return "Reengineer Database Schema";
+    }
+
+    public ReverseEngineeringAction(Application application) {
+        super(getActionName(), application);
+    }
+
+    /**
+     * Connects to DB and delegates processing to DbLoaderController, starting 
it
+     * asynchronously.
+     */
+    @Override
+    public void performAction(ActionEvent event) {
+        ProjectController projectController = getProjectController();
+        DataMap dataMap = projectController.getCurrentDataMap();
+        DataChannelDescriptor dataChannelDescriptor = 
projectController.getCurrentDataChanel();
+        if (dataMap == null) {
+            dataMap = new 
DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap));
+            
dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, 
projectController.getProject().getRootNode()));
+            dataChannelDescriptor.getDataMaps().add(dataMap);
+            getProjectController().fireDataMapEvent(new DataMapEvent(this, 
dataMap, MapEvent.ADD));
+        }
+
+        ((CayenneModelerController) projectController.getParent())
+                .getEditorView()
+                .getDataMapView()
+                .setSelectedIndex(1);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 dfe24b3..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ConnectionWizard.java
+++ /dev/null
@@ -1,89 +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.sql.Connection;
-
-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;
-
-/**
- * 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;
-        }
-        
-        // set success flag, and unblock the caller...
-        canceled = false;
-        view.dispose();
-    }
-
-    /**
-     * 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/fe82b47e/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
index 4e277d1..1747c87 100644
--- 
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
@@ -249,7 +249,7 @@ public class DBGeneratorOptions extends CayenneController {
      */
     public void generateSchemaAction() {
 
-        DataSourceWizard connectWizard = new DataSourceWizard(
+        DataSourceController connectWizard = new DataSourceController(
                 this.getParent(),
                 "Generate DB Schema: Connect to Database",
                 null,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java
new file mode 100644
index 0000000..1748207
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataMapViewModel.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.modeler.dialog.db;
+
+import org.apache.cayenne.modeler.dialog.db.model.DBModel;
+
+/**
+ * @since 4.0
+ */
+public class DataMapViewModel {
+    private final String dataMapName;
+
+    private String reverseEngineeringText;
+    private DBModel reverseEngineeringTree;
+
+    public DataMapViewModel(String dataMapName) {
+        this.dataMapName = dataMapName;
+    }
+
+    public String getReverseEngineeringText() {
+        return reverseEngineeringText;
+    }
+
+    public void setReverseEngineeringText(String reverseEngineeringText) {
+        this.reverseEngineeringText = reverseEngineeringText;
+    }
+
+    public DBModel getReverseEngineeringTree() {
+        return reverseEngineeringTree;
+    }
+
+    public void setReverseEngineeringTree(DBModel reverseEngineeringTree) {
+        this.reverseEngineeringTree = reverseEngineeringTree;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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
new file mode 100644
index 0000000..2ba7819
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceController.java
@@ -0,0 +1,219 @@
+/*****************************************************************
+ *   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/fe82b47e/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
new file mode 100644
index 0000000..3258a54
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceView.java
@@ -0,0 +1,100 @@
+/*****************************************************************
+ *   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/fe82b47e/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
deleted file mode 100644
index 3ca4a9f..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizard.java
+++ /dev/null
@@ -1,224 +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 javax.swing.DefaultComboBoxModel;
-import javax.swing.WindowConstants;
-
-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;
-
-/**
- * A subclass of ConnectionWizard that tests configured DataSource, but does 
not
- * keep an open connection.
- * 
- */
-public class DataSourceWizard extends CayenneController {
-
-       protected DataSourceWizardView 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 DataSourceWizard(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 DataSourceWizardView createView() {
-               return new DataSourceWizardView(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();
-               }
-       }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.java
deleted file mode 100644
index 10cf0d7..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DataSourceWizardView.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 DataSourceWizardView extends JDialog {
-
-    protected JComboBox dataSources;
-    protected JButton configButton;
-    protected JButton okButton;
-    protected JButton cancelButton;
-    protected DBConnectionInfoEditor connectionInfo;
-
-    public DataSourceWizardView(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;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
new file mode 100644
index 0000000..b131dd8
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbImportActionModeler.java
@@ -0,0 +1,120 @@
+package org.apache.cayenne.modeler.dialog.db; 
/*****************************************************************
+ *   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.
+ ****************************************************************/
+
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.MapLoader;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.resource.Resource;
+import org.apache.cayenne.tools.dbimport.DbImportAction;
+import org.apache.cayenne.tools.dbimport.DbImportActionDefault;
+import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
+import org.apache.commons.logging.Log;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.sql.Connection;
+
+public class DbImportActionModeler implements DbImportAction {
+
+    private final Log logger;
+
+    private final DbLoaderHelper dbLoaderHelper;
+
+    @Inject
+    private ProjectSaver projectSaver;
+
+    @Inject
+    private DataSourceFactory dataSourceFactory;
+
+    @Inject
+    private DbAdapterFactory adapterFactory;
+
+    @Inject
+    private MapLoader mapLoader;
+
+    public DbImportActionModeler(Log logger, DbLoaderHelper dbLoaderHelper) {
+        this.logger = logger;
+        this.dbLoaderHelper = dbLoaderHelper;
+    }
+
+    @Override
+    public void execute(DbImportConfiguration config) throws Exception {
+        if (dbLoaderHelper == null) {
+            throw new IllegalStateException("Before using execute method you 
must set dbLoaderHelper");
+        }
+
+        new DbImportActionDefault(logger, projectSaver, dataSourceFactory, 
adapterFactory, mapLoader) {
+
+            @Override
+            protected DataMap loadExistingDataMap(File dataMapFile) {
+                return dbLoaderHelper.getDataMap();
+            }
+
+            @Override
+            protected void saveLoaded(DataMap dataMap) {
+                dbLoaderHelper.cleanup();
+
+                ProjectController mediator = dbLoaderHelper.getMediator();
+
+                if (mediator.getCurrentDataMap() != null) {
+                    mediator.fireDataMapEvent(new 
DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
+                    mediator.fireDataMapEvent(new 
DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
+                } else {
+                    DataChannelDescriptor currentDomain = 
(DataChannelDescriptor) mediator.getProject().getRootNode();
+                    Resource baseResource = 
currentDomain.getConfigurationSource();
+
+                    // this will be new data map so need to set configuration 
source
+                    // for it
+                    if (baseResource != null) {
+                        Resource dataMapResource = 
baseResource.getRelativeResource(dataMap.getName());
+                        dataMap.setConfigurationSource(dataMapResource);
+                    }
+                    mediator.addDataMap(Application.getFrame(), dataMap);
+                }
+            }
+
+            @Override
+            protected DataMap load(DbImportConfiguration config, DbAdapter 
adapter, Connection connection) throws Exception {
+                DataMap dataMap;
+
+                try {
+                    dataMap = 
dbLoaderHelper.getLoader().load(config.getDbLoaderConfig());
+                } finally {
+                    if (connection != null) {
+                        connection.close();
+                    }
+                }
+
+                return dataMap;
+            }
+        }.execute(config);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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
index d81e498..721bf76 100644
--- 
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
@@ -21,13 +21,13 @@ package org.apache.cayenne.modeler.dialog.db;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.access.DbLoader;
-import org.apache.cayenne.access.loader.DbLoaderConfiguration;
 import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate;
-import org.apache.cayenne.access.loader.filters.OldFilterConfigBridge;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DefaultConfigurationNameMapper;
-import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbimport.FiltersConfigBuilder;
+import org.apache.cayenne.dbimport.ReverseEngineering;
+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;
@@ -38,12 +38,11 @@ import 
org.apache.cayenne.map.naming.DefaultUniqueNameGenerator;
 import org.apache.cayenne.map.naming.NameCheckers;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
-import org.apache.cayenne.modeler.event.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.util.LongRunningTask;
-import org.apache.cayenne.resource.Resource;
-import org.apache.cayenne.tools.dbimport.config.FiltersConfigBuilder;
-import org.apache.cayenne.tools.dbimport.config.ReverseEngineering;
-import org.apache.cayenne.util.DeleteRuleUpdater;
+import org.apache.cayenne.tools.configuration.ToolsModule;
+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;
@@ -51,16 +50,15 @@ import org.apache.commons.logging.LogFactory;
 import javax.swing.JFrame;
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
+import java.io.File;
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
 /**
  * Stateful helper class that encapsulates access to DbLoader.
- * 
  */
 public class DbLoaderHelper {
 
@@ -75,17 +73,14 @@ public class DbLoaderHelper {
     protected boolean existingMap;
 
     protected ProjectController mediator;
-    protected String dbUserName;
     protected String dbCatalog;
     protected DbLoader loader;
     protected DataMap dataMap;
-    protected boolean meaningfulPk;
     protected List<String> schemas;
     protected List<String> catalogs;
     protected DbAdapter adapter;
-
-    private final OldFilterConfigBridge filterBuilder = new 
OldFilterConfigBridge();
-
+    protected DbImportConfiguration config;
+    protected ReverseEngineering reverseEngineering;
     protected String loadStatusNote;
 
     /**
@@ -93,8 +88,8 @@ public class DbLoaderHelper {
      */
     protected List<ObjEntity> addedObjEntities;
 
-    public DbLoaderHelper(ProjectController mediator, Connection connection, 
DbAdapter adapter, String dbUserName) {
-        this.dbUserName = dbUserName;
+    public DbLoaderHelper(ProjectController mediator, Connection connection, 
DbAdapter adapter,
+                          DBConnectionInfo dbConnectionInfo, 
ReverseEngineering reverseEngineering) {
         this.mediator = mediator;
         try {
             this.dbCatalog = connection.getCatalog();
@@ -102,7 +97,24 @@ public class DbLoaderHelper {
             logObj.warn("Error getting catalog.", e);
         }
         this.adapter = adapter;
-        this.loader = new DbLoader(connection, adapter, new LoaderDelegate());
+        this.reverseEngineering = reverseEngineering;
+
+        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());
+        try {
+            this.dbCatalog = connection.getCatalog();
+        } catch (SQLException e) {
+            logObj.warn("Error getting catalog.", e);
+        }
+        try {
+            this.loader = config.createLoader(adapter, connection, new 
LoaderDelegate());
+        } catch (Throwable th) {
+            processException(th, "Error creating DbLoader.");
+        }
     }
 
     public void setStoppingReverseEngineering(boolean stopReverseEngineering) {
@@ -113,6 +125,10 @@ public class DbLoaderHelper {
         return stoppingReverseEngineering;
     }
 
+    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
@@ -139,41 +155,11 @@ public class DbLoaderHelper {
             return;
         }
 
-        final DbLoaderOptionsDialog dialog = new 
DbLoaderOptionsDialog(schemas, catalogs, dbUserName, dbCatalog, false);
-
-        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;
-        }
-
-        this.filterBuilder.catalog(dialog.getSelectedCatalog());
-        this.filterBuilder.schema(dialog.getSelectedSchema());
-        this.filterBuilder.includeTables(dialog.getTableNamePattern());
-        this.filterBuilder.setProceduresFilters(dialog.isLoadingProcedures());
-        this.filterBuilder.includeProcedures(dialog.getProcedureNamePattern());
+        this.loader.setCreatingMeaningfulPK(true);
 
-        this.meaningfulPk = dialog.isMeaningfulPk();
-        this.addedObjEntities = new ArrayList<ObjEntity>();
-
-        this.loader.setNameGenerator(dialog.getNamingStrategy());
-
-        // load DataMap...
         LongRunningTask loadDataMapTask = new 
LoadDataMapTask(Application.getFrame(), "Reengineering DB");
         loadDataMapTask.startAndWait();
+
     }
 
     protected void processException(final Throwable th, final String message) {
@@ -222,7 +208,6 @@ public class DbLoaderHelper {
             checkCanceled();
 
             loadStatusNote = "Creating ObjEntity '" + entity.getName() + 
"'...";
-            addedObjEntities.add(entity);
 
             if (existingMap) {
                 mediator.fireObjEntityEvent(new EntityEvent(this, entity, 
MapEvent.ADD));
@@ -346,7 +331,8 @@ public class DbLoaderHelper {
         }
     }
 
-    final class LoadDataMapTask extends DbLoaderTask {
+
+    public final class LoadDataMapTask extends DbLoaderTask {
 
         public LoadDataMapTask(JFrame frame, String title) {
             super(frame, title);
@@ -363,80 +349,49 @@ public class DbLoaderHelper {
             if (!existingMap) {
                 dataMap = new 
DataMap(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap));
                 
dataMap.setName(DefaultUniqueNameGenerator.generate(NameCheckers.dataMap, 
mediator.getProject().getRootNode()));
-                dataMap.setDefaultCatalog(filterBuilder.catalog());
-                dataMap.setDefaultSchema(filterBuilder.schema());
             }
 
             if (isCanceled()) {
                 return;
             }
 
-            importingTables();
-            importingProcedures();
-
-            cleanup();
-
-            // fire up events
-            loadStatusNote = "Updating view...";
-            if (mediator.getCurrentDataMap() != null) {
-                mediator.fireDataMapEvent(new 
DataMapEvent(Application.getFrame(), dataMap, MapEvent.CHANGE));
-                mediator.fireDataMapDisplayEvent(new 
DataMapDisplayEvent(Application.getFrame(), dataMap,
-                        (DataChannelDescriptor) 
mediator.getProject().getRootNode(), mediator.getCurrentDataNode()));
-            } else {
-                DataChannelDescriptor currentDomain = (DataChannelDescriptor) 
mediator.getProject().getRootNode();
-                Resource baseResource = currentDomain.getConfigurationSource();
-
-                // this will be new data map so need to set configuration 
source
-                // for it
-                if (baseResource != null) {
-                    DefaultConfigurationNameMapper nameMapper = new 
DefaultConfigurationNameMapper();
-                    Resource dataMapResource = 
baseResource.getRelativeResource(nameMapper.configurationLocation(dataMap));
-                    dataMap.setConfigurationSource(dataMapResource);
+            DataMap dataMap = mediator.getCurrentDataMap();
+            DataChannelDescriptor dataChannelDescriptor = 
mediator.getCurrentDataChanel();
+            if (dataMap.getReverseEngineering() != null) {
+                if (dataMap.getReverseEngineering().getName() != null) {
+                    
reverseEngineering.setName(dataMap.getReverseEngineering().getName());
+                    
reverseEngineering.setConfigurationSource(dataMap.getReverseEngineering().getConfigurationSource());
                 }
-                mediator.addDataMap(Application.getFrame(), dataMap);
+            } else {
+                
reverseEngineering.setName(DefaultUniqueNameGenerator.generate(NameCheckers.reverseEngineering,
 dataChannelDescriptor));
             }
-        }
 
-        private void importingProcedures() {
-            if (!filterBuilder.isLoadProcedures()) {
-                return;
+            if (dataMap.getConfigurationSource() != null) {
+                config.setDataMapFile(new 
File(dataMap.getConfigurationSource().getURL().getPath()));
             }
 
-            loadStatusNote = "Importing procedures...";
-            try {
-                DbLoaderConfiguration configuration = new 
DbLoaderConfiguration();
-                configuration.setFiltersConfig(new FiltersConfigBuilder(new 
ReverseEngineering())
-                        .add(filterBuilder).filtersConfig());
+            FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(reverseEngineering);
+            
config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.filtersConfig());
 
-                loader.loadProcedures(dataMap, new DbLoaderConfiguration());
-            } catch (Throwable th) {
-                if (!isCanceled()) {
-                    processException(th, "Error Reengineering Database");
-                }
-            }
-        }
 
-        private void importingTables() {
-            loadStatusNote = "Importing tables...";
+            DbImportActionModeler importAction = new 
DbImportActionModeler(logObj, DbLoaderHelper.this);
+            Injector injector = DIBootstrap.createInjector(new 
ToolsModule(logObj), new DbImportModule());
+            injector.injectMembers(importAction);
             try {
-                loader.setCreatingMeaningfulPK(meaningfulPk);
-               
-                DbLoaderConfiguration configuration = new 
DbLoaderConfiguration();
-                configuration.setFiltersConfig(new FiltersConfigBuilder(new 
ReverseEngineering())
-                        .add(filterBuilder).filtersConfig());
-                loader.load(dataMap, configuration);
-
-                /**
-                 * Update default rules for relationships
-                 */
-                for (ObjEntity addedObjEntity : addedObjEntities) {
-                    DeleteRuleUpdater.updateObjEntity(addedObjEntity);
-                }
-            } catch (Throwable th) {
-                if (!isCanceled()) {
-                    processException(th, "Error Reengineering Database");
-                }
+                importAction.execute(config);
+                dataMap.setReverseEngineering(reverseEngineering);
+            } catch (Exception e) {
+                processException(e, "Error importing database schema.");
             }
         }
     }
+
+    protected ProjectController getMediator() {
+        return mediator;
+    }
+
+    protected DbLoader getLoader() {
+        return loader;
+    }
+       
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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 713e459..0000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/DbLoaderOptionsDialog.java
+++ /dev/null
@@ -1,308 +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.access.DbLoader;
-import org.apache.cayenne.map.naming.ObjectNameGenerator;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ClassLoadingService;
-import org.apache.cayenne.modeler.util.CayenneDialog;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-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 {
-
-    private static final Log logObj = 
LogFactory.getLog(DbLoaderOptionsDialog.class);
-
-    public static final int CANCEL = 0;
-    public static final int SELECT = 1;
-
-    protected JLabel catalogLabel;
-    protected JComboBox catalogSelector;
-    protected JLabel schemaLabel;
-    protected JComboBox schemaSelector;
-    protected JTextField tableNamePatternField;
-    protected JCheckBox loadProcedures;
-    protected JCheckBox meaningfulPk;
-    protected JTextField procNamePatternField;
-    protected JLabel procedureLabel;
-    protected JButton selectButton;
-    protected JButton cancelButton;
-
-    /**
-     * Combobox for naming strategy
-     */
-    protected JComboBox strategyCombo;
-
-    protected ObjectNameGenerator strategy;
-
-    protected int choice;
-
-    /**
-     * Creates and initializes new ChooseSchemaDialog.
-     */
-    public DbLoaderOptionsDialog(Collection<String> schemas, 
Collection<String> catalogs, String dbUserName,
-            String dbCatalog, boolean loadProcedures) {
-        super(Application.getFrame(), "Reengineer DB Schema: Select Options");
-
-        init();
-        initController();
-        initFromModel(schemas, catalogs, dbUserName, dbCatalog, 
loadProcedures);
-
-        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();
-        procNamePatternField = new JTextField();
-        loadProcedures = new JCheckBox();
-        meaningfulPk = new JCheckBox();
-        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);
-        builder.append("Load Procedures:", loadProcedures);
-        procedureLabel = builder.append("Procedure Name Pattern:", 
procNamePatternField);
-        builder.append("Naming Strategy:", strategyCombo);
-        builder.append("Meaningful PK", 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();
-            }
-        });
-
-        loadProcedures.addChangeListener(new ChangeListener() {
-
-            public void stateChanged(ChangeEvent e) {
-                procNamePatternField.setEnabled(loadProcedures.isSelected());
-                procedureLabel.setEnabled(loadProcedures.isSelected());
-            }
-        });
-    }
-
-    protected void initFromModel(
-            Collection<String> schemas,
-            Collection<String> catalogs,
-            String dbUserName,
-            String dbCatalog,
-            boolean shouldLoadProcedures) {
-
-        this.choice = CANCEL;
-        this.tableNamePatternField.setText(DbLoader.WILDCARD_PATTERN);
-        this.loadProcedures.setSelected(shouldLoadProcedures);
-        this.procNamePatternField.setText(DbLoader.WILDCARD_PATTERN);
-        this.procNamePatternField.setEnabled(shouldLoadProcedures);
-        this.procedureLabel.setEnabled(shouldLoadProcedures);
-
-        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()));
-
-            // select schema belonging to the user
-            if (dbUserName != null) {
-                for (String schema : schemas) {
-                    if (dbUserName.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()));
-
-            if (dbCatalog != null && !dbCatalog.isEmpty()) {
-                for (String catalog : catalogs) {
-                    if (dbCatalog.equalsIgnoreCase(catalog)) {
-                        catalogSelector.setSelectedItem(catalog);
-                        break;
-                    }
-                }
-            }
-        }
-
-    }
-
-    public int getChoice() {
-        return choice;
-    }
-
-    private void processSelect() {
-        try {
-            ClassLoadingService classLoader = Application
-                    .getInstance()
-                    .getClassLoadingService();
-            String strategyClass = (String) strategyCombo.getSelectedItem();
-
-            this.strategy = classLoader
-                    .loadClass(ObjectNameGenerator.class, strategyClass)
-                    .newInstance();
-
-            /**
-             * Be user-friendly and update preferences with specified strategy
-             */
-            NameGeneratorPreferences
-                    .getInstance()
-                    .addToLastUsedStrategies(strategyClass);
-        }
-        catch (Throwable th) {
-            logObj.error("Error in " + getClass().getName(), th);
-
-            JOptionPane.showMessageDialog(
-                    this,
-                    "Naming Strategy Initialization Error: " + th.getMessage(),
-                    "Naming Strategy Initialization Error",
-                    JOptionPane.ERROR_MESSAGE);
-
-            return;
-        }
-
-        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 boolean isLoadingProcedures() {
-        return loadProcedures.isSelected();
-    }
-
-    public boolean isMeaningfulPk() {
-        return meaningfulPk.isSelected();
-    }
-
-    /**
-     * Returns the procedure name pattern.
-     */
-    public String getProcedureNamePattern() {
-        return "".equals(procNamePatternField.getText()) ? null : 
procNamePatternField
-                .getText();
-    }
-
-    /**
-     * Returns configured naming strategy
-     */
-    public ObjectNameGenerator getNamingStrategy() {
-        return strategy;
-    }
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/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
index bd2cf69..b18fe9c 100644
--- 
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
@@ -68,15 +68,11 @@ 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.config.FiltersConfigBuilder;
-import org.apache.cayenne.tools.dbimport.config.ReverseEngineering;
-import org.apache.cayenne.tools.dbimport.config.Schema;
 import org.apache.cayenne.validation.ValidationResult;
 
 public class MergerOptions extends CayenneController {
 
     protected MergerOptionsView view;
-    // protected ObjectBinding[] optionBindings;
     protected ObjectBinding sqlBinding;
 
     protected DBConnectionInfo connectionInfo;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
new file mode 100644
index 0000000..f084187
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringController.java
@@ -0,0 +1,362 @@
+/*****************************************************************
+ * 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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.DbLoader;
+import org.apache.cayenne.access.loader.DbLoaderConfiguration;
+import org.apache.cayenne.access.loader.DefaultDbLoaderDelegate;
+import org.apache.cayenne.access.loader.filters.CatalogFilter;
+import org.apache.cayenne.access.loader.filters.SchemaFilter;
+import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dbimport.FiltersConfigBuilder;
+import org.apache.cayenne.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbimport.ReverseEngineeringLoaderException;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.db.model.DBCatalog;
+import org.apache.cayenne.modeler.dialog.db.model.DBColumn;
+import org.apache.cayenne.modeler.dialog.db.model.DBElement;
+import org.apache.cayenne.modeler.dialog.db.model.DBEntity;
+import org.apache.cayenne.modeler.dialog.db.model.DBModel;
+import org.apache.cayenne.modeler.dialog.db.model.DBProcedure;
+import org.apache.cayenne.modeler.dialog.db.model.DBSchema;
+import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog;
+import org.apache.cayenne.modeler.dialog.pref.TreeEditor;
+import org.apache.cayenne.modeler.dialog.pref.XMLFileEditor;
+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 org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.SwingUtilities;
+import java.awt.Component;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A component for performing reverse engineering. Users can choose required 
dataMap and execute
+ * reverse engineering. Also they can see tree view of db objects clicking on 
sync button.
+ */
+public class ReverseEngineeringController extends CayenneController {
+    private static final Log LOGGER = 
LogFactory.getLog(ReverseEngineeringController.class);
+
+    protected ProjectController projectController;
+    protected ReverseEngineeringView view;
+    protected Map<String, DataMapViewModel> reverseEngineeringMap;
+    protected DBModel dbModel;
+
+    protected Connection connection;
+    protected DbAdapter adapter;
+
+    protected DBConnectionInfo connectionInfo;
+    protected ObjectBinding dataSourceBinding;
+    protected Map dataSources;
+    protected String dataSourceKey;
+    protected boolean canceled;
+
+    public ReverseEngineeringController(ProjectController controller,
+                                        ReverseEngineeringView source) {
+        super(controller);
+        this.projectController = controller;
+        this.view = source;
+
+        this.connectionInfo = new DBConnectionInfo();
+        this.reverseEngineeringMap = view.getReverseEngineeringViewMap();
+        initBindings();
+        refreshDataSources();
+    }
+
+    protected void initBindings() {
+        BindingBuilder builder = new 
BindingBuilder(getApplication().getBindingFactory(), this);
+
+        dataSourceBinding = 
builder.bindToComboSelection(view.getDataSources(), "dataSourceKey");
+
+        builder.bindToAction(view.getSyncButton(), "syncAction()");
+        builder.bindToAction(view.getExecuteButton(), "executeAction()");
+        builder.bindToAction(view.getConfigButton(), 
"dataSourceConfigAction()");
+    }
+
+    private void buildDBProperties() throws Exception {
+        ClassLoadingService classLoader = 
getApplication().getClassLoadingService();
+        this.connection = 
connectionInfo.makeDataSource(classLoader).getConnection();
+        this.adapter = connectionInfo.makeAdapter(classLoader);
+    }
+
+    public void syncAction() throws SQLException {
+        final TreeEditor treeEditor = view.getTreeEditor();
+        XMLFileEditor xmlFileEditor = view.getXmlFileEditor();
+        xmlFileEditor.removeAlertMessage();
+        try {
+            buildDBProperties();
+
+            DbLoader dbLoader = new DbLoader(connection, adapter, new 
DefaultDbLoaderDelegate()) {
+                @Override
+                public DataMap load(DbLoaderConfiguration config) throws 
SQLException {
+                    DataMap dataMap = new DataMap();
+                    Map<String, Procedure> procedureMap = 
loadProcedures(dataMap, config);
+                    load(dataMap, config, procedureMap);
+                    return dataMap;
+                }
+
+                public void load(DataMap dataMap, DbLoaderConfiguration 
config, Map<String, Procedure> procedureMap
+                )
+                        throws SQLException {
+                    LOGGER.info("Schema loading...");
+
+                    String[] types = config.getTableTypes();
+                    if (types == null || types.length == 0) {
+                        types = getDefaultTableTypes();
+                    }
+
+                    treeEditor.setRoot(dataSourceKey);
+                    dbModel = new DBModel(dataSourceKey);
+                    boolean catalogSetted = false;
+                    DBElement currentDBCatalog = null;
+                    DBElement currentDBSchema = null;
+
+                    for (CatalogFilter catalog : 
config.getFiltersConfig().catalogs) {
+                        for (SchemaFilter schema : catalog.schemas) {
+                            boolean entityChecked = false;
+                            List<DbEntity> entityList = 
createTableLoader(catalog.name, schema.name, schema.tables).loadDbEntities(
+                                    dataMap, config, types);
+                            DbEntity entityFromLoader = entityList.get(0);
+
+                            if (entityFromLoader != null) {
+                                if (catalogSetted == false && 
entityFromLoader.getCatalog() != null) {
+                                    currentDBCatalog = new 
DBCatalog(entityFromLoader.getCatalog());
+                                    dbModel.addElement(currentDBCatalog);
+                                    catalogSetted = true;
+                                }
+
+                                if (entityFromLoader.getSchema() != null) {
+                                    currentDBSchema = new 
DBSchema(entityFromLoader.getSchema());
+                                    if(currentDBCatalog != null) {
+                                        
currentDBCatalog.addElement(currentDBSchema);
+                                    } else {
+                                        dbModel.addElement(currentDBSchema);
+                                    }
+                                }
+                                entityChecked = true;
+                            }
+
+                            if (!entityChecked && !procedureMap.isEmpty()) {
+                                Map.Entry<String, Procedure> entry = 
procedureMap.entrySet().iterator().next();
+                                Procedure procedure = entry.getValue();
+
+                                if (catalogSetted && procedure.getCatalog() != 
null) {
+                                    currentDBCatalog = new 
DBCatalog(procedure.getCatalog());
+                                    dbModel.addElement(currentDBCatalog);
+                                    catalogSetted = true;
+                                }
+
+                                if (procedure.getSchema() != null) {
+                                    currentDBSchema = new 
DBSchema(procedure.getSchema());
+                                    if(currentDBCatalog != null) {
+                                        
currentDBCatalog.addElement(currentDBSchema);
+                                    } else {
+                                        dbModel.addElement(currentDBSchema);
+                                    }
+                                }
+                            }
+
+                            DBEntity currentDBEntity;
+                            if (currentDBSchema != null) {
+                                for (DbEntity dbEntity : entityList) {
+                                    currentDBEntity = new 
DBEntity(dbEntity.getName());
+                                    
currentDBSchema.addElement(currentDBEntity);
+                                    for (DbAttribute dbColumn : 
dbEntity.getAttributes()) {
+                                        currentDBEntity.addElement(new 
DBColumn(dbColumn.getName()));
+                                    }
+                                }
+                            } else {
+                                for (DbEntity dbEntity : entityList) {
+                                    currentDBEntity = new 
DBEntity(dbEntity.getName());
+                                    for (DbAttribute dbColumn : 
dbEntity.getAttributes()) {
+                                        currentDBEntity.addElement(new 
DBColumn(dbColumn.getName()));
+                                    }
+                                    
currentDBCatalog.addElement(currentDBEntity);
+                                }
+                            }
+
+                            if (currentDBSchema != null) {
+                                for (Map.Entry<String, Procedure> entry : 
procedureMap.entrySet()) {
+                                    currentDBSchema.addElement(new 
DBProcedure(entry.getValue().getName()));
+                                }
+                            } else {
+                                for (Map.Entry<String, Procedure> entry : 
procedureMap.entrySet()) {
+                                    currentDBCatalog.addElement(new 
DBProcedure(entry.getValue().getName()));
+                                }
+                            }
+                            currentDBSchema = null;
+                        }
+                        catalogSetted = false;
+                        currentDBCatalog = null;
+                    }
+                }
+            };
+
+            ReverseEngineering reverseEngineering = 
xmlFileEditor.convertTextIntoReverseEngineering();
+
+            FiltersConfigBuilder filtersConfigBuilder = new 
FiltersConfigBuilder(reverseEngineering);
+            DbLoaderConfiguration dbLoaderConfiguration = new 
DbLoaderConfiguration();
+            
dbLoaderConfiguration.setFiltersConfig(filtersConfigBuilder.filtersConfig());
+
+            dbLoader.load(dbLoaderConfiguration);
+
+            String mapName = projectController.getCurrentDataMap().getName();
+
+            DataMapViewModel dataMapViewModel = new DataMapViewModel(mapName);
+            dataMapViewModel.setReverseEngineeringTree(dbModel);
+            
dataMapViewModel.setReverseEngineeringText(xmlFileEditor.getView().getEditorPane().getText());
+            reverseEngineeringMap.put(mapName, dataMapViewModel);
+            treeEditor.convertTreeViewIntoTreeNode(dbModel);
+        } catch (ReverseEngineeringLoaderException e) {
+            xmlFileEditor.addAlertMessage(e.getMessage());
+        } catch (Exception e) {
+            xmlFileEditor.addAlertMessage(e.getMessage());
+        }
+    }
+
+    public void executeAction() {
+        XMLFileEditor xmlFileEditor = view.getXmlFileEditor();
+        xmlFileEditor.removeAlertMessage();
+        try {
+            buildDBProperties();
+
+            ReverseEngineering reverseEngineering = 
xmlFileEditor.convertTextIntoReverseEngineering();
+
+            final DbLoaderHelper helper = new DbLoaderHelper(
+                    projectController,
+                    connection,
+                    adapter,
+                    connectionInfo, reverseEngineering);
+            Thread th = new Thread(new Runnable() {
+
+                public void run() {
+                    helper.execute();
+
+                    SwingUtilities.invokeLater(new Runnable() {
+
+                        public void run() {
+                            application.getUndoManager().discardAllEdits();
+                        }
+                    });
+                }
+            });
+
+            th.start();
+            view.setTempDataMap(projectController.getCurrentDataMap());
+        } catch (ReverseEngineeringLoaderException e) {
+            xmlFileEditor.addAlertMessage(e.getMessage());
+        } catch (Exception e) {
+            xmlFileEditor.addAlertMessage(e.getMessage());
+        }
+    }
+
+    /**
+     * Returns configured DB connection.
+     */
+    public Connection getConnection() {
+        return connection;
+    }
+
+    /**
+     * Returns configured DbAdapter.
+     */
+    public DbAdapter getAdapter() {
+        return adapter;
+    }
+
+
+    public String getDataSourceKey() {
+        return dataSourceKey;
+    }
+
+    public void setDataSourceKey(String dataSourceKey) {
+        XMLFileEditor xmlFileEditor = view.getXmlFileEditor();
+        xmlFileEditor.removeAlertMessage();
+
+        this.dataSourceKey = dataSourceKey;
+
+        DBConnectionInfo currentInfo = (DBConnectionInfo) 
dataSources.get(dataSourceKey);
+        if (currentInfo != null) {
+            currentInfo.copyTo(connectionInfo);
+        } else {
+            connectionInfo = new DBConnectionInfo();
+        }
+    }
+
+    /**
+     * 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()));
+            }
+        }
+
+        Object[] keys = dataSources.keySet().toArray();
+        Arrays.sort(keys);
+        view.getDataSources().setModel(new DefaultComboBoxModel(keys));
+
+        if (dataSources.isEmpty()) {
+            dataSourceKey = null;
+        }
+        String key = null;
+        if (keys.length > 0) {
+            key = keys[0].toString();
+        }
+        setDataSourceKey(key);
+
+        if (getDataSourceKey() == null) {
+            dataSourceBinding.updateView();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/fe82b47e/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java
new file mode 100644
index 0000000..bc8c466
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ReverseEngineeringScrollPane.java
@@ -0,0 +1,34 @@
+/*****************************************************************
+ *   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 javax.swing.JScrollPane;
+
+/**
+ * @since 4.0
+ */
+public class ReverseEngineeringScrollPane extends JScrollPane {
+
+    private ReverseEngineeringView reverseEngineeringView;
+
+    public ReverseEngineeringScrollPane(ReverseEngineeringView 
reverseEngineeringView) {
+        super(reverseEngineeringView);
+        this.reverseEngineeringView = reverseEngineeringView;
+    }
+}

Reply via email to