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 <[email protected]> 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<>();
