| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package sun.tools.jconsole;  | 
 | 
 | 
 | 
import java.awt.BorderLayout;  | 
 | 
import java.awt.EventQueue;  | 
 | 
import java.awt.event.MouseAdapter;  | 
 | 
import java.awt.event.MouseEvent;  | 
 | 
import java.awt.event.MouseListener;  | 
 | 
import java.beans.*;  | 
 | 
import java.io.*;  | 
 | 
import java.util.Set;  | 
 | 
import javax.management.*;  | 
 | 
import javax.swing.*;  | 
 | 
import javax.swing.event.*;  | 
 | 
import javax.swing.tree.*;  | 
 | 
import sun.tools.jconsole.ProxyClient.SnapshotMBeanServerConnection;  | 
 | 
import sun.tools.jconsole.inspector.*;  | 
 | 
 | 
 | 
import com.sun.tools.jconsole.JConsoleContext;  | 
 | 
 | 
 | 
@SuppressWarnings("serial") | 
 | 
public class MBeansTab extends Tab implements  | 
 | 
        NotificationListener, PropertyChangeListener,  | 
 | 
        TreeSelectionListener, TreeWillExpandListener { | 
 | 
 | 
 | 
    private XTree tree;  | 
 | 
    private XSheet sheet;  | 
 | 
    private XDataViewer viewer;  | 
 | 
 | 
 | 
    public static String getTabName() { | 
 | 
        return Messages.MBEANS;  | 
 | 
    }  | 
 | 
 | 
 | 
    public MBeansTab(final VMPanel vmPanel) { | 
 | 
        super(vmPanel, getTabName());  | 
 | 
        addPropertyChangeListener(this);  | 
 | 
        setupTab();  | 
 | 
    }  | 
 | 
 | 
 | 
    public XDataViewer getDataViewer() { | 
 | 
        return viewer;  | 
 | 
    }  | 
 | 
 | 
 | 
    public XTree getTree() { | 
 | 
        return tree;  | 
 | 
    }  | 
 | 
 | 
 | 
    public XSheet getSheet() { | 
 | 
        return sheet;  | 
 | 
    }  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void dispose() { | 
 | 
        super.dispose();  | 
 | 
        sheet.dispose();  | 
 | 
    }  | 
 | 
 | 
 | 
    public int getUpdateInterval() { | 
 | 
        return vmPanel.getUpdateInterval();  | 
 | 
    }  | 
 | 
 | 
 | 
    private void buildMBeanServerView() { | 
 | 
        new SwingWorker<Set<ObjectName>, Void>() { | 
 | 
            @Override  | 
 | 
            public Set<ObjectName> doInBackground() { | 
 | 
                // Register listener for MBean registration/unregistration  | 
 | 
                  | 
 | 
                try { | 
 | 
                    getMBeanServerConnection().addNotificationListener(  | 
 | 
                            MBeanServerDelegate.DELEGATE_NAME,  | 
 | 
                            MBeansTab.this,  | 
 | 
                            null,  | 
 | 
                            null);  | 
 | 
                } catch (InstanceNotFoundException e) { | 
 | 
                    // Should never happen because the MBeanServerDelegate  | 
 | 
                    // is always present in any standard MBeanServer  | 
 | 
                      | 
 | 
                    if (JConsole.isDebug()) { | 
 | 
                        e.printStackTrace();  | 
 | 
                    }  | 
 | 
                } catch (IOException e) { | 
 | 
                    if (JConsole.isDebug()) { | 
 | 
                        e.printStackTrace();  | 
 | 
                    }  | 
 | 
                    vmPanel.getProxyClient().markAsDead();  | 
 | 
                    return null;  | 
 | 
                }  | 
 | 
                // Retrieve MBeans from MBeanServer  | 
 | 
                  | 
 | 
                Set<ObjectName> mbeans = null;  | 
 | 
                try { | 
 | 
                    mbeans = getMBeanServerConnection().queryNames(null, null);  | 
 | 
                } catch (IOException e) { | 
 | 
                    if (JConsole.isDebug()) { | 
 | 
                        e.printStackTrace();  | 
 | 
                    }  | 
 | 
                    vmPanel.getProxyClient().markAsDead();  | 
 | 
                    return null;  | 
 | 
                }  | 
 | 
                return mbeans;  | 
 | 
            }  | 
 | 
            @Override  | 
 | 
            protected void done() { | 
 | 
                try { | 
 | 
                      | 
 | 
                    Set<ObjectName> mbeans = get();  | 
 | 
                    // Do not display anything until the new tree has been built  | 
 | 
                      | 
 | 
                    tree.setVisible(false);  | 
 | 
                    // Cleanup current tree  | 
 | 
                      | 
 | 
                    tree.removeAll();  | 
 | 
                    // Add MBeans to tree  | 
 | 
                      | 
 | 
                    tree.addMBeansToView(mbeans);  | 
 | 
                    // Display the new tree  | 
 | 
                      | 
 | 
                    tree.setVisible(true);  | 
 | 
                } catch (Exception e) { | 
 | 
                    Throwable t = Utils.getActualException(e);  | 
 | 
                    if (JConsole.isDebug()) { | 
 | 
                        System.err.println("Problem at MBean tree construction"); | 
 | 
                        t.printStackTrace();  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }.execute();  | 
 | 
    }  | 
 | 
 | 
 | 
    public MBeanServerConnection getMBeanServerConnection() { | 
 | 
        return vmPanel.getProxyClient().getMBeanServerConnection();  | 
 | 
    }  | 
 | 
 | 
 | 
    public SnapshotMBeanServerConnection getSnapshotMBeanServerConnection() { | 
 | 
        return vmPanel.getProxyClient().getSnapshotMBeanServerConnection();  | 
 | 
    }  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public void update() { | 
 | 
        // Ping the connection to see if it is still alive. At  | 
 | 
        // some point the ProxyClient class should centralize  | 
 | 
        // the connection aliveness monitoring and no longer  | 
 | 
        // rely on the custom tabs to ping the connections.  | 
 | 
          | 
 | 
        try { | 
 | 
            getMBeanServerConnection().getDefaultDomain();  | 
 | 
        } catch (IOException ex) { | 
 | 
            vmPanel.getProxyClient().markAsDead();  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    private void setupTab() { | 
 | 
          | 
 | 
        setLayout(new BorderLayout());  | 
 | 
        JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);  | 
 | 
        mainSplit.setDividerLocation(160);  | 
 | 
        mainSplit.setBorder(BorderFactory.createEmptyBorder());  | 
 | 
 | 
 | 
          | 
 | 
        tree = new XTree(this);  | 
 | 
        tree.setCellRenderer(new XTreeRenderer());  | 
 | 
        tree.getSelectionModel().setSelectionMode(  | 
 | 
                TreeSelectionModel.SINGLE_TREE_SELECTION);  | 
 | 
        tree.addTreeSelectionListener(this);  | 
 | 
        tree.addTreeWillExpandListener(this);  | 
 | 
        tree.addMouseListener(ml);  | 
 | 
        JScrollPane theScrollPane = new JScrollPane(  | 
 | 
                tree,  | 
 | 
                JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,  | 
 | 
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);  | 
 | 
        JPanel treePanel = new JPanel(new BorderLayout());  | 
 | 
        treePanel.add(theScrollPane, BorderLayout.CENTER);  | 
 | 
        mainSplit.add(treePanel, JSplitPane.LEFT, 0);  | 
 | 
 | 
 | 
          | 
 | 
        viewer = new XDataViewer(this);  | 
 | 
        sheet = new XSheet(this);  | 
 | 
        mainSplit.add(sheet, JSplitPane.RIGHT, 0);  | 
 | 
 | 
 | 
        add(mainSplit);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public void handleNotification(  | 
 | 
            final Notification notification, Object handback) { | 
 | 
        EventQueue.invokeLater(new Runnable() { | 
 | 
            public void run() { | 
 | 
                if (notification instanceof MBeanServerNotification) { | 
 | 
                    ObjectName mbean =  | 
 | 
                            ((MBeanServerNotification) notification).getMBeanName();  | 
 | 
                    if (notification.getType().equals(  | 
 | 
                            MBeanServerNotification.REGISTRATION_NOTIFICATION)) { | 
 | 
                        tree.addMBeanToView(mbean);  | 
 | 
                    } else if (notification.getType().equals(  | 
 | 
                            MBeanServerNotification.UNREGISTRATION_NOTIFICATION)) { | 
 | 
                        tree.removeMBeanFromView(mbean);  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        });  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public void propertyChange(PropertyChangeEvent evt) { | 
 | 
        if (JConsoleContext.CONNECTION_STATE_PROPERTY.equals(evt.getPropertyName())) { | 
 | 
            boolean connected = (Boolean) evt.getNewValue();  | 
 | 
            if (connected) { | 
 | 
                buildMBeanServerView();  | 
 | 
            } else { | 
 | 
                sheet.dispose();  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public void valueChanged(TreeSelectionEvent e) { | 
 | 
        DefaultMutableTreeNode node =  | 
 | 
                (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();  | 
 | 
        sheet.displayNode(node);  | 
 | 
    }  | 
 | 
      | 
 | 
    private MouseListener ml = new MouseAdapter() { | 
 | 
        @Override  | 
 | 
        public void mousePressed(MouseEvent e) { | 
 | 
            if (e.getClickCount() == 1) { | 
 | 
                int selRow = tree.getRowForLocation(e.getX(), e.getY());  | 
 | 
                if (selRow != -1) { | 
 | 
                    TreePath selPath =  | 
 | 
                            tree.getPathForLocation(e.getX(), e.getY());  | 
 | 
                    DefaultMutableTreeNode node =  | 
 | 
                            (DefaultMutableTreeNode) selPath.getLastPathComponent();  | 
 | 
                    if (sheet.isMBeanNode(node)) { | 
 | 
                        tree.expandPath(selPath);  | 
 | 
                    }  | 
 | 
                }  | 
 | 
            }  | 
 | 
        }  | 
 | 
    };  | 
 | 
 | 
 | 
      | 
 | 
    public void treeWillExpand(TreeExpansionEvent e)  | 
 | 
            throws ExpandVetoException { | 
 | 
        TreePath path = e.getPath();  | 
 | 
        if (!tree.hasBeenExpanded(path)) { | 
 | 
            DefaultMutableTreeNode node =  | 
 | 
                    (DefaultMutableTreeNode) path.getLastPathComponent();  | 
 | 
            if (sheet.isMBeanNode(node) && !tree.hasMetadataNodes(node)) { | 
 | 
                tree.addMetadataNodes(node);  | 
 | 
            }  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    public void treeWillCollapse(TreeExpansionEvent e)  | 
 | 
            throws ExpandVetoException { | 
 | 
    }  | 
 | 
}  |