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 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;
}
public void dispose() {
super.dispose();
sheet.dispose();
}
public int getUpdateInterval() {
return vmPanel.getUpdateInterval();
}
void synchroniseMBeanServerView() {
try {
getMBeanServerConnection().addNotificationListener(
MBeanServerDelegate.DELEGATE_NAME,
this,
null,
null);
} catch (InstanceNotFoundException e) {
if (JConsole.isDebug()) {
e.printStackTrace();
}
} catch (IOException e) {
if (JConsole.isDebug()) {
e.printStackTrace();
}
vmPanel.getProxyClient().markAsDead();
return;
}
Set<ObjectName> newSet = null;
try {
newSet = getMBeanServerConnection().queryNames(null,null);
} catch (IOException e) {
if (JConsole.isDebug()) {
e.printStackTrace();
}
vmPanel.getProxyClient().markAsDead();
return;
}
tree.removeAll();
tree.setVisible(false);
for (ObjectName mbean : newSet) {
tree.addMBeanToView(mbean);
}
tree.setVisible(true);
}
public MBeanServerConnection getMBeanServerConnection() {
return vmPanel.getProxyClient().getMBeanServerConnection();
}
public void update() {
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.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(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);
}
}
}
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();
}
}
}
public void valueChanged(TreeSelectionEvent e) {
DefaultMutableTreeNode node =
(DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
sheet.displayNode(node);
}
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);
}
}
}
}
};
}