|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.tools.jconsole.inspector; |
|
|
|
import java.awt.BorderLayout; |
|
import java.awt.Color; |
|
import java.awt.Component; |
|
import java.awt.GridLayout; |
|
import java.util.*; |
|
import javax.management.*; |
|
import javax.swing.*; |
|
import javax.swing.border.TitledBorder; |
|
import javax.swing.event.*; |
|
import javax.swing.table.*; |
|
|
|
import sun.tools.jconsole.Messages; |
|
|
|
import static sun.tools.jconsole.Utilities.*; |
|
|
|
@SuppressWarnings("serial") |
|
public class XMBeanInfo extends JPanel { |
|
|
|
private static final Color lightYellow = new Color(255, 255, 128); |
|
private final int NAME_COLUMN = 0; |
|
private final int VALUE_COLUMN = 1; |
|
private final String[] columnNames = { |
|
Messages.NAME, |
|
Messages.VALUE |
|
}; |
|
private JTable infoTable = new JTable(); |
|
private JTable descTable = new JTable(); |
|
private JPanel infoBorderPanel = new JPanel(new BorderLayout()); |
|
private JPanel descBorderPanel = new JPanel(new BorderLayout()); |
|
|
|
private static class ReadOnlyDefaultTableModel extends DefaultTableModel { |
|
|
|
@Override |
|
public void setValueAt(Object value, int row, int col) { |
|
} |
|
} |
|
|
|
private static class TableRowDivider { |
|
|
|
private String tableRowDividerText; |
|
|
|
public TableRowDivider(String tableRowDividerText) { |
|
this.tableRowDividerText = tableRowDividerText; |
|
} |
|
|
|
@Override |
|
public String toString() { |
|
return tableRowDividerText; |
|
} |
|
} |
|
private static MBeanInfoTableCellRenderer renderer = |
|
new MBeanInfoTableCellRenderer(); |
|
|
|
private static class MBeanInfoTableCellRenderer |
|
extends DefaultTableCellRenderer { |
|
|
|
@Override |
|
public Component getTableCellRendererComponent( |
|
JTable table, Object value, boolean isSelected, |
|
boolean hasFocus, int row, int column) { |
|
Component comp = super.getTableCellRendererComponent( |
|
table, value, isSelected, hasFocus, row, column); |
|
if (value instanceof TableRowDivider) { |
|
JLabel label = new JLabel(value.toString()); |
|
label.setBackground(ensureContrast(lightYellow, |
|
label.getForeground())); |
|
label.setOpaque(true); |
|
return label; |
|
} |
|
return comp; |
|
} |
|
} |
|
private static TableCellEditor editor = |
|
new MBeanInfoTableCellEditor(new JTextField()); |
|
|
|
private static class MBeanInfoTableCellEditor |
|
extends Utils.ReadOnlyTableCellEditor { |
|
|
|
public MBeanInfoTableCellEditor(JTextField tf) { |
|
super(tf); |
|
} |
|
|
|
@Override |
|
public Component getTableCellEditorComponent( |
|
JTable table, Object value, boolean isSelected, |
|
int row, int column) { |
|
Component comp = super.getTableCellEditorComponent( |
|
table, value, isSelected, row, column); |
|
if (value instanceof TableRowDivider) { |
|
JLabel label = new JLabel(value.toString()); |
|
label.setBackground(ensureContrast(lightYellow, |
|
label.getForeground())); |
|
label.setOpaque(true); |
|
return label; |
|
} |
|
return comp; |
|
} |
|
} |
|
|
|
public XMBeanInfo() { |
|
// Use the grid layout to display the two tables |
|
|
|
super(new GridLayout(2, 1)); |
|
// MBean*Info table |
|
|
|
infoTable.setModel(new ReadOnlyDefaultTableModel()); |
|
infoTable.setRowSelectionAllowed(false); |
|
infoTable.setColumnSelectionAllowed(false); |
|
infoTable.getTableHeader().setReorderingAllowed(false); |
|
((DefaultTableModel) infoTable.getModel()).setColumnIdentifiers(columnNames); |
|
infoTable.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(140); |
|
infoTable.getColumnModel().getColumn(NAME_COLUMN).setMaxWidth(140); |
|
infoTable.getColumnModel().getColumn(NAME_COLUMN).setCellRenderer(renderer); |
|
infoTable.getColumnModel().getColumn(VALUE_COLUMN).setCellRenderer(renderer); |
|
infoTable.getColumnModel().getColumn(NAME_COLUMN).setCellEditor(editor); |
|
infoTable.getColumnModel().getColumn(VALUE_COLUMN).setCellEditor(editor); |
|
infoTable.addKeyListener(new Utils.CopyKeyAdapter()); |
|
infoTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); |
|
JScrollPane infoTableScrollPane = new JScrollPane(infoTable); |
|
infoBorderPanel.setBorder( |
|
BorderFactory.createTitledBorder("MBeanInfoPlaceHolder")); |
|
infoBorderPanel.add(infoTableScrollPane); |
|
// Descriptor table |
|
|
|
descTable.setModel(new ReadOnlyDefaultTableModel()); |
|
descTable.setRowSelectionAllowed(false); |
|
descTable.setColumnSelectionAllowed(false); |
|
descTable.getTableHeader().setReorderingAllowed(false); |
|
((DefaultTableModel) descTable.getModel()).setColumnIdentifiers(columnNames); |
|
descTable.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(140); |
|
descTable.getColumnModel().getColumn(NAME_COLUMN).setMaxWidth(140); |
|
descTable.getColumnModel().getColumn(NAME_COLUMN).setCellRenderer(renderer); |
|
descTable.getColumnModel().getColumn(VALUE_COLUMN).setCellRenderer(renderer); |
|
descTable.getColumnModel().getColumn(NAME_COLUMN).setCellEditor(editor); |
|
descTable.getColumnModel().getColumn(VALUE_COLUMN).setCellEditor(editor); |
|
descTable.addKeyListener(new Utils.CopyKeyAdapter()); |
|
descTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS); |
|
JScrollPane descTableScrollPane = new JScrollPane(descTable); |
|
descBorderPanel.setBorder( |
|
BorderFactory.createTitledBorder(Messages.DESCRIPTOR)); |
|
descBorderPanel.add(descTableScrollPane); |
|
// Add the two tables to the grid |
|
|
|
add(infoBorderPanel); |
|
add(descBorderPanel); |
|
} |
|
|
|
|
|
public void emptyInfoTable() { |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
while (tableModel.getRowCount() > 0) { |
|
tableModel.removeRow(0); |
|
} |
|
} |
|
|
|
|
|
public void emptyDescTable() { |
|
DefaultTableModel tableModel = (DefaultTableModel) descTable.getModel(); |
|
while (tableModel.getRowCount() > 0) { |
|
tableModel.removeRow(0); |
|
} |
|
} |
|
|
|
|
|
private void addDescriptor(Descriptor desc, String text) { |
|
if (desc != null && desc.getFieldNames().length > 0) { |
|
DefaultTableModel tableModel = (DefaultTableModel) descTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
for (String fieldName : desc.getFieldNames()) { |
|
rowData[0] = fieldName; |
|
Object fieldValue = desc.getFieldValue(fieldName); |
|
if (fieldValue instanceof boolean[]) { |
|
rowData[1] = Arrays.toString((boolean[]) fieldValue); |
|
} else if (fieldValue instanceof byte[]) { |
|
rowData[1] = Arrays.toString((byte[]) fieldValue); |
|
} else if (fieldValue instanceof char[]) { |
|
rowData[1] = Arrays.toString((char[]) fieldValue); |
|
} else if (fieldValue instanceof double[]) { |
|
rowData[1] = Arrays.toString((double[]) fieldValue); |
|
} else if (fieldValue instanceof float[]) { |
|
rowData[1] = Arrays.toString((float[]) fieldValue); |
|
} else if (fieldValue instanceof int[]) { |
|
rowData[1] = Arrays.toString((int[]) fieldValue); |
|
} else if (fieldValue instanceof long[]) { |
|
rowData[1] = Arrays.toString((long[]) fieldValue); |
|
} else if (fieldValue instanceof short[]) { |
|
rowData[1] = Arrays.toString((short[]) fieldValue); |
|
} else if (fieldValue instanceof Object[]) { |
|
rowData[1] = Arrays.toString((Object[]) fieldValue); |
|
} else { |
|
rowData[1] = fieldValue; |
|
} |
|
tableModel.addRow(rowData); |
|
} |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
} |
|
|
|
|
|
public void addMBeanInfo(XMBean mbean, MBeanInfo mbeanInfo) { |
|
emptyInfoTable(); |
|
emptyDescTable(); |
|
((TitledBorder) infoBorderPanel.getBorder()).setTitle( |
|
Messages.MBEAN_INFO); |
|
String text = Messages.INFO + ":"; |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.OBJECT_NAME; |
|
rowData[1] = mbean.getObjectName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.CLASS_NAME; |
|
rowData[1] = mbeanInfo.getClassName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mbeanInfo.getDescription(); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mbeanInfo.getDescriptor(), text); |
|
// MBeanConstructorInfo |
|
|
|
int i = 0; |
|
for (MBeanConstructorInfo mbci : mbeanInfo.getConstructors()) { |
|
addMBeanConstructorInfo(mbci, |
|
Messages.CONSTRUCTOR + "-" + i + ":"); |
|
// MBeanParameterInfo |
|
|
|
int j = 0; |
|
for (MBeanParameterInfo mbpi : mbci.getSignature()) { |
|
addMBeanParameterInfo(mbpi, |
|
Messages.PARAMETER + "-" + i + "-" + j + ":"); |
|
j++; |
|
} |
|
i++; |
|
} |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
|
|
|
|
public void addMBeanAttributeInfo(MBeanAttributeInfo mbai) { |
|
emptyInfoTable(); |
|
emptyDescTable(); |
|
((TitledBorder) infoBorderPanel.getBorder()).setTitle( |
|
Messages.MBEAN_ATTRIBUTE_INFO); |
|
String text = Messages.ATTRIBUTE + ":"; |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NAME; |
|
rowData[1] = mbai.getName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mbai.getDescription(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.READABLE; |
|
rowData[1] = mbai.isReadable(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.WRITABLE; |
|
rowData[1] = mbai.isWritable(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.IS; |
|
rowData[1] = mbai.isIs(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.TYPE; |
|
rowData[1] = mbai.getType(); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mbai.getDescriptor(), text); |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
|
|
|
|
public void addMBeanOperationInfo(MBeanOperationInfo mboi) { |
|
emptyInfoTable(); |
|
emptyDescTable(); |
|
((TitledBorder) infoBorderPanel.getBorder()).setTitle( |
|
Messages.MBEAN_OPERATION_INFO); |
|
String text = Messages.OPERATION + ":"; |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NAME; |
|
rowData[1] = mboi.getName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mboi.getDescription(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.IMPACT; |
|
switch (mboi.getImpact()) { |
|
case MBeanOperationInfo.INFO: |
|
rowData[1] = Messages.INFO_CAPITALIZED; |
|
break; |
|
case MBeanOperationInfo.ACTION: |
|
rowData[1] = Messages.ACTION_CAPITALIZED; |
|
break; |
|
case MBeanOperationInfo.ACTION_INFO: |
|
rowData[1] = Messages.ACTION_INFO_CAPITALIZED; |
|
break; |
|
case MBeanOperationInfo.UNKNOWN: |
|
rowData[1] = Messages.UNKNOWN_CAPITALIZED; |
|
break; |
|
} |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.RETURN_TYPE; |
|
rowData[1] = mboi.getReturnType(); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mboi.getDescriptor(), text); |
|
// MBeanParameterInfo |
|
|
|
int i = 0; |
|
for (MBeanParameterInfo mbpi : mboi.getSignature()) { |
|
addMBeanParameterInfo(mbpi, |
|
Messages.PARAMETER + "-" + i++ + ":"); |
|
} |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
|
|
|
|
public void addMBeanNotificationInfo(MBeanNotificationInfo mbni) { |
|
emptyInfoTable(); |
|
emptyDescTable(); |
|
((TitledBorder) infoBorderPanel.getBorder()).setTitle( |
|
Messages.MBEAN_NOTIFICATION_INFO); |
|
String text = Messages.NOTIFICATION + ":"; |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NAME; |
|
rowData[1] = mbni.getName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mbni.getDescription(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NOTIF_TYPES; |
|
rowData[1] = Arrays.toString(mbni.getNotifTypes()); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mbni.getDescriptor(), text); |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
|
|
|
|
private void addMBeanConstructorInfo(MBeanConstructorInfo mbci, String text) { |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NAME; |
|
rowData[1] = mbci.getName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mbci.getDescription(); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mbci.getDescriptor(), text); |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
|
|
|
|
private void addMBeanParameterInfo(MBeanParameterInfo mbpi, String text) { |
|
DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel(); |
|
Object rowData[] = new Object[2]; |
|
rowData[0] = new TableRowDivider(text); |
|
rowData[1] = new TableRowDivider(""); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.NAME; |
|
rowData[1] = mbpi.getName(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.DESCRIPTION; |
|
rowData[1] = mbpi.getDescription(); |
|
tableModel.addRow(rowData); |
|
rowData[0] = Messages.TYPE; |
|
rowData[1] = mbpi.getType(); |
|
tableModel.addRow(rowData); |
|
addDescriptor(mbpi.getDescriptor(), text); |
|
tableModel.newDataAvailable(new TableModelEvent(tableModel)); |
|
} |
|
} |