You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/08/27 14:37:39 UTC

[cayenne] branch master updated: CAY-2611 Exclude system catalogs and schemas when run dbImport without config

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4656d18  CAY-2611 Exclude system catalogs and schemas when run dbImport without config
     new 8dd42e2  Merge PR #402
4656d18 is described below

commit 4656d18a109254d86081b8c509bba66ce5b8f7eb
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Tue Aug 27 16:55:56 2019 +0300

    CAY-2611 Exclude system catalogs and schemas when run dbImport without config
---
 RELEASE-NOTES.txt                                  |  1 +
 .../org/apache/cayenne/tools/DbImporterTask.java   | 32 +++++++--
 .../reverse/dbimport/DefaultDbImportAction.java    | 25 ++++++--
 .../dbsync/reverse/dbload/EntityLoader.java        |  4 +-
 .../reverse/filters/FiltersConfigBuilder.java      | 75 +++++++++++++++++++++-
 .../dbsync/reverse/dbload/EntityLoaderIT.java      | 33 ++++++----
 .../org/apache/cayenne/tools/DbImportTask.java     | 25 +++++++-
 .../cayenne/unit/SQLServerUnitDbAdapter.java       |  5 ++
 .../org/apache/cayenne/tools/DbImporterMojo.java   | 23 ++++++-
 .../tools/DbImporterMojoConfigurationTest.java     | 21 +++---
 .../modeler/dialog/db/load/DbLoaderContext.java    | 16 ++++-
 11 files changed, 216 insertions(+), 44 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 1a2a9b9..b638050 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -43,6 +43,7 @@ CAY-2592 Modeler: make all datamaps selected in global cgen tab
 CAY-2593 Add tableTypes field to dbImport config in dataMap
 CAY-2602 Remove RTRIM of char columns in Sybase
 CAY-2610 Align methods in ObjectSelect and SQLSelect
+CAY-2611 Exclude system catalogs and schemas when run dbImport without config
 
 Bug Fixes:
 
diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
index f2654ec..e331f23 100644
--- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
+++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java
@@ -18,7 +18,14 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
+import javax.sql.DataSource;
+import java.io.File;
+
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.configuration.server.DataSourceFactory;
+import org.apache.cayenne.configuration.server.DbAdapterFactory;
 import org.apache.cayenne.conn.DataSourceInfo;
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.DbSyncModule;
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
@@ -42,10 +49,8 @@ import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.util.Util;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
-import org.slf4j.Logger;
 import org.apache.tools.ant.Task;
-
-import java.io.File;
+import org.slf4j.Logger;
 
 public class DbImporterTask extends Task {
 
@@ -115,19 +120,34 @@ public class DbImporterTask extends Task {
 
     @Override
     public void execute() {
+        Logger logger = new AntLogger(this);
+        final Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new ToolsModule(logger), new DbImportModule());
+
         if (reverseEngineering.getCatalogs().size() == 0 && reverseEngineering.isEmptyContainer()) {
             config.setUseDataMapReverseEngineering(true);
         }
-        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
+
+        DataSourceFactory dataSourceFactory = injector.getInstance(DataSourceFactory.class);
+        DbAdapterFactory dbAdapterFactory = injector.getInstance(DbAdapterFactory.class);
+        DataNodeDescriptor dataNodeDescriptor = config.createDataNodeDescriptor();
+        try {
+            DataSource dataSource = dataSourceFactory.getDataSource(dataNodeDescriptor);
+            DbAdapter dbAdapter = dbAdapterFactory.createAdapter(dataNodeDescriptor, dataSource);
+            config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
+                    .dataSource(dataSource)
+                    .dbAdapter(dbAdapter)
+                    .build());
+        } catch (Exception e) {
+            throw new BuildException("Error getting dataSource", e);
+        }
+
         validateAttributes();
 
-        Logger logger = new AntLogger(this);
         config.setLogger(logger);
         config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
         config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setTableTypes(reverseEngineering.getTableTypes());
 
-        Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new ToolsModule(logger), new DbImportModule());
         DbImportConfigurationValidator validator = new DbImportConfigurationValidator(reverseEngineering, config, injector);
         try {
             validator.validate();
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
index f20ae84..2192b54 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportAction.java
@@ -24,6 +24,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.sql.Connection;
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
@@ -53,6 +54,7 @@ import org.apache.cayenne.dbsync.reverse.dbload.ModelMergeDelegate;
 import org.apache.cayenne.dbsync.reverse.dbload.ProxyModelMergeDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.CatalogFilter;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
+import org.apache.cayenne.dbsync.reverse.filters.SchemaFilter;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -183,7 +185,7 @@ public class DefaultDbImportAction implements DbImportAction {
 
         ReverseEngineering dataMapReverseEngineering = metaData.get(targetDataMap, ReverseEngineering.class);
         if ((config.isUseDataMapReverseEngineering()) && (dataMapReverseEngineering != null)) {
-            putReverseEngineeringToConfig(dataMapReverseEngineering, config);
+            putReverseEngineeringToConfig(dataMapReverseEngineering, config, dataSource, adapter);
         }
         if ((dataMapReverseEngineering != null) && (!config.isUseDataMapReverseEngineering())) {
             logger.warn("Found several dbimport configs. DataMap dbimport config was skipped. " +
@@ -229,7 +231,10 @@ public class DefaultDbImportAction implements DbImportAction {
         return sourceDataMap;
     }
 
-    private void putReverseEngineeringToConfig(ReverseEngineering reverseEngineering, DbImportConfiguration config) {
+    private void putReverseEngineeringToConfig(ReverseEngineering reverseEngineering,
+                                               DbImportConfiguration config,
+                                               DataSource dataSource,
+                                               DbAdapter dbAdapter) throws SQLException {
         config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
         config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         config.setStripFromTableNames(reverseEngineering.getStripFromTableNames());
@@ -237,7 +242,10 @@ public class DefaultDbImportAction implements DbImportAction {
         config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
         config.setNamingStrategy(reverseEngineering.getNamingStrategy());
         config.setFiltersConfig(new FiltersConfigBuilder(
-                new ReverseEngineering(reverseEngineering)).build());
+                new ReverseEngineering(reverseEngineering))
+                .dataSource(dataSource)
+                .dbAdapter(dbAdapter)
+                .build());
         config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
         config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
         config.setDefaultPackage(reverseEngineering.getDefaultPackage());
@@ -352,7 +360,7 @@ public class DefaultDbImportAction implements DbImportAction {
         }
 
         CatalogFilter[] catalogs = config.getDbLoaderConfig().getFiltersConfig().getCatalogs();
-        if (catalogs.length > 0) {
+        if (catalogs.length == 1) {
             // do not override default catalog of existing DataMap unless it is
             // explicitly requested by the plugin caller, and the provided catalog is
             // not a pattern
@@ -364,9 +372,12 @@ public class DefaultDbImportAction implements DbImportAction {
             // do not override default schema of existing DataMap unless it is
             // explicitly requested by the plugin caller, and the provided schema is
             // not a pattern
-            String schema = catalogs[0].schemas[0].name;
-            if (schema != null && schema.length() > 0 && schema.indexOf('%') < 0) {
-                dataMap.setDefaultSchema(schema);
+            SchemaFilter[] schemas = catalogs[0].schemas;
+            if(schemas.length == 1) {
+                String schema = schemas[0].name;
+                if (schema != null && schema.length() > 0 && schema.indexOf('%') < 0) {
+                    dataMap.setDefaultSchema(schema);
+                }
             }
         }
 
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoader.java
index f878358..a4e044d 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoader.java
@@ -65,7 +65,9 @@ class EntityLoader extends PerCatalogAndSchemaLoader {
             return;
         }
 
-        if (!(catalog.name == null || catalog.name.equals(catalogName))
+        // check catalogName for null was added because postgres
+        // for some reasons returns null for table's catalog
+        if (!(catalog.name == null || catalogName == null || catalog.name.equals(catalogName))
                 || !(schema.name == null || schema.name.equals(schemaName))) {
             LOGGER.error(catalogName + "." + schema + "." + schemaName + " wrongly loaded for catalog/schema : "
                     + catalog.name + "." + schema.name);
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilder.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilder.java
index cb56ce1..50930a0 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilder.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilder.java
@@ -18,12 +18,20 @@
  */
 package org.apache.cayenne.dbsync.reverse.filters;
 
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.regex.Pattern;
 
+import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
@@ -42,17 +50,82 @@ import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 public final class FiltersConfigBuilder {
 
     private final ReverseEngineering engineering;
+    private DataSource dataSource;
+    private DbAdapter dbAdapter;
 
     public FiltersConfigBuilder(ReverseEngineering engineering) {
         this.engineering = engineering;
     }
 
-    public FiltersConfig build() {
+    public FiltersConfigBuilder dataSource(DataSource dataSource) {
+        this.dataSource = dataSource;
+        return this;
+    }
+
+    public FiltersConfigBuilder dbAdapter(DbAdapter dbAdapter) {
+        this.dbAdapter = dbAdapter;
+        return this;
+    }
+
+    public FiltersConfig build() throws SQLException {
+        if(dataSource != null && dbAdapter != null && isEmptyConfig()) {
+            preBuildFilters(dataSource, dbAdapter);
+        }
+
         compact();
 
         return new FiltersConfig(transformCatalogs(engineering.getCatalogs()));
     }
 
+    private boolean isEmptyConfig() {
+        return engineering.getCatalogs().isEmpty() && engineering.getSchemas().isEmpty();
+    }
+
+    private void preBuildFilters(DataSource dataSource, DbAdapter dbAdapter) throws SQLException {
+        try (Connection connection = dataSource.getConnection()) {
+            DatabaseMetaData databaseMetaData = connection.getMetaData();
+            processCatalogs(databaseMetaData, dbAdapter);
+        }
+    }
+
+    private void processCatalogs(DatabaseMetaData databaseMetaData, DbAdapter dbAdapter) throws SQLException {
+        try (ResultSet catalogRs = databaseMetaData.getCatalogs()) {
+            List<String> systemCatalogs = dbAdapter.getSystemCatalogs();
+            List<String> systemSchemas = dbAdapter.getSystemSchemas();
+            boolean hasCatalogs = false;
+            while(catalogRs.next()) {
+                hasCatalogs = true;
+                String catalogName = catalogRs.getString("TABLE_CAT");
+                if(!systemCatalogs.contains(catalogName)) {
+                    Catalog catalog = new Catalog(catalogName);
+                    List<Schema> schemas = processSchemas(databaseMetaData, catalogName, systemSchemas);
+                    catalog.getSchemas().addAll(schemas);
+                    engineering.addCatalog(catalog);
+                }
+            }
+            if(!hasCatalogs) {
+                List<Schema> schemas = processSchemas(databaseMetaData, null, systemSchemas);
+                engineering.getSchemas().addAll(schemas);
+            }
+        }
+    }
+
+    private List<Schema> processSchemas(DatabaseMetaData databaseMetaData,
+                                        String catalogName,
+                                        List<String> systemSchemas) throws SQLException {
+        List<Schema> schemas = new ArrayList<>();
+        try(ResultSet schemaRs = databaseMetaData.getSchemas(catalogName, null)) {
+            while(schemaRs.next()) {
+                String schemaName = schemaRs.getString("TABLE_SCHEM");
+                if(!systemSchemas.contains(schemaName)) {
+                    Schema schema = new Schema(schemaName);
+                    schemas.add(schema);
+                }
+            }
+        }
+        return schemas;
+    }
+
     private CatalogFilter[] transformCatalogs(Collection<Catalog> catalogs) {
         CatalogFilter[] catalogFilters = new CatalogFilter[catalogs.size()];
         int i = 0;
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoaderIT.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoaderIT.java
index 762ec63..cd0a816 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoaderIT.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbload/EntityLoaderIT.java
@@ -24,8 +24,10 @@ import java.sql.SQLException;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
+import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.map.DbEntity;
 
+import org.apache.cayenne.unit.UnitDbAdapter;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -36,22 +38,27 @@ import static org.junit.Assert.assertTrue;
 
 public class EntityLoaderIT extends BaseLoaderIT {
 
+    @Inject
+    private UnitDbAdapter unitDbAdapter;
+
     @Test
     public void testGetTablesWithWrongCatalog() throws Exception {
-        DbLoaderConfiguration config = new DbLoaderConfiguration();
-        config.setFiltersConfig(
-                FiltersConfig.create("WRONG", null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING)
-        );
-
-        EntityLoader loader = new EntityLoader(adapter, config, new DefaultDbLoaderDelegate());
-        try {
-            loader.load(connection.getMetaData(), store);
-        } catch (SQLException ex) {
-            // SQL Server will throw exception here.
-            assertTrue(ex.getMessage().contains("WRONG")); // just check that message is about "WRONG" catalog
+        if(unitDbAdapter.supportsCatalogs()) {
+            DbLoaderConfiguration config = new DbLoaderConfiguration();
+            config.setFiltersConfig(
+                    FiltersConfig.create("WRONG", null, TableFilter.everything(), PatternFilter.INCLUDE_NOTHING)
+            );
+
+            EntityLoader loader = new EntityLoader(adapter, config, new DefaultDbLoaderDelegate());
+            try {
+                loader.load(connection.getMetaData(), store);
+            } catch (SQLException ex) {
+                // SQL Server will throw exception here.
+                assertTrue(ex.getMessage().contains("WRONG")); // just check that message is about "WRONG" catalog
+            }
+
+            assertTrue("Store is not empty", store.getDbEntities().isEmpty());
         }
-
-        assertTrue("Store is not empty", store.getDbEntities().isEmpty());
     }
 
     @Test
diff --git a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
index 1f43cfd..fbd9d52 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
@@ -19,9 +19,14 @@
 
 package org.apache.cayenne.tools;
 
+import javax.sql.DataSource;
 import java.io.File;
 
 import groovy.lang.Closure;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+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.DbSyncModule;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportAction;
@@ -29,6 +34,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfigurationValidator;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportModule;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.di.ClassLoaderManager;
 import org.apache.cayenne.di.DIBootstrap;
@@ -73,11 +79,25 @@ public class DbImportTask extends BaseCayenneTask {
     public void runImport() {
         dataSource.validate();
 
-        final DbImportConfiguration config = createConfig();
-
         final Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new ToolsModule(getLogger()), new DbImportModule(),
                 binder -> binder.bind(ClassLoaderManager.class).toInstance(new GradlePluginClassLoaderManager(getProject())));
 
+        final DbImportConfiguration config = createConfig();
+
+        DataSourceFactory dataSourceFactory = injector.getInstance(DataSourceFactory.class);
+        DbAdapterFactory dbAdapterFactory = injector.getInstance(DbAdapterFactory.class);
+        DataNodeDescriptor dataNodeDescriptor = config.createDataNodeDescriptor();
+        try {
+            DataSource dataSource = dataSourceFactory.getDataSource(dataNodeDescriptor);
+            DbAdapter dbAdapter = dbAdapterFactory.createAdapter(dataNodeDescriptor, dataSource);
+            config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
+                    .dataSource(dataSource)
+                    .dbAdapter(dbAdapter)
+                    .build());
+        } catch (Exception e) {
+            throw new TaskExecutionException(this, e);
+        }
+
         final DbImportConfigurationValidator validator = new DbImportConfigurationValidator(reverseEngineering, config, injector);
         try {
             validator.validate();
@@ -122,7 +142,6 @@ public class DbImportTask extends BaseCayenneTask {
         config.setTableTypes(reverseEngineering.getTableTypes());
         config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
         config.setNamingStrategy(reverseEngineering.getNamingStrategy());
-        config.setFiltersConfig(new FiltersConfigBuilder(reverseEngineering).build());
         config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
         config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
         config.setDefaultPackage(reverseEngineering.getDefaultPackage());
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
index 99ba830..ba7ff83 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/SQLServerUnitDbAdapter.java
@@ -91,4 +91,9 @@ public class SQLServerUnitDbAdapter extends SybaseUnitDbAdapter {
     public boolean supportsSelectBooleanExpression() {
         return false;
     }
+
+    @Override
+    public boolean supportsCatalogs() {
+        return true;
+    }
 }
diff --git a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index c1c77b8..94a5c15 100644
--- a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -18,8 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
+import javax.sql.DataSource;
 import java.io.File;
 
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+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.DbSyncModule;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportAction;
@@ -100,11 +105,26 @@ public class DbImporterMojo extends AbstractMojo {
 
         // check missing data source parameters
         dataSource.validate();
-        final DbImportConfiguration config = createConfig(logger);
         final Injector injector = DIBootstrap.createInjector(
                 new DbSyncModule(), new ToolsModule(logger), new DbImportModule(),
                 binder -> binder.bind(ClassLoaderManager.class).toInstance(new MavenPluginClassLoaderManager(project)));
 
+        final DbImportConfiguration config = createConfig(logger);
+
+        DataSourceFactory dataSourceFactory = injector.getInstance(DataSourceFactory.class);
+        DbAdapterFactory dbAdapterFactory = injector.getInstance(DbAdapterFactory.class);
+        DataNodeDescriptor dataNodeDescriptor = config.createDataNodeDescriptor();
+        try {
+            DataSource dataSource = dataSourceFactory.getDataSource(dataNodeDescriptor);
+            DbAdapter dbAdapter = dbAdapterFactory.createAdapter(dataNodeDescriptor, dataSource);
+            config.setFiltersConfig(new FiltersConfigBuilder(dbImportConfig)
+                    .dataSource(dataSource)
+                    .dbAdapter(dbAdapter)
+                    .build());
+        } catch (Exception e) {
+            throw new MojoExecutionException("Error getting dataSource", e);
+        }
+
         final DbImportConfigurationValidator validator = new DbImportConfigurationValidator(
                 dbImportConfig, config, injector);
 
@@ -142,7 +162,6 @@ public class DbImporterMojo extends AbstractMojo {
         config.setAdapter(adapter);
         config.setDefaultPackage(dbImportConfig.getDefaultPackage());
         config.setDriver(dataSource.getDriver());
-        config.setFiltersConfig(new FiltersConfigBuilder(dbImportConfig).build());
         config.setForceDataMapCatalog(dbImportConfig.isForceDataMapCatalog());
         config.setForceDataMapSchema(dbImportConfig.isForceDataMapSchema());
         config.setLogger(logger);
diff --git a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
index 002a97d..6ca8ef2 100644
--- a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
+++ b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/DbImporterMojoConfigurationTest.java
@@ -18,21 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.tools;
 
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
+
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.DbImportConfiguration;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
+import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.dbsync.reverse.filters.IncludeTableFilter;
 import org.apache.cayenne.dbsync.reverse.filters.PatternFilter;
 import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
-import org.slf4j.Logger;
 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
 import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeSet;
-import java.util.regex.Pattern;
+import org.slf4j.Logger;
 
 import static org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineeringUtils.*;
 import static org.mockito.Mockito.mock;
@@ -67,8 +68,12 @@ public class DbImporterMojoConfigurationTest extends AbstractMojoTestCase {
 
     @Test
     public void testLoadSchema2() throws Exception {
-        FiltersConfig filters = getCdbImport("pom-schema-2.xml").createConfig(mock(Logger.class))
-                .getDbLoaderConfig().getFiltersConfig();
+        DbImporterMojo dbImporterMojo = getCdbImport("pom-schema-2.xml");
+        DbImportConfiguration dbImportConfiguration = dbImporterMojo.createConfig(mock(Logger.class));
+        dbImportConfiguration.setFiltersConfig(new FiltersConfigBuilder(
+                dbImporterMojo.getReverseEngineering()).build());
+
+        FiltersConfig filters = dbImportConfiguration.getDbLoaderConfig().getFiltersConfig();
 
         TreeSet<IncludeTableFilter> includes = new TreeSet<>();
         includes.add(new IncludeTableFilter(null, new PatternFilter().exclude("^ETL_.*")));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
index 6a2febf..ba9a436 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbLoaderContext.java
@@ -19,7 +19,8 @@
 
 package org.apache.cayenne.modeler.dialog.db.load;
 
-import javax.swing.*;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
 import java.io.File;
 import java.sql.Connection;
 
@@ -32,6 +33,7 @@ import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ClassLoadingService;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.editor.dbimport.DbImportView;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
@@ -152,13 +154,21 @@ public class DbLoaderContext {
     // Fill config from metadata reverseEngineering
     private void fillConfig(DbImportConfiguration config, DBConnectionInfo connectionInfo,
                             ReverseEngineering reverseEngineering) {
-        FiltersConfigBuilder filtersConfigBuilder = new FiltersConfigBuilder(reverseEngineering);
         config.setAdapter(connectionInfo.getDbAdapter());
         config.setUsername(connectionInfo.getUserName());
         config.setPassword(connectionInfo.getPassword());
         config.setDriver(connectionInfo.getJdbcDriver());
         config.setUrl(connectionInfo.getUrl());
-        config.getDbLoaderConfig().setFiltersConfig(filtersConfigBuilder.build());
+
+        try {
+            ClassLoadingService classLoadingService = Application.getInstance().getClassLoadingService();
+            config.getDbLoaderConfig().setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
+                    .dataSource(connectionInfo.makeDataSource(classLoadingService))
+                    .dbAdapter(connectionInfo.makeAdapter(classLoadingService))
+                    .build());
+        } catch (Exception e) {
+            processException(e, "Fail while building configs.");
+        }
         config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
         config.setNamingStrategy(reverseEngineering.getNamingStrategy());
         config.setDefaultPackage(reverseEngineering.getDefaultPackage());