You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2016/11/05 10:33:47 UTC

[1/2] cayenne git commit: refactoring ModelerDbImportAction

Repository: cayenne
Updated Branches:
  refs/heads/master c95cbc7e0 -> 72dc1a3b4


refactoring ModelerDbImportAction


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

Branch: refs/heads/master
Commit: 5461647f180e54f9c0482eb4d1393d55cfe10f1f
Parents: c95cbc7
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sat Nov 5 12:46:11 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sat Nov 5 13:18:47 2016 +0300

----------------------------------------------------------------------
 .../action/ReverseEngineeringAction.java        |  14 +-
 .../modeler/dialog/DbImportProjectSaver.java    |  72 +++++++++
 .../modeler/dialog/db/DbLoaderHelper.java       | 154 ++++++++++---------
 .../dialog/db/DbLoaderOptionsDialog.java        |  30 ++--
 .../dialog/db/ModelerDbImportAction.java        |  92 +++--------
 .../cayenne/modeler/util/LongRunningTask.java   |  30 ++--
 6 files changed, 206 insertions(+), 186 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
index b1b0eef..183b00b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
@@ -19,20 +19,11 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.dbimport.ReverseEngineering;
-import org.apache.cayenne.dbsync.naming.NameBuilder;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.event.MapEvent;
 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.ConnectionWizard;
 import org.apache.cayenne.modeler.dialog.db.DbLoaderHelper;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.CayenneAction;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
@@ -72,20 +63,19 @@ public class ReverseEngineeringAction extends DBWizardAction {
             return;
         }
 
+        // TODO: doesn't look like we are closing this connection anywhere...
         Connection connection = connectWizard.getConnection();
         DbAdapter adapter = connectWizard.getAdapter();
         DBConnectionInfo dataSourceInfo = connectWizard.getConnectionInfo();
 
         // from here pass control to DbLoaderHelper, running it from a thread separate
         // from EventDispatch
-        ReverseEngineering reverseEngineering = new ReverseEngineering();
 
         final DbLoaderHelper helper = new DbLoaderHelper(
                 getProjectController(),
                 connection,
                 adapter,
-                dataSourceInfo,
-                reverseEngineering);
+                dataSourceInfo);
         Thread th = new Thread(new Runnable() {
 
             public void run() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
new file mode 100644
index 0000000..76a4141
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbImportProjectSaver.java
@@ -0,0 +1,72 @@
+/*
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ */
+package org.apache.cayenne.modeler.dialog;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.event.DataMapEvent;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.resource.Resource;
+
+public class DbImportProjectSaver implements ProjectSaver {
+
+    private ProjectController projectController;
+
+    public DbImportProjectSaver(ProjectController projectController) {
+        this.projectController = projectController;
+    }
+
+    @Override
+    public String getSupportedVersion() {
+        // not important in the context of non-saving saver
+        return "-1";
+    }
+
+    @Override
+    public void save(Project project) {
+
+        DataMap dataMap = (DataMap) project.getRootNode();
+
+        if (projectController.getCurrentDataMap() != null) {
+
+            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.REMOVE));
+            projectController.fireDataMapEvent(new DataMapEvent(Application.getFrame(), dataMap, MapEvent.ADD));
+        } else {
+
+            DataChannelDescriptor currentDomain = (DataChannelDescriptor) projectController.getProject().getRootNode();
+            Resource baseResource = currentDomain.getConfigurationSource();
+
+            // a new DataMap, so need to set configuration source for it
+            if (baseResource != null) {
+                Resource dataMapResource = baseResource.getRelativeResource(dataMap.getName());
+                dataMap.setConfigurationSource(dataMapResource);
+            }
+            projectController.addDataMap(Application.getFrame(), dataMap);
+        }
+    }
+
+    @Override
+    public void saveAs(Project project, Resource baseDirectory) {
+        save(project);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/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 787f232..3ef1275 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,6 +21,8 @@ package org.apache.cayenne.modeler.dialog.db;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbimport.Catalog;
 import org.apache.cayenne.dbimport.IncludeProcedure;
@@ -28,6 +30,7 @@ import org.apache.cayenne.dbimport.IncludeTable;
 import org.apache.cayenne.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbimport.Schema;
 import org.apache.cayenne.dbsync.DbSyncModule;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.dbsync.reverse.db.DefaultDbLoaderDelegate;
@@ -37,10 +40,12 @@ import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.MapLoader;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.dialog.DbImportProjectSaver;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.util.LongRunningTask;
 import org.apache.cayenne.tools.configuration.ToolsModule;
@@ -57,6 +62,7 @@ import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -72,30 +78,20 @@ public class DbLoaderHelper {
 
     protected boolean stoppingReverseEngineering;
     protected boolean existingMap;
-
-    protected ProjectController mediator;
-    protected String dbCatalog;
-    protected DbLoader loader;
+    protected ProjectController projectController;
+    protected Connection connection;
     protected DataMap dataMap;
-    protected List<String> schemas;
-    protected List<String> catalogs;
     protected DbAdapter adapter;
     protected DbImportConfiguration config;
-    protected ReverseEngineering reverseEngineering;
     protected String loadStatusNote;
-    protected String dbUserName;
 
-    public DbLoaderHelper(ProjectController mediator, Connection connection, DbAdapter adapter,
-                          DBConnectionInfo dbConnectionInfo, ReverseEngineering reverseEngineering) {
-        this.mediator = mediator;
-        this.dbUserName = dbConnectionInfo.getUserName();
-        try {
-            this.dbCatalog = connection.getCatalog();
-        } catch (SQLException e) {
-            LOGGER.warn("Error getting catalog.", e);
-        }
+    public DbLoaderHelper(ProjectController projectController,
+                          Connection connection,
+                          DbAdapter adapter,
+                          DBConnectionInfo dbConnectionInfo) {
+
+        this.projectController = projectController;
         this.adapter = adapter;
-        this.reverseEngineering = reverseEngineering;
 
         this.config = new DbImportConfiguration();
         this.config.setAdapter(adapter.getClass().getName());
@@ -103,16 +99,8 @@ public class DbLoaderHelper {
         this.config.setPassword(dbConnectionInfo.getPassword());
         this.config.setDriver(dbConnectionInfo.getJdbcDriver());
         this.config.setUrl(dbConnectionInfo.getUrl());
-        try {
-            this.dbCatalog = connection.getCatalog();
-        } catch (SQLException e) {
-            LOGGER.warn("Error getting catalog.", e);
-        }
-        try {
-            this.loader = config.createLoader(adapter, connection, new LoaderDelegate());
-        } catch (Throwable th) {
-            processException(th, "Error creating DbLoader.");
-        }
+
+        this.connection = connection;
     }
 
     public boolean isStoppingReverseEngineering() {
@@ -136,9 +124,9 @@ public class DbLoaderHelper {
         stoppingReverseEngineering = false;
 
         // load catalogs...
+        List<String> catalogs = Collections.emptyList();
         if (adapter.supportsCatalogsOnReverseEngineering()) {
-            LongRunningTask loadCatalogsTask = new LoadCatalogsTask(Application.getFrame(), "Loading Catalogs");
-            loadCatalogsTask.startAndWait();
+            catalogs = new LoadCatalogsTask(Application.getFrame(), "Loading Catalogs").startAndWait();
         }
 
         if (stoppingReverseEngineering) {
@@ -146,18 +134,36 @@ public class DbLoaderHelper {
         }
 
         // load schemas...
-        LongRunningTask loadSchemasTask = new LoadSchemasTask(Application.getFrame(), "Loading Schemas");
-        loadSchemasTask.startAndWait();
+        List<String> schemas = new LoadSchemasTask(Application.getFrame(), "Loading Schemas").startAndWait();
 
         if (stoppingReverseEngineering) {
             return;
         }
 
-        final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(schemas, catalogs, dbUserName, dbCatalog);
+        // use this catalog as the default...
+        String currentCatalog = null;
+        try {
+            currentCatalog = connection.getCatalog();
+        } catch (SQLException e) {
+            LOGGER.warn("Error getting catalog.", e);
+        }
+
+        String currentSchema = null;
+        try {
+            // 'getSchema' is Java 1.7 API ... hope this works with all drivers...
+            currentSchema = connection.getSchema();
+        } catch (SQLException e) {
+            LOGGER.warn("Error getting schema.", e);
+        }
+
+        final DbLoaderOptionsDialog dialog = new DbLoaderOptionsDialog(
+                schemas,
+                catalogs,
+                currentSchema,
+                currentCatalog);
 
         try {
-            // since we are not inside EventDispatcher Thread, must run it via
-            // SwingUtilities
+            // since we are not inside EventDispatcher Thread, must run it via SwingUtilities
             SwingUtilities.invokeAndWait(new Runnable() {
 
                 public void run() {
@@ -174,6 +180,8 @@ public class DbLoaderHelper {
             return;
         }
 
+        ReverseEngineering reverseEngineering = new ReverseEngineering();
+
         reverseEngineering.addCatalog(new Catalog(dialog.getSelectedCatalog()));
         reverseEngineering.addSchema(new Schema(dialog.getSelectedSchema()));
         reverseEngineering.addIncludeTable(new IncludeTable(dialog.getTableNamePattern()));
@@ -182,8 +190,9 @@ public class DbLoaderHelper {
         config.setMeaningfulPkTables(dialog.getMeaningfulPk());
         config.setNamingStrategy(dialog.getNamingStrategy());
 
-        LongRunningTask loadDataMapTask = new LoadDataMapTask(Application.getFrame(), "Reengineering DB");
-        loadDataMapTask.startAndWait();
+        // TODO: change DbLoader naming strategy here... or better start with a fresh DbLoader over the same connection
+
+        new LoadDataMapTask(Application.getFrame(), "Reengineering DB", reverseEngineering).startAndWait();
     }
 
     protected void processException(final Throwable th, final String message) {
@@ -197,12 +206,8 @@ public class DbLoaderHelper {
         });
     }
 
-    protected ProjectController getMediator() {
-        return mediator;
-    }
-
-    protected DbLoader getLoader() {
-        return loader;
+    protected DbLoader createDbLoader(DbImportConfiguration configuration) {
+        return new DbLoader(connection, adapter, new LoaderDelegate(), configuration.createNameGenerator());
     }
 
     private final class LoaderDelegate extends DefaultDbLoaderDelegate {
@@ -214,12 +219,11 @@ public class DbLoaderHelper {
             loadStatusNote = "Importing table '" + entity.getName() + "'...";
 
             // TODO: hack to prevent PK tables from being visible... this should
-            // really be
-            // delegated to DbAdapter to decide...
+            // really be delegated to DbAdapter to decide...
             if (EXCLUDED_TABLES.contains(entity.getName()) && entity.getDataMap() != null) {
                 entity.getDataMap().removeDbEntity(entity.getName());
             } else if (existingMap) {
-                mediator.fireDbEntityEvent(new EntityEvent(this, entity, MapEvent.ADD));
+                projectController.fireDbEntityEvent(new EntityEvent(this, entity, MapEvent.ADD));
             }
         }
 
@@ -228,7 +232,7 @@ public class DbLoaderHelper {
             checkCanceled();
 
             if (existingMap) {
-                mediator.fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
+                projectController.fireDbEntityEvent(new EntityEvent(Application.getFrame(), entity, MapEvent.REMOVE));
             }
         }
 
@@ -257,7 +261,7 @@ public class DbLoaderHelper {
         }
     }
 
-    abstract class DbLoaderTask extends LongRunningTask {
+    abstract class DbLoaderTask<T> extends LongRunningTask<T> {
 
         public DbLoaderTask(JFrame frame, String title) {
             super(frame, title);
@@ -295,47 +299,49 @@ public class DbLoaderHelper {
         }
     }
 
-    final class LoadSchemasTask extends DbLoaderTask {
+    final class LoadCatalogsTask extends DbLoaderTask<List<String>> {
 
-        public LoadSchemasTask(JFrame frame, String title) {
+        public LoadCatalogsTask(JFrame frame, String title) {
             super(frame, title);
         }
 
         @Override
         protected void execute() {
-            loadStatusNote = "Loading available schemas...";
+            loadStatusNote = "Loading available catalogs...";
 
             try {
-                schemas = loader.loadSchemas();
+                result = createDbLoader(config).loadCatalogs();
             } catch (Throwable th) {
-                processException(th, "Error Loading Schemas");
+                processException(th, "Error Loading Catalogs");
             }
         }
     }
 
-    final class LoadCatalogsTask extends DbLoaderTask {
+    final class LoadSchemasTask extends DbLoaderTask<List<String>> {
 
-        public LoadCatalogsTask(JFrame frame, String title) {
+        public LoadSchemasTask(JFrame frame, String title) {
             super(frame, title);
         }
 
         @Override
         protected void execute() {
-            loadStatusNote = "Loading available catalogs...";
+            loadStatusNote = "Loading available schemas...";
 
             try {
-                catalogs = loader.loadCatalogs();
+                result = createDbLoader(config).loadSchemas();
             } catch (Throwable th) {
-                processException(th, "Error Loading Catalogs");
+                processException(th, "Error Loading Schemas");
             }
         }
     }
 
     public final class LoadDataMapTask extends DbLoaderTask {
-        private DbImportAction importAction;
 
-        public LoadDataMapTask(JFrame frame, String title) {
+        private ReverseEngineering reverseEngineering;
+
+        public LoadDataMapTask(JFrame frame, String title, ReverseEngineering reverseEngineering) {
             super(frame, title);
+            this.reverseEngineering = reverseEngineering;
         }
 
         @Override
@@ -343,12 +349,12 @@ public class DbLoaderHelper {
 
             loadStatusNote = "Preparing...";
 
-            DbLoaderHelper.this.dataMap = mediator.getCurrentDataMap();
+            DbLoaderHelper.this.dataMap = projectController.getCurrentDataMap();
             DbLoaderHelper.this.existingMap = dataMap != null;
 
             if (!existingMap) {
 
-                ConfigurationNode root = mediator.getProject().getRootNode();
+                ConfigurationNode root = projectController.getProject().getRootNode();
 
                 dataMap = new DataMap();
                 dataMap.setName(NameBuilder.builder(dataMap, root).name());
@@ -365,19 +371,29 @@ public class DbLoaderHelper {
             FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
             config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
 
-
-            ModelerDbImportAction importAction = new ModelerDbImportAction(LOGGER, DbLoaderHelper.this);
-
-            // TODO: we can keep all these things in the Modeler Injector instead of creating a new one?
-            // we already have DbSyncModule in there
-            Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new ToolsModule(LOGGER), new DbImportModule());
-            injector.injectMembers(importAction);
+            DbImportAction importAction = createAction(dataMap);
             try {
                 importAction.execute(config);
             } catch (Exception e) {
                 processException(e, "Error importing database schema.");
             }
         }
+
+        protected DbImportAction createAction(DataMap targetDataMap) {
+            Injector injector = DIBootstrap.createInjector(new DbSyncModule(),
+                    new ToolsModule(LOGGER),
+                    new DbImportModule());
+
+            return new ModelerDbImportAction(
+                    LOGGER,
+                    new DbImportProjectSaver(projectController),
+                    injector.getInstance(DataSourceFactory.class),
+                    injector.getInstance(DbAdapterFactory.class),
+                    injector.getInstance(MapLoader.class),
+                    injector.getInstance(MergerTokenFactoryProvider.class),
+                    targetDataMap,
+                    createDbLoader(config));
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/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
index 3dbb59a..fa5c68f 100644
--- 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
@@ -24,8 +24,6 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.util.CayenneDialog;
 import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 
 import javax.swing.*;
 import java.awt.*;
@@ -39,7 +37,7 @@ import java.util.Vector;
  */
 public class DbLoaderOptionsDialog extends CayenneDialog {
 
-    private static final Log logObj = LogFactory.getLog(DbLoaderOptionsDialog.class);
+    public static final String WILDCARD_PATTERN = ".*";
 
     public static final int CANCEL = 0;
     public static final int SELECT = 1;
@@ -55,28 +53,21 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
     protected JButton selectButton;
     protected JButton cancelButton;
 
-    public static final String WILDCARD_PATTERN = ".*";
-
 
-    /**
-     * Combobox for naming strategy
-     */
     protected JComboBox strategyCombo;
-//
     protected String strategy;
-
     protected int choice;
 
     /**
      * Creates and initializes new ChooseSchemaDialog.
      */
-    public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String dbUserName,
+    public DbLoaderOptionsDialog(Collection<String> schemas, Collection<String> catalogs, String currentSchema,
                                  String dbCatalog) {
         super(Application.getFrame(), "Reengineer DB Schema: Select Options");
 
         init();
         initController();
-        initFromModel(schemas, catalogs, dbUserName, dbCatalog);
+        initFromModel(schemas, catalogs, currentSchema, dbCatalog);
 
         pack();
         setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
@@ -128,7 +119,6 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
                 processSelect();
             }
         });
-
         cancelButton.addActionListener(new ActionListener() {
 
             public void actionPerformed(ActionEvent e) {
@@ -140,8 +130,8 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
     protected void initFromModel(
             Collection<String> schemas,
             Collection<String> catalogs,
-            String dbUserName,
-            String dbCatalog) {
+            String currentSchema,
+            String currentCatalog) {
 
         this.choice = CANCEL;
         this.tableNamePatternField.setText(WILDCARD_PATTERN);
@@ -160,10 +150,9 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
 
             schemaSelector.setModel(new DefaultComboBoxModel(schemas.toArray()));
 
-            // select schema belonging to the user
-            if (dbUserName != null) {
+            if (currentSchema != null) {
                 for (String schema : schemas) {
-                    if (dbUserName.equalsIgnoreCase(schema)) {
+                    if (currentSchema.equalsIgnoreCase(schema)) {
                         schemaSelector.setSelectedItem(schema);
                         break;
                     }
@@ -178,16 +167,15 @@ public class DbLoaderOptionsDialog extends CayenneDialog {
         if (showCatalogSelector) {
             catalogSelector.setModel(new DefaultComboBoxModel(catalogs.toArray()));
 
-            if (dbCatalog != null && !dbCatalog.isEmpty()) {
+            if (currentCatalog != null && !currentCatalog.isEmpty()) {
                 for (String catalog : catalogs) {
-                    if (dbCatalog.equalsIgnoreCase(catalog)) {
+                    if (currentCatalog.equalsIgnoreCase(catalog)) {
                         catalogSelector.setSelectedItem(catalog);
                         break;
                     }
                 }
             }
         }
-
     }
 
     public int getChoice() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
index 19d9b03..24cc4b2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/ModelerDbImportAction.java
@@ -18,21 +18,14 @@
  */
 package org.apache.cayenne.modeler.dialog.db;
 
-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.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 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.project.ProjectSaver;
-import org.apache.cayenne.resource.Resource;
-import org.apache.cayenne.tools.dbimport.DbImportAction;
 import org.apache.cayenne.tools.dbimport.DbImportConfiguration;
 import org.apache.cayenne.tools.dbimport.DefaultDbImportAction;
 import org.apache.commons.logging.Log;
@@ -40,73 +33,36 @@ import org.apache.commons.logging.Log;
 import java.io.IOException;
 import java.sql.Connection;
 
-public class ModelerDbImportAction implements DbImportAction {
+public class ModelerDbImportAction extends DefaultDbImportAction {
 
-    private final Log logger;
+    private DataMap targetMap;
+    private DbLoader dbLoader;
 
-    private final DbLoaderHelper dbLoaderHelper;
+    public ModelerDbImportAction(Log logger,
+                                 ProjectSaver projectSaver,
+                                 DataSourceFactory dataSourceFactory,
+                                 DbAdapterFactory adapterFactory,
+                                 MapLoader mapLoader,
+                                 MergerTokenFactoryProvider mergerTokenFactoryProvider,
+                                 DataMap targetMap,
+                                 DbLoader dbLoader
+                                 ) {
 
-    @Inject
-    private ProjectSaver projectSaver;
+        super(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider);
 
-    @Inject
-    private DataSourceFactory dataSourceFactory;
-
-    @Inject
-    private DbAdapterFactory adapterFactory;
-
-    @Inject
-    private MapLoader mapLoader;
-
-    @Inject
-    private MergerTokenFactoryProvider mergerTokenFactoryProvider;
-
-    public ModelerDbImportAction(Log logger, DbLoaderHelper dbLoaderHelper) {
-        this.logger = logger;
-        this.dbLoaderHelper = dbLoaderHelper;
+        this.targetMap = targetMap;
+        this.dbLoader = dbLoader;
     }
 
     @Override
-    public void execute(DbImportConfiguration config) throws Exception {
-        if (dbLoaderHelper == null) {
-            throw new IllegalStateException("Before using execute method you must set dbLoaderHelper");
-        }
-
-        new DefaultDbImportAction(logger, projectSaver, dataSourceFactory, adapterFactory, mapLoader, mergerTokenFactoryProvider) {
-
-            @Override
-            protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
-                return dbLoaderHelper.getDataMap();
-            }
-
-            @Override
-            protected void saveLoaded(DataMap dataMap) {
-
-                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);
-                }
-            }
+    protected DataMap load(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws Exception {
+        DataMap dataMap = new DataMap();
+        dbLoader.load(dataMap, config.getDbLoaderConfig());
+        return dataMap;
+    }
 
-            @Override
-            protected DataMap load(DbImportConfiguration config, DbAdapter adapter, Connection connection) throws Exception {
-                DataMap dataMap = new DataMap();
-                dbLoaderHelper.getLoader().load(dataMap, config.getDbLoaderConfig());
-                return dataMap;
-            }
-        }.execute(config);
+    @Override
+    protected DataMap existingTargetMap(DbImportConfiguration configuration) throws IOException {
+        return targetMap;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cayenne/blob/5461647f/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/LongRunningTask.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/LongRunningTask.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/LongRunningTask.java
index ebd4d69..55ef5b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/LongRunningTask.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/LongRunningTask.java
@@ -19,18 +19,14 @@
 
 package org.apache.cayenne.modeler.util;
 
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JFrame;
-import javax.swing.JProgressBar;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import javax.swing.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
 /**
  * A base class for monitoring progress of long running tasks. It can runshowing the exact
  * percentage of the task progress or in "indeterminate" mode.
@@ -42,9 +38,9 @@ import org.apache.commons.logging.LogFactory;
  * </p>
  * 
  */
-public abstract class LongRunningTask {
+public abstract class LongRunningTask<T> {
 
-    private static Log logObj = LogFactory.getLog(LongRunningTask.class);
+    private static final Log LOGGER = LogFactory.getLog(LongRunningTask.class);
 
     protected static final int DEFAULT_MS_TO_DECIDE_TO_POPUP = 500;
 
@@ -56,6 +52,7 @@ public abstract class LongRunningTask {
     protected int minValue;
     protected int maxValue;
     protected boolean finished;
+    protected T result;
 
     public LongRunningTask(JFrame frame, String title) {
         this.frame = frame;
@@ -65,7 +62,7 @@ public abstract class LongRunningTask {
     /**
      * Starts current task, and blocks current thread until the task is done.
      */
-    public synchronized void startAndWait() {
+    public synchronized T startAndWait() {
         // running from Event Dispatch Thread is bad, as this will block the timers...
         if (SwingUtilities.isEventDispatchThread()) {
             throw new CayenneRuntimeException(
@@ -75,7 +72,7 @@ public abstract class LongRunningTask {
         start();
 
         if (finished) {
-            return;
+            return result;
         }
 
         try {
@@ -86,6 +83,7 @@ public abstract class LongRunningTask {
         }
 
         notifyAll();
+        return result;
     }
 
     /**
@@ -124,7 +122,7 @@ public abstract class LongRunningTask {
      * Starts progress dialog if the task is not finished yet.
      */
     protected synchronized void showProgress() {
-        logObj.debug("will show progress...");
+        LOGGER.debug("will show progress...");
 
         if (finished) {
             return;
@@ -134,7 +132,7 @@ public abstract class LongRunningTask {
 
         if (!isCanceled() && currentValue < getMaxValue()) {
 
-            logObj.debug("task still in progress, will show progress dialog...");
+            LOGGER.debug("task still in progress, will show progress dialog...");
             this.dialog = new ProgressDialog(frame, "Progress...", title);
             this.dialog.getCancelButton().addActionListener(new ActionListener() {
 
@@ -204,7 +202,7 @@ public abstract class LongRunningTask {
 
     public void setCanceled(boolean b) {
         if (b) {
-            logObj.debug("task canceled");
+            LOGGER.debug("task canceled");
         }
 
         this.canceled = b;
@@ -216,7 +214,7 @@ public abstract class LongRunningTask {
         }
         catch (Throwable th) {
             setCanceled(true);
-            logObj.warn("task error", th);
+            LOGGER.warn("task error", th);
         }
         finally {
             stop();


[2/2] cayenne git commit: refactoring ModelerDbImportAction

Posted by aa...@apache.org.
refactoring ModelerDbImportAction


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

Branch: refs/heads/master
Commit: 72dc1a3b419540bf424f5b4d6ea8707dc2a919d5
Parents: 5461647
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Sat Nov 5 12:46:11 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Sat Nov 5 13:32:07 2016 +0300

----------------------------------------------------------------------
 .../cayenne/dbsync/reverse/db/DbLoader.java     | 59 +++++++-------------
 .../cayenne/modeler/action/MigrateAction.java   |  3 +-
 .../modeler/dialog/db/DbLoaderHelper.java       | 11 ++--
 3 files changed, 27 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/72dc1a3b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
index 65dd871..b171b5f 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/db/DbLoader.java
@@ -63,7 +63,7 @@ public class DbLoader {
     private final Connection connection;
     private final DbAdapter adapter;
     private final DbLoaderDelegate delegate;
-    private ObjectNameGenerator nameGenerator;
+    private final ObjectNameGenerator nameGenerator;
     private DatabaseMetaData metaData;
 
     public DbLoader(Connection connection, DbAdapter adapter, DbLoaderDelegate delegate, ObjectNameGenerator nameGenerator) {
@@ -97,56 +97,38 @@ public class DbLoader {
     }
 
     /**
-     * Returns DatabaseMetaData object associated with this DbLoader.
-     */
-    private DatabaseMetaData getMetaData() throws SQLException {
-        if (metaData == null) {
-            metaData = connection.getMetaData();
-        }
-        return metaData;
-    }
-
-    /**
-     * Check if database support schemas.
-     */
-    protected boolean supportSchemas() throws SQLException {
-        if (metaData == null) {
-            metaData = connection.getMetaData();
-        }
-        return metaData.supportsSchemasInTableDefinitions();
-    }
-
-    /**
-     * Check if database support catalogs.
+     * Retrieves catalogs for a given connection.
+     *
+     * @return List with the catalog names; empty list if none found.
      */
-    protected boolean supportCatalogs() throws SQLException {
-        if (metaData == null) {
-            metaData = connection.getMetaData();
+    // using a static method for catalog loading as we don't need a full DbLoader for this operation
+    public static List<String> loadCatalogs(Connection connection) throws SQLException {
+        try (ResultSet rs = connection.getMetaData().getCatalogs()) {
+            return getStrings(rs);
         }
-        return metaData.supportsCatalogsInTableDefinitions();
     }
 
     /**
-     * Retrieves catalogs for the database associated with this DbLoader.
+     * Retrieves the schemas for the given connection.
      *
-     * @return List with the catalog names, empty Array if none found.
+     * @return List with the schema names; empty list if none found.
      */
-    public List<String> loadCatalogs() throws SQLException {
-        try (ResultSet rs = getMetaData().getCatalogs()) {
+    // using a static method for catalog loading as we don't need a full DbLoader for this operation
+    public static List<String> loadSchemas(Connection connection) throws SQLException {
+
+        try (ResultSet rs = connection.getMetaData().getSchemas()) {
             return getStrings(rs);
         }
     }
 
     /**
-     * Retrieves the schemas for the database.
-     *
-     * @return List with the schema names, empty Array if none found.
+     * Returns DatabaseMetaData object associated with this DbLoader.
      */
-    public List<String> loadSchemas() throws SQLException {
-
-        try (ResultSet rs = getMetaData().getSchemas()) {
-            return getStrings(rs);
+    private DatabaseMetaData getMetaData() throws SQLException {
+        if (metaData == null) {
+            metaData = connection.getMetaData();
         }
+        return metaData;
     }
 
     protected void loadDbRelationships(DbLoaderConfiguration config, String catalog, String schema,
@@ -297,7 +279,7 @@ public class DbLoader {
             } catch (SQLException cay182Ex) {
                 // Sybase-specific - the line above blows on VIEWS, see CAY-182.
                 LOGGER.info("Error getting relationships for '" + catalog + "." + schema + "', ignoring. "
-                                + cay182Ex.getMessage(), cay182Ex);
+                        + cay182Ex.getMessage(), cay182Ex);
                 return new HashMap<>();
             }
 
@@ -336,7 +318,6 @@ public class DbLoader {
         LOGGER.info("Skip relation: '" + key + "' because table '" + tableName + "' not found");
     }
 
-
     protected String[] getTableTypes(DbLoaderConfiguration config) {
 
         String[] configTypes = config.getTableTypes();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/72dc1a3b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index 9c5436a..f565cda 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
@@ -21,7 +21,6 @@ package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
-import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.db.DbLoader;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
@@ -107,6 +106,6 @@ public class MigrateAction extends DBWizardAction {
         DataSource dataSource = connectWizard.getConnectionInfo()
                 .makeDataSource(getApplication().getClassLoadingService());
 
-        return new DbLoader(dataSource.getConnection(), dbAdapter, null, new DefaultObjectNameGenerator()).loadSchemas();
+        return DbLoader.loadSchemas(dataSource.getConnection());
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/72dc1a3b/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 3ef1275..3d2f317 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
@@ -206,9 +206,6 @@ public class DbLoaderHelper {
         });
     }
 
-    protected DbLoader createDbLoader(DbImportConfiguration configuration) {
-        return new DbLoader(connection, adapter, new LoaderDelegate(), configuration.createNameGenerator());
-    }
 
     private final class LoaderDelegate extends DefaultDbLoaderDelegate {
 
@@ -310,7 +307,7 @@ public class DbLoaderHelper {
             loadStatusNote = "Loading available catalogs...";
 
             try {
-                result = createDbLoader(config).loadCatalogs();
+                result = DbLoader.loadCatalogs(connection);
             } catch (Throwable th) {
                 processException(th, "Error Loading Catalogs");
             }
@@ -328,7 +325,7 @@ public class DbLoaderHelper {
             loadStatusNote = "Loading available schemas...";
 
             try {
-                result = createDbLoader(config).loadSchemas();
+                result = DbLoader.loadSchemas(connection);
             } catch (Throwable th) {
                 processException(th, "Error Loading Schemas");
             }
@@ -394,6 +391,10 @@ public class DbLoaderHelper {
                     targetDataMap,
                     createDbLoader(config));
         }
+
+        protected DbLoader createDbLoader(DbImportConfiguration configuration) {
+            return new DbLoader(connection, adapter, new LoaderDelegate(), configuration.createNameGenerator());
+        }
     }
 
 }