/* // This software is subject to the terms of the Eclipse Public License v1.0 // Agreement, available at the following URL: // http://www.eclipse.org/legal/epl-v10.html. // You must accept the terms of that agreement to use this software. // // Copyright (C) 2002-2005 Julian Hyde // Copyright (C) 2005-2009 Pentaho and others // All Rights Reserved. */ package mondrian.gui; import mondrian.gui.JdbcMetaData.DbColumn; import org.apache.log4j.Logger; import java.util.Enumeration; import java.util.List; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeWillExpandListener; import javax.swing.tree.*; /** * @author sean */ public class JdbcExplorer extends javax.swing.JPanel implements TreeWillExpandListener { private static final Logger LOGGER = Logger.getLogger(JdbcExplorer.class); JdbcMetaData jdbcMetaData; JdbcTreeModel model; Workbench workbench; DefaultMutableTreeNode root; DefaultTreeModel treeModel; public JdbcExplorer(JdbcMetaData jdbcMetaData, Workbench wb) { workbench = wb; initComponents(); setMetaData(jdbcMetaData); } public void setMetaData(JdbcMetaData jdbcMetaData) { try { this.jdbcMetaData = jdbcMetaData; Node rootNode = new Node(null, NodeType.ROOT, null); root = new DefaultMutableTreeNode(rootNode); for (String schemaName : jdbcMetaData.getAllSchemas()) { Node cat = new Node(schemaName, NodeType.CATALOG, null); DefaultMutableTreeNode catTreeNode = new DefaultMutableTreeNode(cat); cat.treeNode = catTreeNode; root.add(catTreeNode); List<String> tables = jdbcMetaData.getAllTables(schemaName); for (String tableName : tables) { Node table = new Node(tableName, NodeType.TABLE, null); DefaultMutableTreeNode tableTreeNode = new DefaultMutableTreeNode(table); table.treeNode = tableTreeNode; catTreeNode.add(tableTreeNode); } cat.gotChildren = true; } rootNode.gotChildren = true; treeModel = new DefaultTreeModel(root, true); tree.setModel(treeModel); tree.addTreeWillExpandListener(this); updater = new JTreeUpdater(tree); } catch (Exception ex) { LOGGER.error(ex); } } public void resetMetaData(JdbcMetaData jdbcMetaData) { setMetaData(jdbcMetaData); } public JTreeUpdater getTreeUpdater() { return updater; } public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException { // The children are lazy loaded LOGGER.debug( "path = " + event.getPath() + ", last object is a " + event.getPath().getLastPathComponent().getClass().getName()); DefaultMutableTreeNode theTreeNode = (DefaultMutableTreeNode) event.getPath().getLastPathComponent(); Node theNode = (Node) theTreeNode.getUserObject(); theNode.setChildren(); logNode(theTreeNode, "will Expand"); } private void logNode(DefaultMutableTreeNode theTreeNode, String message) { if (!LOGGER.isDebugEnabled()) { return; } DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) theTreeNode.getParent(); Node theNode = (Node) theTreeNode.getUserObject(); Node theParentNode = parentNode == null ? null : (Node) parentNode.getUserObject(); @SuppressWarnings({"unchecked"}) Enumeration<DefaultMutableTreeNode> children = theTreeNode.children(); LOGGER.debug( message + ": " + theNode + ", " + theNode.type + ", parent " + theParentNode + (theParentNode == null ? "" : ", " + theParentNode.type)); while (children.hasMoreElements()) { DefaultMutableTreeNode treeNode = children.nextElement(); Node child = (Node) treeNode.getUserObject(); LOGGER.debug("\t" + child.toString() + ", " + child.type); } } public void treeWillCollapse(TreeExpansionEvent arg0) throws ExpandVetoException { } enum NodeType { CATALOG, TABLE, COLUMN, ROOT } class Node { final String name; final NodeType type; boolean gotChildren = false; DefaultMutableTreeNode treeNode; final JdbcMetaData.DbColumn columnInfo; public Node( String name, NodeType type, DefaultMutableTreeNode treeNode) { this(name, type, treeNode, null); } public Node( String name, NodeType type, DefaultMutableTreeNode treeNode, JdbcMetaData.DbColumn columnInfo) { this.name = name; this.type = type; this.treeNode = treeNode; this.columnInfo = columnInfo; } public String toString() { if (type == NodeType.ROOT) { return workbench.getResourceConverter().getFormattedString( "jdbcExplorer.root.name", "All Schemas"); } StringBuilder sb = new StringBuilder(); if (name == null || name.trim().length() == 0) { switch (type) { case CATALOG: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.catalog", "Default Schema")); break; case TABLE: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.table", "Table")); break; case COLUMN: sb.append( workbench.getResourceConverter().getFormattedString( "jdbcExplorer.default.name.column", "Column")); break; } } else { sb.append(name); } if (type != NodeType.COLUMN) { return sb.toString(); } // now for columns sb.append(" - ").append(columnInfo.displayType()); return sb.toString(); } public void setChildren() { if (!gotChildren) { if (type == NodeType.TABLE) { DefaultMutableTreeNode theParentTreeNode = (DefaultMutableTreeNode) treeNode.getParent(); Node theParentNode = (Node) theParentTreeNode.getUserObject(); // This is a table, parent is a schema List<DbColumn> columns = jdbcMetaData.getAllDbColumns( theParentNode.name, name); for (DbColumn column : columns) { Node columnNode = new Node( column.name, NodeType.COLUMN, treeNode, column); MutableTreeNode columnTreeNode = new DefaultMutableTreeNode(columnNode, false); treeNode.add(columnTreeNode); } } } gotChildren = true; } } /** * This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents jSplitPane1 = new javax.swing.JSplitPane(); jScrollPane1 = new javax.swing.JScrollPane(); tree = new javax.swing.JTree(); jScrollPane2 = new javax.swing.JScrollPane(); setLayout(new java.awt.BorderLayout()); jSplitPane1.setDividerLocation(200); jScrollPane1.setViewportView(tree); jSplitPane1.setLeftComponent(jScrollPane1); jSplitPane1.setRightComponent(jScrollPane2); add(jSplitPane1, java.awt.BorderLayout.CENTER); } //GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTree tree; private javax.swing.JSplitPane jSplitPane1; // End of variables declaration//GEN-END:variables private JTreeUpdater updater; } // End JdbcExplorer.java