/*
* Copyright 2004-2006 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.tools.jconsole;
import java.awt.BorderLayout;
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.inspector.*;
import com.sun.tools.jconsole.JConsoleContext;
@SuppressWarnings("serial")
public class MBeansTab extends Tab implements
NotificationListener, PropertyChangeListener, TreeSelectionListener {
private XTree tree;
private XSheet sheet;
private XDataViewer viewer;
public static String getTabName() {
return Resources.getText("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;
}
public void dispose() {
super.dispose();
sheet.dispose();
}
public int getUpdateInterval() {
return vmPanel.getUpdateInterval();
}
void synchroniseMBeanServerView() {
// Register listener for MBean registration/unregistration
//
try {
getMBeanServerConnection().addNotificationListener(
MBeanServerDelegate.DELEGATE_NAME,
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;
}
// Retrieve MBeans from MBeanServer
//
Set<ObjectName> newSet = null;
try {
newSet = getMBeanServerConnection().queryNames(null,null);
} catch (IOException e) {
if (JConsole.isDebug()) {
e.printStackTrace();
}
vmPanel.getProxyClient().markAsDead();
return;
}
// Cleanup current tree
//
tree.removeAll();
// Do not display anything until the new tree has been built
//
tree.setVisible(false);
// Add MBeans to tree
//
for (ObjectName mbean : newSet) {
tree.addMBeanToView(mbean);
}
// Display the new tree
//
tree.setVisible(true);
}
public MBeanServerConnection getMBeanServerConnection() {
return vmPanel.getProxyClient().getMBeanServerConnection();
}
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() {
// set up the split pane with the MBean tree and MBean sheet panels
setLayout(new BorderLayout());
JSplitPane mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
mainSplit.setDividerLocation(160);
mainSplit.setBorder(BorderFactory.createEmptyBorder());
// set up the MBean tree panel (left pane)
tree = new XTree(this);
tree.setCellRenderer(new XTreeRenderer());
tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.addTreeSelectionListener(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);
// set up the MBean sheet panel (right pane)
viewer = new XDataViewer(this);
sheet = new XSheet(this);
mainSplit.add(sheet, JSplitPane.RIGHT, 0);
add(mainSplit);
}
/* notification listener */
public void handleNotification(Notification notification, Object handback) {
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.delMBeanFromView(mbean);
}
}
}
/* property change listener */
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName() == JConsoleContext.CONNECTION_STATE_PROPERTY) {
boolean connected = (Boolean) evt.getNewValue();
if (connected) {
workerAdd(new Runnable() {
public void run() {
synchroniseMBeanServerView();
}
});
} else {
sheet.dispose();
}
}
}
/* tree selection listener */
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node =
(DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
sheet.displayNode(node);
}
/* tree mouse listener */
private MouseListener ml = new MouseAdapter() {
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);
}
}
}
}
};
}