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<>();