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 dc08880 CAY-2600 Modeler DbImport: Can't retrieve schema for
databases with no catalog support
dc08880 is described below
commit dc088800eab47bd6b8a34144ef051d6f8c155879
Author: Arseni Bulatski <[email protected]>
AuthorDate: Fri Aug 23 16:18:05 2019 +0300
CAY-2600 Modeler DbImport: Can't retrieve schema for databases with no
catalog support
---
.../java/org/apache/cayenne/dba/AutoAdapter.java | 28 +++-
.../java/org/apache/cayenne/dba/DbAdapter.java | 23 ++-
.../java/org/apache/cayenne/dba/JdbcAdapter.java | 32 ++--
.../org/apache/cayenne/dba/mysql/MySQLAdapter.java | 35 +++--
.../apache/cayenne/dba/oracle/OracleAdapter.java | 36 +++--
.../cayenne/dba/sqlserver/SQLServerAdapter.java | 16 +-
.../cayenne/modeler/action/LoadDbSchemaAction.java | 3 +-
.../editor/dbimport/DatabaseSchemaLoader.java | 168 +++++++++++----------
.../modeler/editor/dbimport/DbImportTree.java | 64 +++++---
9 files changed, 251 insertions(+), 154 deletions(-)
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index d88ecbf..7595eed 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -19,6 +19,13 @@
package org.apache.cayenne.dba;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
@@ -37,16 +44,11 @@ import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.SQLAction;
import org.apache.cayenne.query.SelectQuery;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.function.Function;
-
/**
* A DbAdapter that automatically detects the kind of database it is running on
* and instantiates an appropriate DB-specific adapter, delegating all
* subsequent method calls to this adapter.
- *
+ *
* @since 1.2
*/
public class AutoAdapter implements DbAdapter {
@@ -63,7 +65,7 @@ public class AutoAdapter implements DbAdapter {
/**
* Creates an {@link AutoAdapter} based on a delegate adapter obtained
via
* "adapterProvider".
- *
+ *
* @since 3.1
*/
public AutoAdapter(Provider<DbAdapter> adapterProvider, JdbcEventLogger
logger) {
@@ -97,7 +99,7 @@ public class AutoAdapter implements DbAdapter {
protected DbAdapter loadAdapter() {
return adapterProvider.get();
}
-
+
/**
* @since 4.0
*/
@@ -251,4 +253,14 @@ public class AutoAdapter implements DbAdapter {
public EJBQLTranslatorFactory getEjbqlTranslatorFactory() {
return getAdapter().getEjbqlTranslatorFactory();
}
+
+ @Override
+ public List<String> getSystemCatalogs() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<String> getSystemSchemas() {
+ return Collections.emptyList();
+ }
}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
index 4620d0e..caf61df 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
@@ -18,6 +18,12 @@
****************************************************************/
package org.apache.cayenne.dba;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Function;
+
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
import org.apache.cayenne.access.translator.ParameterBinding;
@@ -33,11 +39,6 @@ import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.SQLAction;
import org.apache.cayenne.query.SelectQuery;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.function.Function;
-
/**
* A Cayenne extension point that abstracts the differences between specifics
of
* JDBC interfaces to various databases. Cayenne already ships with a number of
@@ -231,4 +232,16 @@ public interface DbAdapter {
* @since 4.0
*/
EJBQLTranslatorFactory getEjbqlTranslatorFactory();
+
+ /**
+ * @since 4.1
+ * @return list of system catalogs
+ */
+ List<String> getSystemCatalogs();
+
+ /**
+ * @since 4.1
+ * @return list of system schemas
+ */
+ List<String> getSystemSchemas();
}
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index db54d6b..88217ca 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -19,6 +19,16 @@
package org.apache.cayenne.dba;
+import java.net.URL;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Function;
+
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
@@ -26,8 +36,8 @@ import org.apache.cayenne.access.translator.ParameterBinding;
import org.apache.cayenne.access.translator.batch.BatchTranslatorFactory;
import org.apache.cayenne.access.translator.ejbql.EJBQLTranslatorFactory;
import org.apache.cayenne.access.translator.ejbql.JdbcEJBQLTranslatorFactory;
-import org.apache.cayenne.access.translator.select.SelectTranslator;
import org.apache.cayenne.access.translator.select.DefaultSelectTranslator;
+import org.apache.cayenne.access.translator.select.SelectTranslator;
import org.apache.cayenne.access.types.ExtendedType;
import org.apache.cayenne.access.types.ExtendedTypeFactory;
import org.apache.cayenne.access.types.ExtendedTypeMap;
@@ -50,16 +60,6 @@ import org.apache.cayenne.resource.Resource;
import org.apache.cayenne.resource.ResourceLocator;
import org.apache.cayenne.util.Util;
-import java.net.URL;
-import java.sql.PreparedStatement;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Function;
-
/**
* A generic DbAdapter implementation. Can be used as a default adapter or as a
* superclass of a concrete adapter implementation.
@@ -599,6 +599,16 @@ public class JdbcAdapter implements DbAdapter {
return ejbqlTranslatorFactory;
}
+ @Override
+ public List<String> getSystemCatalogs() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<String> getSystemSchemas() {
+ return Collections.emptyList();
+ }
+
/**
* Sets a translator factory for EJBQL to SQL translation. This property is
* normally initialized in constructor by calling
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
index 1d667bd..5129df5 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
@@ -19,6 +19,18 @@
package org.apache.cayenne.dba.mysql;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Function;
+
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
@@ -45,18 +57,6 @@ import org.apache.cayenne.query.Query;
import org.apache.cayenne.query.SQLAction;
import org.apache.cayenne.resource.ResourceLocator;
-import java.sql.PreparedStatement;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Function;
-
/**
* DbAdapter implementation for <a href="http://www.mysql.com">MySQL RDBMS</a>.
* <h3>
@@ -85,6 +85,8 @@ public class MySQLAdapter extends JdbcAdapter {
protected String storageEngine;
+ private String[] SYSTEM_CATALOGS = new String[]{"sys"};
+
public MySQLAdapter(@Inject RuntimeProperties runtimeProperties,
@Inject(Constants.SERVER_DEFAULT_TYPES_LIST) List<ExtendedType>
defaultExtendedTypes,
@Inject(Constants.SERVER_USER_TYPES_LIST) List<ExtendedType> userExtendedTypes,
@@ -116,7 +118,7 @@ public class MySQLAdapter extends JdbcAdapter {
/**
* Uses special action builder to create the right action.
- *
+ *
* @since 1.2
*/
@Override
@@ -264,7 +266,7 @@ public class MySQLAdapter extends JdbcAdapter {
* Customizes PK clause semantics to ensure that generated columns are
in
* the beginning of the PK definition, as this seems to be a
requirement for
* InnoDB tables.
- *
+ *
* @since 1.2
*/
// See CAY-358 for details of the InnoDB problem
@@ -356,6 +358,11 @@ public class MySQLAdapter extends JdbcAdapter {
}
}
+ @Override
+ public List<String> getSystemCatalogs() {
+ return Arrays.asList(SYSTEM_CATALOGS);
+ }
+
final class PKComparator implements Comparator<DbAttribute> {
public int compare(DbAttribute a1, DbAttribute a2) {
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
index 271f156..0065bb2 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleAdapter.java
@@ -19,6 +19,18 @@
package org.apache.cayenne.dba.oracle;
+import java.lang.reflect.Field;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Function;
+
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.access.sqlbuilder.sqltree.Node;
@@ -44,17 +56,6 @@ import org.apache.cayenne.query.SQLAction;
import org.apache.cayenne.query.UpdateBatchQuery;
import org.apache.cayenne.resource.ResourceLocator;
-import java.lang.reflect.Field;
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.function.Function;
-
/**
* DbAdapter implementation for <a href="http://www.oracle.com">Oracle RDBMS
* </a>. Sample connection settings to use with Oracle are shown below:
@@ -82,6 +83,14 @@ public class OracleAdapter extends JdbcAdapter {
protected static boolean supportsOracleLOB;
+ private String[] SYSTEM_SCHEMAS = new String[]{
+ "ANONYMOUS", "APPQOSSYS", "AUDSYS", "CTXSYS",
"DBSFWUSER",
+ "DBSNMP", "DIP", "DVF", "GGSYS", "DVSYS",
"GSMADMIN_INTERNAL",
+ "GSMCATUSER", "GSMUSER", "LBACSYS", "MDDATA", "MDSYS",
"OJVMSYS",
+ "OLAPSYS", "ORACLE_OCM", "ORDDATA", "ORDPLUGINS",
"ORDSYS", "OUTLN",
+ "REMOTE_SCHEDULER_AGENT", "SYSTEM", "WMSYS",
"SI_INFORMTN_SCHEMA",
+ "SYS", "SYSBACKUP", "SYSDG", "SYSKM", "SYSRAC",
"SYS$UMF", "XDB", "XS$NULL"};
+
static {
// TODO: as CAY-234 shows, having such initialization done in a
static
// fashion
@@ -287,6 +296,11 @@ public class OracleAdapter extends JdbcAdapter {
return query.createSQLAction(new OracleActionBuilder(node));
}
+ @Override
+ public List<String> getSystemSchemas() {
+ return Arrays.asList(SYSTEM_SCHEMAS);
+ }
+
/**
* @since 3.0
*/
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
index 96a0ddf..c15eb64 100644
---
a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
+++
b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerAdapter.java
@@ -19,6 +19,7 @@
package org.apache.cayenne.dba.sqlserver;
+import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
@@ -43,7 +44,7 @@ import org.apache.cayenne.resource.ResourceLocator;
* <h3>Microsoft Driver Settings</h3>
* <p>
* Sample connection settings to use with MS SQL Server are shown below:
- *
+ *
* <pre>
* sqlserver.jdbc.username = test
* sqlserver.jdbc.password = secret
@@ -62,14 +63,14 @@ import org.apache.cayenne.resource.ResourceLocator;
* "http://jtds.sourceforge.net">http://jtds.sourceforge.net </a>. It supports
* both SQLServer and Sybase. Sample SQLServer settings are the following:
* </p>
- *
+ *
* <pre>
* sqlserver.jdbc.username = test
* sqlserver.jdbc.password = secret
* sqlserver.jdbc.url = jdbc:jtds:sqlserver://192.168.0.65/cayenne
* sqlserver.jdbc.driver = net.sourceforge.jtds.jdbc.Driver
* </pre>
- *
+ *
* @since 1.1
*/
public class SQLServerAdapter extends SybaseAdapter {
@@ -80,6 +81,8 @@ public class SQLServerAdapter extends SybaseAdapter {
@Deprecated
public static final String TRIM_FUNCTION = "RTRIM";
+ private String[] SYSTEM_SCHEMAS = new String[]{"dbo", "sys",
"INFORMATION_SCHEMA"};
+
public SQLServerAdapter(@Inject RuntimeProperties runtimeProperties,
@Inject(Constants.SERVER_DEFAULT_TYPES_LIST) List<ExtendedType>
defaultExtendedTypes,
@Inject(Constants.SERVER_USER_TYPES_LIST) List<ExtendedType> userExtendedTypes,
@@ -101,7 +104,7 @@ public class SQLServerAdapter extends SybaseAdapter {
/**
* Uses SQLServerActionBuilder to create the right action.
- *
+ *
* @since 1.2
*/
@Override
@@ -109,4 +112,9 @@ public class SQLServerAdapter extends SybaseAdapter {
return query.createSQLAction(new SQLServerActionBuilder(node));
}
+ @Override
+ public List<String> getSystemSchemas() {
+ return Arrays.asList(SYSTEM_SCHEMAS);
+ }
+
}
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 cb65691..911b6d5 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
@@ -22,7 +22,6 @@ package org.apache.cayenne.modeler.action;
import javax.swing.JOptionPane;
import javax.swing.tree.TreePath;
import java.awt.event.ActionEvent;
-import java.sql.SQLException;
import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
import org.apache.cayenne.modeler.Application;
@@ -104,7 +103,7 @@ public class LoadDbSchemaAction extends CayenneAction {
}
- } catch (SQLException exception) {
+ } catch (Exception exception) {
JOptionPane.showMessageDialog(
Application.getFrame(),
exception.getMessage(),
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 5275238..5f22e33 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
@@ -21,10 +21,13 @@ package org.apache.cayenne.modeler.editor.dbimport;
import javax.swing.tree.TreePath;
import java.sql.Connection;
+import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
+import java.util.List;
+import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
@@ -39,9 +42,6 @@ import org.apache.cayenne.modeler.pref.DBConnectionInfo;
public class DatabaseSchemaLoader {
private static final String INCLUDE_ALL_PATTERN = "%";
- private static final int TABLE_INDEX = 3;
- private static final int SCHEMA_INDEX = 2;
- private static final int CATALOG_INDEX = 1;
private ReverseEngineering databaseReverseEngineering;
@@ -51,94 +51,84 @@ public class DatabaseSchemaLoader {
public ReverseEngineering load(DBConnectionInfo connectionInfo,
ClassLoadingService loadingService,
- String[] tableTypesFromConfig) throws
SQLException {
+ String[] tableTypesFromConfig) throws
Exception {
+ DbAdapter dbAdapter = connectionInfo.makeAdapter(loadingService);
try (Connection connection =
connectionInfo.makeDataSource(loadingService).getConnection()) {
String[] types = tableTypesFromConfig != null &&
tableTypesFromConfig.length != 0 ?
tableTypesFromConfig :
new String[]{"TABLE", "VIEW", "SYSTEM TABLE",
"GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS",
"SYNONYM"};
- processCatalogs(connection, types);
+ processCatalogs(connection, types, dbAdapter);
}
return databaseReverseEngineering;
}
- private void processCatalogs(Connection connection, String[] types) throws
SQLException {
- String defaultCatalog = connection.getCatalog();
+ private void processCatalogs(Connection connection, String[] types,
DbAdapter dbAdapter) throws SQLException {
try (ResultSet rsCatalog = connection.getMetaData().getCatalogs()) {
boolean hasCatalogs = false;
+ List<String> systemCatalogs = dbAdapter.getSystemCatalogs();
while (rsCatalog.next()) {
hasCatalogs = true;
- ResultSet resultSet = connection.getMetaData()
- .getTables(processFilter(rsCatalog, defaultCatalog,
CATALOG_INDEX),
- null,
- INCLUDE_ALL_PATTERN,
- types);
- packTable(resultSet);
- packFunctions(connection);
+ String catalog = rsCatalog.getString("TABLE_CAT");
+ if(!systemCatalogs.contains(catalog)) {
+ processSchemas(connection, types, catalog, dbAdapter);
+ }
}
if(!hasCatalogs) {
- processSchemas(connection, types);
+ processSchemas(connection, types, null, dbAdapter);
}
}
}
- private void processSchemas(Connection connection, String[] types) throws
SQLException {
- String defaultSchema = connection.getSchema();
- try(ResultSet rsSchema = connection.getMetaData().getSchemas()) {
+ private void processSchemas(Connection connection,
+ String[] types,
+ String catalog,
+ DbAdapter dbAdapter) throws SQLException {
+ DatabaseMetaData metaData = connection.getMetaData();
+ try(ResultSet rsSchema = metaData.getSchemas(catalog, null)) {
boolean hasSchemas = false;
+ List<String> systemSchemas = dbAdapter.getSystemSchemas();
while (rsSchema.next()) {
hasSchemas = true;
- ResultSet resultSet = connection.getMetaData()
- .getTables(null,
- processFilter(rsSchema, defaultSchema,
SCHEMA_INDEX),
- INCLUDE_ALL_PATTERN,
- types);
- packTable(resultSet);
- packFunctions(connection);
+ String schema = rsSchema.getString("TABLE_SCHEM");
+ if(!systemSchemas.contains(schema)) {
+ ResultSet resultSet = metaData.getTables(catalog, schema,
INCLUDE_ALL_PATTERN, types);
+ packTable(resultSet);
+ packProcedures(connection);
+ }
}
if(!hasSchemas) {
- ResultSet resultSet = connection.getMetaData()
- .getTables(null,
- null,
- INCLUDE_ALL_PATTERN,
- types);
- packTable(resultSet);
+ ResultSet resultSet = metaData.getTables(catalog, null,
INCLUDE_ALL_PATTERN, types);
packTable(resultSet);
+ packProcedures(connection);
}
}
}
- private void packTable(ResultSet resultSet) throws SQLException {
- while (resultSet.next()) {
- String tableName = resultSet.getString(TABLE_INDEX);
- String schemaName = resultSet.getString(SCHEMA_INDEX);
- String catalogName = resultSet.getString(CATALOG_INDEX);
- packTable(tableName, catalogName, schemaName, null);
- }
- }
-
- private String processFilter(ResultSet resultSet, String defaultFilter,
int filterIndex) throws SQLException {
- return defaultFilter.isEmpty() ?
- resultSet.getString(filterIndex) :
- defaultFilter;
- }
-
public ReverseEngineering loadColumns(DBConnectionInfo connectionInfo,
ClassLoadingService loadingService,
TreePath path) throws SQLException {
- Object userObject =
((DbImportTreeNode)path.getPathComponent(1)).getUserObject();
+ int pathIndex = 1;
String catalogName = null, schemaName = null;
+
+ Object userObject = getUserObject(path, pathIndex);
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) {
schemaName = ((Schema) userObject).getName();
+ userObject = getUserObject(path, ++pathIndex);
}
- String tableName = path.getPathComponent(2).toString();
+ String tableName = processTable(userObject);
try (Connection connection =
connectionInfo.makeDataSource(loadingService).getConnection()) {
try (ResultSet rs =
connection.getMetaData().getColumns(catalogName, schemaName, tableName, null)) {
while (rs.next()) {
- String column = rs.getString(4);
+ String column = rs.getString("COLUMN_NAME");
packTable(tableName, catalogName, schemaName, column);
}
}
@@ -146,45 +136,62 @@ public class DatabaseSchemaLoader {
return databaseReverseEngineering;
}
- private void packFunctions(Connection connection) throws SQLException {
+ private Object getUserObject(TreePath path, int pathIndex) {
+ return
((DbImportTreeNode)path.getPathComponent(pathIndex)).getUserObject();
+ }
+
+ private String processTable(Object userObject) {
+ 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) {
- ResultSet procResultSet = connection.getMetaData().getProcedures(
- catalog.getName(), null, "%"
- );
- while (procResultSet.next()) {
- IncludeProcedure includeProcedure = new
IncludeProcedure(procResultSet.getString(3));
- if
(!catalog.getIncludeProcedures().contains(includeProcedure)) {
- catalog.addIncludeProcedure(includeProcedure);
+ for(Catalog catalog : catalogs) {
+ Collection<Schema> schemas = catalog.getSchemas();
+ if(!schemas.isEmpty()) {
+ for(Schema schema : schemas) {
+ ResultSet procResultSet = getProcedures(connection,
catalog.getName(), schema.getName());
+ packFunction(procResultSet, schema);
}
+ } else {
+ ResultSet procResultSet = getProcedures(connection,
catalog.getName(), null);
+ packFunction(procResultSet, catalog);
}
}
- for (Schema schema : databaseReverseEngineering.getSchemas()) {
- ResultSet procResultSet = connection.getMetaData().getProcedures(
- null, schema.getName(), "%"
- );
- while (procResultSet.next()) {
- IncludeProcedure includeProcedure = new
IncludeProcedure(procResultSet.getString(3));
- if (!schema.getIncludeProcedures().contains(includeProcedure))
{
- schema.addIncludeProcedure(includeProcedure);
- }
- }
+
+ Collection<Schema> schemas = databaseReverseEngineering.getSchemas();
+ for(Schema schema : schemas) {
+ ResultSet procResultSet = getProcedures(connection, null,
schema.getName());
+ packFunction(procResultSet, schema);
}
- for (Catalog catalog : catalogs) {
- for (Schema schema : catalog.getSchemas()) {
- ResultSet procResultSet =
connection.getMetaData().getProcedures(
- catalog.getName(), schema.getName(), "%"
- );
- while (procResultSet.next()) {
- IncludeProcedure includeProcedure = new
IncludeProcedure(procResultSet.getString(3));
- if
(!schema.getIncludeProcedures().contains(includeProcedure)) {
- schema.addIncludeProcedure(includeProcedure);
- }
- }
+ }
+
+ private ResultSet getProcedures(Connection connection, String catalog,
String schema) throws SQLException {
+ return connection.getMetaData().getProcedures(catalog, schema, "%");
+ }
+
+ private void packFunction(ResultSet resultSet, FilterContainer
filterContainer) throws SQLException {
+ while (resultSet.next()) {
+ IncludeProcedure includeProcedure =
+ new
IncludeProcedure(resultSet.getString("PROCEDURE_NAME"));
+ if
(!filterContainer.getIncludeProcedures().contains(includeProcedure)) {
+ filterContainer.addIncludeProcedure(includeProcedure);
}
}
}
+ private void packTable(ResultSet resultSet) throws SQLException {
+ while (resultSet.next()) {
+ String tableName = resultSet.getString("TABLE_NAME");
+ String schemaName = resultSet.getString("TABLE_SCHEM");
+ String catalogName = resultSet.getString("TABLE_CAT");
+ packTable(tableName, catalogName, schemaName, null);
+ }
+ }
+
private void packTable(String tableName, String catalogName, String
schemaName, String columnName) {
IncludeTable table = new IncludeTable();
table.setPattern(tableName);
@@ -230,6 +237,7 @@ public class DatabaseSchemaLoader {
parentCatalog.setName(catalogName);
parentSchema = new Schema();
parentSchema.setName(schemaName);
+ parentCatalog.addSchema(parentSchema);
databaseReverseEngineering.addCatalog(parentCatalog);
}
filterContainer = parentSchema;
@@ -248,7 +256,7 @@ public class DatabaseSchemaLoader {
private void addColumn(FilterContainer filterContainer, IncludeTable
table, String columnName) {
IncludeTable foundTable =
getTableByName(filterContainer.getIncludeTables(), table.getPattern());
table = foundTable != null ? foundTable : table;
- if (columnName != null ) {
+ if (columnName != null) {
IncludeColumn includeColumn = new IncludeColumn(columnName);
table.addIncludeColumn(includeColumn);
}
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 5852ad8..86f49c7 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
@@ -75,35 +75,61 @@ public class DbImportTree extends JTree {
public void updateTableColumns(ReverseEngineering reverseEngineering) {
DbImportModel model = (DbImportModel) this.getModel();
-
DbImportTreeNode root = (DbImportTreeNode) model.getRoot();
Collection<Catalog> catalogs = reverseEngineering.getCatalogs();
- Collection<? extends FilterContainer> filterContainers =
!catalogs.isEmpty() ?
- catalogs :
- reverseEngineering.getSchemas();
- filterContainers.forEach(filterContainer -> {
- DbImportTreeNode container = findNodeInParent(root,
filterContainer);
+ if(!catalogs.isEmpty()) {
+ catalogs.forEach(catalog -> {
+ Collection<Schema> schemas = catalog.getSchemas();
+ if(!schemas.isEmpty()) {
+ DbImportTreeNode currentRoot = findNodeInParent(root,
catalog);
+ schemas.forEach(schema -> packNextFilter(schema,
currentRoot, model));
+ } else {
+ packNextFilter(catalog, root, model);
+ }
+ });
+ } else {
+ reverseEngineering.getSchemas().forEach(schema -> {
+ packNextFilter(schema, root, model);
+ });
+ }
+ }
+
+ private void packNextFilter(FilterContainer filterContainer,
+ DbImportTreeNode root,
+ DbImportModel model) {
+ DbImportTreeNode container = findNodeInParent(root, filterContainer);
+ if (container == null) {
+ return;
+ }
+
+ packTables(filterContainer, container, model);
+ }
+
+ private void packTables(FilterContainer filterContainer,
+ DbImportTreeNode root,
+ DbImportModel model) {
+ filterContainer.getIncludeTables().forEach(tableFilter -> {
+ DbImportTreeNode container = findNodeInParent(root, tableFilter );
if (container == null) {
return;
}
+ if (container.getChildCount() != 0) {
+ container.removeAllChildren();
+ }
- filterContainer.getIncludeTables().forEach(newTable -> {
- DbImportTreeNode table = findNodeInParent(container, newTable);
- if (table == null) {
- return;
- }
- if (table.getChildCount() != 0) {
- table.removeAllChildren();
- }
- newTable.getIncludeColumns().forEach(column ->
- table.add(new DbImportTreeNode(column)));
- table.setLoaded(true);
- model.reload(table);
- });
+ packColumns(tableFilter , container);
+
+ container.setLoaded(true);
+ model.reload(container);
});
}
+ private void packColumns(IncludeTable includeTable, DbImportTreeNode
tableNode) {
+ includeTable.getIncludeColumns().forEach(column ->
+ tableNode.add(new DbImportTreeNode(column)));
+ }
+
private DbImportTreeNode findNodeInParent(DbImportTreeNode parent, Object
object) {
for (int i = 0; i < parent.getChildCount(); i++) {
DbImportTreeNode node = (DbImportTreeNode) parent.getChildAt(i);