You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2021/05/26 12:37:38 UTC

[cayenne] 01/04: fix: dbimport scheme not working on sqlite, add ability to import databases where tables are outside catalogs and schemes

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

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

commit f499a7f54a2cccbed8cdb3e1a206bee66f5e88f5
Author: dmitrij <dm...@gmail.com>
AuthorDate: Mon May 24 13:02:30 2021 +0300

    fix: dbimport scheme not working on sqlite, add ability to import databases where tables are outside catalogs and schemes
---
 .../cayenne/modeler/action/LoadDbSchemaAction.java | 12 +--
 .../editor/dbimport/DatabaseSchemaLoader.java      | 86 ++++++++++++----------
 .../modeler/editor/dbimport/DbImportTree.java      | 30 +++++---
 .../editor/dbimport/PrintColumnsBiFunction.java    | 37 ++++++----
 .../modeler/editor/dbimport/tree/TableNode.java    |  9 ++-
 5 files changed, 102 insertions(+), 72 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
index 8d46749..9f7b015 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
@@ -76,21 +76,23 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
             try {
 
                 DBConnectionInfo connectionInfo = getConnectionInfo("Load Db Schema");
-                if(connectionInfo == null) {
+                if (connectionInfo == null) {
                     return;
                 }
 
                 if (tablePath != null) {
                     Object userObject = ((DbImportTreeNode) tablePath.getLastPathComponent()).getUserObject();
-                    if(userObject instanceof Catalog) {
+                    if (userObject instanceof Catalog) {
                         Catalog catalog = (Catalog) userObject;
-                        if(catalog.getSchemas().isEmpty()) {
+                        if (catalog.getSchemas().isEmpty()) {
                             loadTables(connectionInfo, tablePath, rootParent);
                         }
-                    } else if(userObject instanceof Schema) {
+                    } else if (userObject instanceof Schema) {
                         loadTables(connectionInfo, tablePath, rootParent);
-                    } else if(userObject instanceof IncludeTable) {
+                    } else if (userObject instanceof IncludeTable) {
                         loadColumns(connectionInfo, tablePath);
+                    } else {
+                        loadTables(connectionInfo, tablePath, rootParent);
                     }
                 } else {
                     loadDataBase(connectionInfo);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DatabaseSchemaLoader.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DatabaseSchemaLoader.java
index 833df84..e71d424 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DatabaseSchemaLoader.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DatabaseSchemaLoader.java
@@ -58,6 +58,10 @@ public class DatabaseSchemaLoader {
             processCatalogs(connection, dbAdapter);
         }
 
+        if (databaseReverseEngineering.getSchemas().isEmpty() && databaseReverseEngineering.getCatalogs().isEmpty()) {
+            loadTables(connectionInfo, loadingService, null, null);
+        }
+
         sort();
         return databaseReverseEngineering;
     }
@@ -84,11 +88,11 @@ public class DatabaseSchemaLoader {
             while (rsCatalog.next() && dbAdapter.supportsCatalogsOnReverseEngineering()) {
                 hasCatalogs = true;
                 String catalog = rsCatalog.getString("TABLE_CAT");
-                if(!systemCatalogs.contains(catalog)) {
+                if (!systemCatalogs.contains(catalog)) {
                     processSchemas(connection, catalog, dbAdapter);
                 }
             }
-            if(!hasCatalogs) {
+            if (!hasCatalogs) {
                 processSchemas(connection, null, dbAdapter);
             }
         }
@@ -99,8 +103,8 @@ public class DatabaseSchemaLoader {
                                 DbAdapter dbAdapter) throws SQLException {
         DatabaseMetaData metaData = connection.getMetaData();
         boolean hasSchemas = false;
-        if(metaData.supportsSchemasInTableDefinitions()) {
-            try(ResultSet rsSchema = metaData.getSchemas(catalog, null)) {
+        if (metaData.supportsSchemasInTableDefinitions()) {
+            try (ResultSet rsSchema = metaData.getSchemas(catalog, null)) {
                 List<String> systemSchemas = dbAdapter.getSystemSchemas();
                 while (rsSchema.next()) {
                     hasSchemas = true;
@@ -112,7 +116,7 @@ public class DatabaseSchemaLoader {
             }
         }
 
-        if(catalog != null && !hasSchemas) {
+        if (catalog != null && !hasSchemas) {
             packFilterContainer(catalog, null);
         }
     }
@@ -125,17 +129,19 @@ public class DatabaseSchemaLoader {
         String catalogName = null, schemaName = null;
 
         Object userObject = getUserObject(path, pathIndex);
-        if(userObject instanceof Catalog) {
-            Catalog catalog = (Catalog) userObject;
-            catalogName = catalog.getName();
-            if(!catalog.getSchemas().isEmpty()) {
-                userObject = getUserObject(path, ++pathIndex);
-                if (userObject instanceof Schema) {
-                    schemaName = ((Schema) userObject).getName();
+        if (userObject != null) {
+            if (userObject instanceof Catalog) {
+                Catalog catalog = (Catalog) userObject;
+                catalogName = catalog.getName();
+                if (!catalog.getSchemas().isEmpty()) {
+                    userObject = getUserObject(path, ++pathIndex);
+                    if (userObject instanceof Schema) {
+                        schemaName = ((Schema) userObject).getName();
+                    }
                 }
+            } else if (userObject instanceof Schema) {
+                schemaName = ((Schema) userObject).getName();
             }
-        } else if(userObject instanceof Schema) {
-            schemaName = ((Schema) userObject).getName();
         }
 
         try (Connection connection = connectionInfo.makeDataSource(loadingService).getConnection()) {
@@ -153,8 +159,9 @@ public class DatabaseSchemaLoader {
                     String catalog = resultSet.getString("TABLE_CAT");
                     packTable(table, catalog == null ? catalogName : catalog, schema, null);
                 }
-                if(!hasTables) {
-                    packFilterContainer(catalogName, schemaName);
+                if (!hasTables) {
+                    if (catalogName != null ||  schemaName != null)
+                        packFilterContainer(catalogName, schemaName);
                 }
                 packProcedures(connection);
             }
@@ -169,14 +176,11 @@ public class DatabaseSchemaLoader {
         String catalogName = null, schemaName = null;
 
         Object userObject = getUserObject(path, pathIndex);
-        if(userObject instanceof Catalog) {
+        if (userObject instanceof Catalog) {
             catalogName = ((Catalog) userObject).getName();
             userObject = getUserObject(path, ++pathIndex);
-            if(userObject instanceof Schema) {
-                schemaName = ((Schema) userObject).getName();
-                userObject = getUserObject(path, ++pathIndex);
-            }
-        } else if(userObject instanceof Schema) {
+        }
+        if (userObject instanceof Schema) {
             schemaName = ((Schema) userObject).getName();
             userObject = getUserObject(path, ++pathIndex);
         }
@@ -198,7 +202,7 @@ public class DatabaseSchemaLoader {
         if (catalogName != null && schemaName == null) {
             Catalog parentCatalog = getCatalogByName(databaseReverseEngineering.getCatalogs(), catalogName);
 
-            if(parentCatalog == null) {
+            if (parentCatalog == null) {
                 parentCatalog = new Catalog();
                 parentCatalog.setName(catalogName);
                 databaseReverseEngineering.addCatalog(parentCatalog);
@@ -208,7 +212,7 @@ public class DatabaseSchemaLoader {
         } else if (catalogName == null) {
             Schema parentSchema = getSchemaByName(databaseReverseEngineering.getSchemas(), schemaName);
 
-            if(parentSchema == null) {
+            if (parentSchema == null) {
                 parentSchema = new Schema();
                 parentSchema.setName(schemaName);
                 databaseReverseEngineering.addSchema(parentSchema);
@@ -219,7 +223,7 @@ public class DatabaseSchemaLoader {
             Schema parentSchema;
             if (parentCatalog != null) {
                 parentSchema = getSchemaByName(parentCatalog.getSchemas(), schemaName);
-                if(parentSchema == null) {
+                if (parentSchema == null) {
                     parentSchema = new Schema();
                     parentSchema.setName(schemaName);
                     parentCatalog.addSchema(parentSchema);
@@ -237,22 +241,24 @@ public class DatabaseSchemaLoader {
     }
 
     private Object getUserObject(TreePath path, int pathIndex) {
-        return ((DbImportTreeNode)path.getPathComponent(pathIndex)).getUserObject();
+        if (path == null)
+            return null;
+        return ((DbImportTreeNode) path.getPathComponent(pathIndex)).getUserObject();
     }
 
     private String processTable(Object userObject) {
-        if(userObject instanceof IncludeTable) {
-            return  ((IncludeTable) userObject).getPattern();
+        if (userObject instanceof IncludeTable) {
+            return ((IncludeTable) userObject).getPattern();
         }
         return null;
     }
 
     private void packProcedures(Connection connection) throws SQLException {
         Collection<Catalog> catalogs = databaseReverseEngineering.getCatalogs();
-        for(Catalog catalog : catalogs) {
+        for (Catalog catalog : catalogs) {
             Collection<Schema> schemas = catalog.getSchemas();
-            if(!schemas.isEmpty()) {
-                for(Schema schema : schemas) {
+            if (!schemas.isEmpty()) {
+                for (Schema schema : schemas) {
                     ResultSet procResultSet = getProcedures(connection, catalog.getName(), schema.getName());
                     packProcedures(procResultSet, schema);
                 }
@@ -263,7 +269,7 @@ public class DatabaseSchemaLoader {
         }
 
         Collection<Schema> schemas = databaseReverseEngineering.getSchemas();
-        for(Schema schema : schemas) {
+        for (Schema schema : schemas) {
             ResultSet procResultSet = getProcedures(connection, null, schema.getName());
             packProcedures(procResultSet, schema);
         }
@@ -291,6 +297,7 @@ public class DatabaseSchemaLoader {
             if (!databaseReverseEngineering.getIncludeTables().contains(table)) {
                 databaseReverseEngineering.addIncludeTable(table);
             }
+            addColumn(null, table, columnName);
             return;
         }
 
@@ -306,12 +313,17 @@ public class DatabaseSchemaLoader {
     }
 
     private void addColumn(FilterContainer filterContainer, IncludeTable table, String columnName) {
-        IncludeTable foundTable = getTableByName(filterContainer.getIncludeTables(), table.getPattern());
+        if (columnName == null)
+            return;
+
+        IncludeTable foundTable;
+        if (filterContainer != null)
+            foundTable = getTableByName(filterContainer.getIncludeTables(), table.getPattern());
+        else
+            foundTable = getTableByName(databaseReverseEngineering.getIncludeTables(), table.getPattern());
         table = foundTable != null ? foundTable : table;
-        if (columnName != null) {
-            IncludeColumn includeColumn = new IncludeColumn(columnName);
-            table.addIncludeColumn(includeColumn);
-        }
+        IncludeColumn includeColumn = new IncludeColumn(columnName);
+        table.addIncludeColumn(includeColumn);
     }
 
     private Catalog getCatalogByName(Collection<Catalog> catalogs, String catalogName) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTree.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTree.java
index 6438d51..d035fb3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTree.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTree.java
@@ -79,18 +79,22 @@ public class DbImportTree extends JTree {
         DbImportModel model = (DbImportModel) this.getModel();
         DbImportTreeNode root = (DbImportTreeNode) model.getRoot();
         Collection<Catalog> catalogs = reverseEngineering.getCatalogs();
-        if(!catalogs.isEmpty()) {
+        if (!catalogs.isEmpty()) {
             catalogs.forEach(catalog -> {
                 Collection<Schema> schemas = catalog.getSchemas();
-                if(!schemas.isEmpty()) {
+                if (!schemas.isEmpty()) {
                     DbImportTreeNode currentRoot = findNodeInParent(root, catalog);
                     schemas.forEach(schema -> packNextFilter(schema, currentRoot, processor));
                 } else {
                     packNextFilter(catalog, root, processor);
                 }
             });
-        } else {
+        } else if (!reverseEngineering.getSchemas().isEmpty()) {
             reverseEngineering.getSchemas().forEach(schema -> packNextFilter(schema, root, processor));
+        } else if (!reverseEngineering.getIncludeTables().isEmpty()) {
+            Schema schema = new Schema();
+            schema.getIncludeTables().addAll(reverseEngineering.getIncludeTables());
+            packNextFilter(schema, root, processor);
         }
     }
 
@@ -98,11 +102,15 @@ public class DbImportTree extends JTree {
                                 BiFunction<FilterContainer, DbImportTreeNode, Void> processor) {
         DbImportTreeNode container = findNodeInParent(root, filterContainer);
 
-        if (container == null) {
-            return;
+        if (container != null) {
+            container.setLoaded(true);
+        } else {
+            if (!filterContainer.getIncludeTables().isEmpty())
+                container = root;
+            else
+                return;
         }
 
-        container.setLoaded(true);
         processor.apply(filterContainer, container);
     }
 
@@ -128,14 +136,14 @@ public class DbImportTree extends JTree {
                 }
             }
 
-            if(object instanceof Schema) {
+            if (object instanceof Schema) {
                 Schema schema = (Schema) object;
-                if(!(userObject instanceof Schema)) {
+                if (!(userObject instanceof Schema)) {
                     continue;
                 }
 
                 Schema currentSchema = (Schema) userObject;
-                if(currentSchema.getName().equals(schema.getName())) {
+                if (currentSchema.getName().equals(schema.getName())) {
                     return node;
                 }
             }
@@ -239,7 +247,7 @@ public class DbImportTree extends JTree {
         expandBeginningWithNode(getRootNode(), expandIndexesList);
     }
 
-    public  <T extends PatternParam> void printParams(Collection<T> collection, DbImportTreeNode parent) {
+    public <T extends PatternParam> void printParams(Collection<T> collection, DbImportTreeNode parent) {
         for (T element : collection) {
             DbImportTreeNode node = !isTransferable ? new DbImportTreeNode(element) : new TransferableNode(element);
             if (!"".equals(node.getSimpleNodeName())) {
@@ -334,7 +342,7 @@ public class DbImportTree extends JTree {
     }
 
     public DbImportTreeNode getSelectedNode() {
-        if(this.getSelectionPath() == null) {
+        if (this.getSelectionPath() == null) {
             return null;
         }
         return (DbImportTreeNode) this.getSelectionPath().getLastPathComponent();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
index 1458bec..be77314 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/PrintColumnsBiFunction.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.editor.dbimport;
 import java.util.function.BiFunction;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
 
 public class PrintColumnsBiFunction implements BiFunction<FilterContainer, DbImportTreeNode, Void> {
@@ -34,22 +35,26 @@ public class PrintColumnsBiFunction implements BiFunction<FilterContainer, DbImp
 
     @Override
     public Void apply(FilterContainer filterContainer, DbImportTreeNode root) {
-        DbImportModel model = (DbImportModel) dbImportTree.getModel();
-        filterContainer.getIncludeTables().forEach(tableFilter -> {
-            DbImportTreeNode container = dbImportTree
-                    .findNodeInParent(root, tableFilter);
-            if (container == null) {
-                return;
-            }
-            if (container.getChildCount() != 0) {
-                container.removeAllChildren();
-            }
-
-            dbImportTree.packColumns(tableFilter , container);
-
-            container.setLoaded(true);
-            model.reload(container);
-        });
+        if (filterContainer != null) {
+            filterContainer.getIncludeTables().forEach(tableFilter -> processTable(tableFilter, root));
+        }
         return null;
     }
+
+    private void processTable(IncludeTable tableFilter, DbImportTreeNode root) {
+        DbImportModel model = (DbImportModel) dbImportTree.getModel();
+        DbImportTreeNode container = dbImportTree
+                .findNodeInParent(root, tableFilter);
+        if (container == null) {
+            return;
+        }
+        if (container.getChildCount() != 0) {
+            container.removeAllChildren();
+        }
+
+        dbImportTree.packColumns(tableFilter, container);
+
+        container.setLoaded(true);
+        model.reload(container);
+    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/tree/TableNode.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/tree/TableNode.java
index 08652d1..c75a712 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/tree/TableNode.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/tree/TableNode.java
@@ -36,9 +36,12 @@ abstract class TableNode<T extends Node> extends Node<T> {
     
     @Override
     public Status getStatus(ReverseEngineering config) {
-        Status parentStatus = getParent().getStatus(config);
-        if(parentStatus != Status.INCLUDE) {
-            return parentStatus;
+        T parent = getParent();
+        if(parent != null) {
+            Status parentStatus = parent.getStatus(config);
+            if (parentStatus != Status.INCLUDE) {
+                return parentStatus;
+            }
         }
 
         List<IncludeTable> includeTables = new ArrayList<>();