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

Reply via email to