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 <[email protected]> Authored: Sat Nov 5 12:46:11 2016 +0300 Committer: Andrus Adamchik <[email protected]> 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();
