Repository: cayenne Updated Branches: refs/heads/master fb7f004a8 -> c18c0e31f
First implementation of table columns lazy loading. Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/65d76d90 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/65d76d90 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/65d76d90 Branch: refs/heads/master Commit: 65d76d90b1b0c517a3518d9e56fe8fbe7820a611 Parents: 831442c Author: kkomyak <const1...@gmail.com> Authored: Thu Oct 25 14:55:55 2018 +0300 Committer: kkomyak <const1...@gmail.com> Committed: Mon Oct 29 09:37:34 2018 +0300 ---------------------------------------------------------------------- .../modeler/action/LoadDbSchemaAction.java | 31 +++-- .../dialog/db/load/DbImportTreeNode.java | 19 +++ .../editor/dbimport/ColorTreeRenderer.java | 15 ++- .../editor/dbimport/DatabaseSchemaLoader.java | 97 ++++++++++---- .../editor/dbimport/DbImportNodeHandler.java | 25 ++-- .../modeler/editor/dbimport/DbImportTree.java | 128 ++++++++++++++++++- .../dbimport/DbImportTreeCellRenderer.java | 1 + .../editor/dbimport/DraggableTreePanel.java | 6 + .../cayenne/modeler/images/icon-dbi-column.png | Bin 0 -> 203 bytes 9 files changed, 269 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java ---------------------------------------------------------------------- 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 840ec40..406dc64 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,6 +22,7 @@ package org.apache.cayenne.modeler.action; import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering; import org.apache.cayenne.modeler.Application; import org.apache.cayenne.modeler.dialog.db.DataSourceWizard; +import org.apache.cayenne.modeler.dialog.db.load.TransferableNode; import org.apache.cayenne.modeler.editor.dbimport.DatabaseSchemaLoader; import org.apache.cayenne.modeler.editor.dbimport.DbImportModel; import org.apache.cayenne.modeler.editor.dbimport.DbImportView; @@ -31,6 +32,7 @@ import org.apache.cayenne.modeler.pref.DataMapDefaults; import org.apache.cayenne.modeler.util.CayenneAction; import javax.swing.JOptionPane; +import javax.swing.tree.TreePath; import java.awt.event.ActionEvent; import java.sql.SQLException; @@ -47,6 +49,7 @@ public class LoadDbSchemaAction extends CayenneAction { private static final String ICON_NAME = "icon-dbi-refresh.png"; private static final String ACTION_NAME = "Refresh Db Schema"; + public static final String LOAD_COLUMN_COMMAND = "load-columns"; private DraggableTreePanel draggableTreePanel; LoadDbSchemaAction(Application application) { @@ -80,15 +83,25 @@ public class LoadDbSchemaAction extends CayenneAction { connectionInfo = getConnectionInfoFromPreferences(); } - ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader() - .load(connectionInfo, getApplication().getClassLoadingService()); - draggableTreePanel.getSourceTree() - .setEnabled(true); - draggableTreePanel.getSourceTree() - .translateReverseEngineeringToTree(databaseReverseEngineering, true); - draggableTreePanel - .bindReverseEngineeringToDatamap(getProjectController().getCurrentDataMap(), databaseReverseEngineering); - ((DbImportModel) draggableTreePanel.getSourceTree().getModel()).reload(); + if (LOAD_COLUMN_COMMAND.equals(e.getActionCommand())) { + TreePath source = (TreePath) e.getSource(); + ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader() + .loadColumns(connectionInfo, getApplication().getClassLoadingService(), source); + draggableTreePanel.getSourceTree().updateTableColumns(databaseReverseEngineering); + + } else { + ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader() + .load(connectionInfo, getApplication().getClassLoadingService()); + draggableTreePanel.getSourceTree() + .setEnabled(true); + draggableTreePanel.getSourceTree() + .translateReverseEngineeringToTree(databaseReverseEngineering, true); + draggableTreePanel + .bindReverseEngineeringToDatamap(getProjectController().getCurrentDataMap(), databaseReverseEngineering); + ((DbImportModel) draggableTreePanel.getSourceTree().getModel()).reload(); + } + + } catch (SQLException exception) { JOptionPane.showMessageDialog( Application.getFrame(), http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportTreeNode.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportTreeNode.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportTreeNode.java index 20b46bc..98cc338 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportTreeNode.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/db/load/DbImportTreeNode.java @@ -20,9 +20,11 @@ package org.apache.cayenne.modeler.dialog.db.load; import org.apache.cayenne.dbsync.reverse.dbimport.Catalog; +import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn; import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure; import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable; import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer; +import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn; import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure; import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable; import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam; @@ -39,6 +41,7 @@ import java.util.ArrayList; public class DbImportTreeNode extends DefaultMutableTreeNode { private boolean isColorized; + private boolean isLoaded; public DbImportTreeNode() { this(null); @@ -59,6 +62,14 @@ public class DbImportTreeNode extends DefaultMutableTreeNode { return (getUserObject().getClass() == ExcludeTable.class); } + public boolean isIncludeColumn() { + return (getUserObject().getClass() == IncludeColumn.class); + } + + public boolean isExcludeColumn() { + return (getUserObject().getClass() == ExcludeColumn.class); + } + public boolean isExcludeProcedure() { return (getUserObject().getClass() == ExcludeProcedure.class); } @@ -191,4 +202,12 @@ public class DbImportTreeNode extends DefaultMutableTreeNode { public void setColorized(boolean colorized) { isColorized = colorized; } + + public boolean isLoaded() { + return isLoaded; + } + + public void setLoaded(boolean loaded) { + isLoaded = loaded; + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/ColorTreeRenderer.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/ColorTreeRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/ColorTreeRenderer.java index 2f58ea4..95d2861 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/ColorTreeRenderer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/ColorTreeRenderer.java @@ -19,6 +19,7 @@ package org.apache.cayenne.modeler.editor.dbimport; +import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn; import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure; import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode; @@ -81,6 +82,18 @@ public class ColorTreeRenderer extends DbImportTreeCellRenderer { int traverseResult = handler.traverseTree(root); if (traverseResult > 0) { + + if (root.getUserObject().getClass() == IncludeColumn.class) { + if (handler.nodesIsEqual(root)) { + setForeground(handler.getColorByNodeType(root)); + node.setColorized(true); + return this; + } else { + setForeground(NON_INCLUDE_COLOR); + node.setColorized(false); + return this; + } + } // Case on IncludeProcedure on zero level is selected if (root.getUserObject().getClass() == IncludeProcedure.class) { if (handler.nodesIsEqual(root)) { @@ -95,7 +108,7 @@ public class ColorTreeRenderer extends DbImportTreeCellRenderer { } // If ReverseEngineering doesn't have catalogs or schemas on zero level if (!handler.isExistCatalogsOrSchemas()) { - if ((root.isExcludeTable()) || (root.isExcludeProcedure())) { + if ((root.isExcludeTable()) || (root.isExcludeProcedure() || root.isExcludeColumn())) { if (handler.nodesIsEqual(root)) { setForeground(handler.getColorByNodeType(root)); node.setColorized(true); http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DatabaseSchemaLoader.java ---------------------------------------------------------------------- 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 ddb085f..6c2ee45 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 @@ -19,14 +19,11 @@ package org.apache.cayenne.modeler.editor.dbimport; -import org.apache.cayenne.dbsync.reverse.dbimport.Catalog; -import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure; -import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable; -import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering; -import org.apache.cayenne.dbsync.reverse.dbimport.Schema; +import org.apache.cayenne.dbsync.reverse.dbimport.*; import org.apache.cayenne.modeler.ClassLoadingService; import org.apache.cayenne.modeler.pref.DBConnectionInfo; +import javax.swing.tree.TreePath; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -47,6 +44,7 @@ public class DatabaseSchemaLoader { } public ReverseEngineering load(DBConnectionInfo connectionInfo, ClassLoadingService loadingService) throws SQLException { + String columnName = "Loading..."; try (Connection connection = connectionInfo.makeDataSource(loadingService).getConnection()) { String[] types = {"TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM"}; try (ResultSet rs = connection.getMetaData().getCatalogs()) { @@ -67,15 +65,37 @@ public class DatabaseSchemaLoader { tableName = resultSet.getString(TABLE_INDEX); schemaName = resultSet.getString(SCHEMA_INDEX); catalogName = resultSet.getString(CATALOG_INDEX); - packTable(tableName, catalogName, schemaName); + packTable(tableName, catalogName, schemaName, columnName); } packFunctions(connection); + columnName = null; } } } return databaseReverseEngineering; } + public ReverseEngineering loadColumns(DBConnectionInfo connectionInfo, ClassLoadingService loadingService, TreePath path) throws SQLException { + String catalogName = path.getPathComponent(1).toString(); + String schemaName = null; + String tableName = path.getPathComponent(2).toString(); + + try (Connection connection = connectionInfo.makeDataSource(loadingService).getConnection()) { + String[] types = {"TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS", "SYNONYM"}; + try (ResultSet rs = connection.getMetaData().getColumns(catalogName, schemaName, tableName, "");) { + String defaultCatalog = connection.getCatalog(); + + while (rs.next()) { + String column = rs.getString(4); + packTable(tableName, catalogName, schemaName, column); + } + + } + } + return databaseReverseEngineering; + } + + private void packFunctions(Connection connection) throws SQLException { Collection<Catalog> catalogs = databaseReverseEngineering.getCatalogs(); for (Catalog catalog : catalogs) { @@ -116,57 +136,77 @@ public class DatabaseSchemaLoader { } private void packTable(String tableName, String catalogName, String schemaName) { - IncludeTable newTable = new IncludeTable(); - newTable.setPattern(tableName); + packTable(tableName,catalogName, schemaName, null); + } + + private void packTable(String tableName, String catalogName, String schemaName, String columnName) { + IncludeTable table = new IncludeTable(); + table.setPattern(tableName); + if ((catalogName == null) && (schemaName == null)) { - if (!databaseReverseEngineering.getIncludeTables().contains(newTable)) { - databaseReverseEngineering.addIncludeTable(newTable); + if (!databaseReverseEngineering.getIncludeTables().contains(table)) { + databaseReverseEngineering.addIncludeTable(table); } } + if ((catalogName != null) && (schemaName == null)) { Catalog parentCatalog = getCatalogByName(databaseReverseEngineering.getCatalogs(), catalogName); + if (parentCatalog != null) { - if (!parentCatalog.getIncludeTables().contains(newTable)) { - parentCatalog.addIncludeTable(newTable); + + + if (!parentCatalog.getIncludeTables().contains(table)) { + parentCatalog.addIncludeTable(table); } } else { parentCatalog = new Catalog(); parentCatalog.setName(catalogName); - if (!parentCatalog.getIncludeTables().contains(newTable)) { - parentCatalog.addIncludeTable(newTable); + if (!parentCatalog.getIncludeTables().contains(table)) { + parentCatalog.addIncludeTable(table); } databaseReverseEngineering.addCatalog(parentCatalog); } + + IncludeTable foundTable = getTableByName(parentCatalog.getIncludeTables(), tableName); + table = foundTable != null ? foundTable : table; + if (columnName != null ) { + IncludeColumn includeColumn = new IncludeColumn(columnName); + table.addIncludeColumn(includeColumn); + } } if ((catalogName == null) && (schemaName != null)) { Schema parentSchema = getSchemaByName(databaseReverseEngineering.getSchemas(), schemaName); if (parentSchema != null) { - if (!parentSchema.getIncludeTables().contains(newTable)) { - parentSchema.addIncludeTable(newTable); + if (!parentSchema.getIncludeTables().contains(table)) { + parentSchema.addIncludeTable(table); } } else { parentSchema = new Schema(); parentSchema.setName(schemaName); - if (!parentSchema.getIncludeTables().contains(newTable)) { - parentSchema.addIncludeTable(newTable); + if (!parentSchema.getIncludeTables().contains(table)) { + parentSchema.addIncludeTable(table); } databaseReverseEngineering.addSchema(parentSchema); } } if ((catalogName != null) && (schemaName != null)) { Catalog parentCatalog = getCatalogByName(databaseReverseEngineering.getCatalogs(), catalogName); + + + Schema parentSchema; if (parentCatalog != null) { + parentSchema = getSchemaByName(parentCatalog.getSchemas(), schemaName); if (parentSchema != null) { - if (!parentSchema.getIncludeTables().contains(newTable)) { - parentSchema.addIncludeTable(newTable); + if (!parentSchema.getIncludeTables().contains(table)) { + parentSchema.addIncludeTable(table); } } else { parentSchema = new Schema(); parentSchema.setName(schemaName); - if (!parentSchema.getIncludeTables().contains(newTable)) { - parentSchema.addIncludeTable(newTable); + if (!parentSchema.getIncludeTables().contains(table)) { + parentSchema.addIncludeTable(table); } parentCatalog.addSchema(parentSchema); } @@ -175,8 +215,8 @@ public class DatabaseSchemaLoader { parentCatalog.setName(catalogName); parentSchema = new Schema(); parentSchema.setName(schemaName); - if (!parentSchema.getIncludeTables().contains(newTable)) { - parentSchema.addIncludeTable(newTable); + if (!parentSchema.getIncludeTables().contains(table)) { + parentSchema.addIncludeTable(table); } databaseReverseEngineering.addCatalog(parentCatalog); } @@ -192,6 +232,15 @@ public class DatabaseSchemaLoader { return null; } + private IncludeTable getTableByName(Collection<IncludeTable> tables, String catalogName) { + for (IncludeTable table : tables) { + if (table.getPattern().equals(catalogName)) { + return table; + } + } + return null; + } + private Schema getSchemaByName(Collection<Schema> schemas, String schemaName) { for (Schema schema : schemas) { if (schema.getName().equals(schemaName)) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportNodeHandler.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportNodeHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportNodeHandler.java index ee30a9c..0b26c62 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportNodeHandler.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportNodeHandler.java @@ -19,13 +19,7 @@ package org.apache.cayenne.modeler.editor.dbimport; -import org.apache.cayenne.dbsync.reverse.dbimport.Catalog; -import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure; -import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable; -import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure; -import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable; -import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering; -import org.apache.cayenne.dbsync.reverse.dbimport.Schema; +import org.apache.cayenne.dbsync.reverse.dbimport.*; import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode; import javax.swing.tree.TreePath; @@ -98,7 +92,7 @@ class DbImportNodeHandler { for (int i = 0; i < childCount; i++) { if (((DbImportTreeNode) reverseEngineeringTree.getRootNode().getChildAt(i)). getUserObject().getClass() == Catalog.class) { - if (dbNode.getUserObject().getClass() == Catalog.class) { + if (dbNode.getUserObject().getClass() == Catalog.class || dbNode.getUserObject().getClass() == IncludeTable.class) { return true; } else { return false; @@ -167,6 +161,7 @@ class DbImportNodeHandler { * Return 0, if rendered node not found. */ int traverseTree(DbImportTreeNode rootNode) { + hasEntitiesInEmptyContainer = false; int traverseResult = 0; int childCount = rootNode.getChildCount(); boolean hasProcedures = false; @@ -217,7 +212,7 @@ class DbImportNodeHandler { } } if ((!rootNode.isExcludeTable()) && (!nodesIsEqual(rootNode)) - && (!dbSchemaNode.isIncludeProcedure())) { + && (!dbSchemaNode.isIncludeProcedure()) &&(!dbSchemaNode.isIncludeColumn())) { traverseResult++; } else { if ((!hasProcedures) && (!dbSchemaNode.isIncludeProcedure())) { @@ -255,7 +250,7 @@ class DbImportNodeHandler { for (TreePath path : reverseEngineeringTree.getSelectionPaths()) { DbImportTreeNode pathNode = (DbImportTreeNode) path.getLastPathComponent(); if (pathNode.getSimpleNodeName().equals(dbSchemaNode.getSimpleNodeName())) { - if (pathNode.isExcludeTable() || pathNode.isExcludeProcedure()) { + if (pathNode.isExcludeTable() || pathNode.isExcludeProcedure() || node.isExcludeColumn()) { return EXCLUDE_COLOR; } else { return ACCEPT_COLOR; @@ -263,7 +258,7 @@ class DbImportNodeHandler { } } } - if (node.isExcludeTable() || node.isExcludeProcedure()) { + if (node.isExcludeTable() || node.isExcludeProcedure() || node.isExcludeColumn()) { return EXCLUDE_COLOR; } else { return ACCEPT_COLOR; @@ -316,6 +311,12 @@ class DbImportNodeHandler { if ((firstClass.equals(ExcludeProcedure.class)) && (secondClass.equals(IncludeProcedure.class))) { return true; } + if ((firstClass.equals(ExcludeColumn.class)) && (secondClass.equals(IncludeColumn.class))) { + return true; + } + if ((firstClass.equals(IncludeColumn.class)) && (secondClass.equals(ExcludeColumn.class))) { + return true; + } return false; } @@ -324,7 +325,7 @@ class DbImportNodeHandler { } public boolean getHasEntitiesInEmptyContainer() { - return hasEntitiesInEmptyContainer; + return true; } public void setHasEntitiesInEmptyContainer(boolean newFlag) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTree.java ---------------------------------------------------------------------- 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 c7a0aed..b4a3ec6 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 @@ -19,20 +19,24 @@ package org.apache.cayenne.modeler.editor.dbimport; -import org.apache.cayenne.dbsync.reverse.dbimport.Catalog; -import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer; -import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable; -import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam; -import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering; -import org.apache.cayenne.dbsync.reverse.dbimport.Schema; +import org.apache.cayenne.dbsync.reverse.dbimport.*; +import org.apache.cayenne.modeler.Application; +import org.apache.cayenne.modeler.action.LoadDbSchemaAction; import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode; import org.apache.cayenne.modeler.dialog.db.load.TransferableNode; import javax.swing.JTree; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeExpansionListener; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; + +import static org.apache.cayenne.modeler.action.LoadDbSchemaAction.LOAD_COLUMN_COMMAND; /** * @since 4.1 @@ -61,14 +65,92 @@ public class DbImportTree extends JTree { printParams(reverseEngineering.getExcludeColumns(), root); printParams(reverseEngineering.getIncludeProcedures(), root); printParams(reverseEngineering.getExcludeProcedures(), root); + createTreeExpandListener(); model.reload(); } + public void updateTableColumns(ReverseEngineering reverseEngineering) { + DbImportModel model = (DbImportModel) this.getModel(); + + DbImportTreeNode root = (DbImportTreeNode) model.getRoot(); + Iterator<Catalog> catalogs = reverseEngineering.getCatalogs().iterator(); + while (catalogs.hasNext()) { + Catalog newCatalog = catalogs.next(); + DbImportTreeNode catalog = findNodeInParent(root, newCatalog); + + if (catalog == null) { + continue; + } + + Iterator<IncludeTable> includeTables = newCatalog.getIncludeTables().iterator(); + while (includeTables.hasNext()) { + IncludeTable newTable = includeTables.next(); + DbImportTreeNode table = findNodeInParent(catalog, newTable); + if (table == null) { + continue; + } + table.removeAllChildren(); + newTable.getIncludeColumns().forEach(column -> + table.add(new DbImportTreeNode(column))); + table.setLoaded(true); + model.reload(table); + } + } + + } + + + + private DbImportTreeNode findNodeInParent(DbImportTreeNode parent, Object object) { + for(int i = 0; i<= parent.getChildCount(); i++) { + DbImportTreeNode node = (DbImportTreeNode) parent.getChildAt(i); + Object userObject = node.getUserObject(); + + if (object instanceof Catalog) { + Catalog catalog = (Catalog) object; + if (!(userObject instanceof Catalog)) { + continue; + } + + Catalog currentCatalog = (Catalog) userObject; + if(currentCatalog.getName().equals(catalog.getName()) ) { + return node; + } + } + + if (object instanceof IncludeTable) { + IncludeTable table = (IncludeTable) object; + if (!(userObject instanceof IncludeTable)) { + continue; + } + + IncludeTable currentTable = (IncludeTable) userObject; + if (currentTable.getPattern().equals(table.getPattern())) { + return node; + } + } + + if (object instanceof ExcludeTable) { + ExcludeTable table = (ExcludeTable) object; + if (!(userObject instanceof ExcludeTable)) { + continue; + } + + ExcludeTable currentTable = (ExcludeTable) userObject; + if (currentTable.getPattern().equals(table.getPattern())) { + return node; + } + } + } + + return null; + } + public DbImportTreeNode findNodeByParentsChain(DbImportTreeNode rootNode, DbImportTreeNode movedNode, int depth) { String parentName = ((DbImportTreeNode) movedNode.getParent()).getSimpleNodeName(); if ((rootNode.parentsIsEqual(((DbImportTreeNode) movedNode.getParent()))) && (rootNode.getSimpleNodeName().equals(parentName)) - && ((rootNode.isCatalog()) || (rootNode.isSchema()))) { + && ((rootNode.isCatalog()) || (rootNode.isSchema()) || (rootNode.isIncludeTable()))) { return rootNode; } for (int i = 0; i < rootNode.getChildCount(); i++) { @@ -185,6 +267,38 @@ public class DbImportTree extends JTree { } } + private void createTreeExpandListener() { + TreeExpansionListener treeExpansionListener = new TreeExpansionListener() { + + @Override + public void treeExpanded(TreeExpansionEvent event) { + TreePath path = event.getPath(); + Object lastPathComponent = path.getLastPathComponent(); + if (!(lastPathComponent instanceof TransferableNode)) { + return; + } + + DbImportTreeNode node = (DbImportTreeNode) lastPathComponent; + Object userObject = node.getUserObject(); + if (userObject.getClass() == IncludeTable.class && !node.isLoaded()) { + //reload columns action. + + LoadDbSchemaAction action = Application.getInstance().getActionManager().getAction(LoadDbSchemaAction.class); + action.performAction(new ActionEvent(path, 1000, LOAD_COLUMN_COMMAND )); + } + + + } + + @Override + public void treeCollapsed(TreeExpansionEvent event) { + + } + }; + this.addTreeExpansionListener(treeExpansionListener); + } + + public DbImportTreeNode getSelectedNode() { return (DbImportTreeNode) this.getSelectionPath().getLastPathComponent(); } http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTreeCellRenderer.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTreeCellRenderer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTreeCellRenderer.java index 9d9e505..5e1dce3 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTreeCellRenderer.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DbImportTreeCellRenderer.java @@ -58,6 +58,7 @@ public class DbImportTreeCellRenderer extends DefaultTreeCellRenderer { transferableTreeIcons.put(Schema.class, "icon-dbi-schema.png"); transferableTreeIcons.put(IncludeTable.class, "icon-dbentity.png"); transferableTreeIcons.put(IncludeProcedure.class, "icon-stored-procedure.png"); + transferableTreeIcons.put(IncludeColumn.class, "icon-dbi-column.png"); } private void initIcons() { http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java index 9605e54..c53190c 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbimport/DraggableTreePanel.java @@ -238,6 +238,12 @@ public class DraggableTreePanel extends JScrollPane { if (selectedElement == null) { return false; } + if (selectedElement.isIncludeColumn() || selectedElement.isExcludeColumn()) { + DbImportTreeNode node = targetTree.findNode(targetTree.getRootNode(), (DbImportTreeNode) selectedElement.getParent(), 0); + if(node != null && node.isExcludeTable()) { + return false; + } + } Class draggableElementClass = selectedElement.getUserObject().getClass(); Class reverseEngineeringElementClass; if (targetTree.getSelectionPath() != null) { http://git-wip-us.apache.org/repos/asf/cayenne/blob/65d76d90/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-dbi-column.png ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-dbi-column.png b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-dbi-column.png new file mode 100644 index 0000000..207b1f1 Binary files /dev/null and b/modeler/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-dbi-column.png differ