0N/A/*
2362N/A * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.tools.jconsole.inspector;
0N/A
0N/Aimport java.awt.BorderLayout;
0N/Aimport java.awt.Color;
0N/Aimport java.awt.Component;
0N/Aimport java.awt.GridLayout;
0N/Aimport java.util.*;
0N/Aimport javax.management.*;
0N/Aimport javax.swing.*;
0N/Aimport javax.swing.border.TitledBorder;
0N/Aimport javax.swing.event.*;
0N/Aimport javax.swing.table.*;
5335N/A
5335N/Aimport sun.tools.jconsole.Messages;
0N/A
0N/Aimport static sun.tools.jconsole.Utilities.*;
0N/A
0N/A@SuppressWarnings("serial")
0N/Apublic class XMBeanInfo extends JPanel {
0N/A
0N/A private static final Color lightYellow = new Color(255, 255, 128);
5335N/A private final int NAME_COLUMN = 0;
0N/A private final int VALUE_COLUMN = 1;
0N/A private final String[] columnNames = {
5335N/A Messages.NAME,
5335N/A Messages.VALUE
0N/A };
0N/A private JTable infoTable = new JTable();
0N/A private JTable descTable = new JTable();
0N/A private JPanel infoBorderPanel = new JPanel(new BorderLayout());
0N/A private JPanel descBorderPanel = new JPanel(new BorderLayout());
0N/A
0N/A private static class ReadOnlyDefaultTableModel extends DefaultTableModel {
32N/A
32N/A @Override
0N/A public void setValueAt(Object value, int row, int col) {
0N/A }
0N/A }
0N/A
0N/A private static class TableRowDivider {
0N/A
0N/A private String tableRowDividerText;
0N/A
0N/A public TableRowDivider(String tableRowDividerText) {
0N/A this.tableRowDividerText = tableRowDividerText;
0N/A }
0N/A
32N/A @Override
0N/A public String toString() {
0N/A return tableRowDividerText;
0N/A }
0N/A }
0N/A private static MBeanInfoTableCellRenderer renderer =
0N/A new MBeanInfoTableCellRenderer();
0N/A
0N/A private static class MBeanInfoTableCellRenderer
0N/A extends DefaultTableCellRenderer {
0N/A
32N/A @Override
0N/A public Component getTableCellRendererComponent(
0N/A JTable table, Object value, boolean isSelected,
0N/A boolean hasFocus, int row, int column) {
0N/A Component comp = super.getTableCellRendererComponent(
0N/A table, value, isSelected, hasFocus, row, column);
0N/A if (value instanceof TableRowDivider) {
0N/A JLabel label = new JLabel(value.toString());
0N/A label.setBackground(ensureContrast(lightYellow,
32N/A label.getForeground()));
0N/A label.setOpaque(true);
0N/A return label;
0N/A }
0N/A return comp;
0N/A }
0N/A }
0N/A private static TableCellEditor editor =
0N/A new MBeanInfoTableCellEditor(new JTextField());
0N/A
0N/A private static class MBeanInfoTableCellEditor
0N/A extends Utils.ReadOnlyTableCellEditor {
32N/A
0N/A public MBeanInfoTableCellEditor(JTextField tf) {
0N/A super(tf);
0N/A }
32N/A
32N/A @Override
0N/A public Component getTableCellEditorComponent(
0N/A JTable table, Object value, boolean isSelected,
0N/A int row, int column) {
0N/A Component comp = super.getTableCellEditorComponent(
0N/A table, value, isSelected, row, column);
0N/A if (value instanceof TableRowDivider) {
0N/A JLabel label = new JLabel(value.toString());
0N/A label.setBackground(ensureContrast(lightYellow,
32N/A label.getForeground()));
0N/A label.setOpaque(true);
0N/A return label;
0N/A }
0N/A return comp;
0N/A }
0N/A }
0N/A
0N/A public XMBeanInfo() {
0N/A // Use the grid layout to display the two tables
0N/A //
0N/A super(new GridLayout(2, 1));
0N/A // MBean*Info table
0N/A //
0N/A infoTable.setModel(new ReadOnlyDefaultTableModel());
0N/A infoTable.setRowSelectionAllowed(false);
0N/A infoTable.setColumnSelectionAllowed(false);
0N/A infoTable.getTableHeader().setReorderingAllowed(false);
0N/A ((DefaultTableModel) infoTable.getModel()).setColumnIdentifiers(columnNames);
0N/A infoTable.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(140);
0N/A infoTable.getColumnModel().getColumn(NAME_COLUMN).setMaxWidth(140);
0N/A infoTable.getColumnModel().getColumn(NAME_COLUMN).setCellRenderer(renderer);
0N/A infoTable.getColumnModel().getColumn(VALUE_COLUMN).setCellRenderer(renderer);
0N/A infoTable.getColumnModel().getColumn(NAME_COLUMN).setCellEditor(editor);
0N/A infoTable.getColumnModel().getColumn(VALUE_COLUMN).setCellEditor(editor);
0N/A infoTable.addKeyListener(new Utils.CopyKeyAdapter());
0N/A infoTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
0N/A JScrollPane infoTableScrollPane = new JScrollPane(infoTable);
0N/A infoBorderPanel.setBorder(
0N/A BorderFactory.createTitledBorder("MBeanInfoPlaceHolder"));
0N/A infoBorderPanel.add(infoTableScrollPane);
0N/A // Descriptor table
0N/A //
0N/A descTable.setModel(new ReadOnlyDefaultTableModel());
0N/A descTable.setRowSelectionAllowed(false);
0N/A descTable.setColumnSelectionAllowed(false);
0N/A descTable.getTableHeader().setReorderingAllowed(false);
0N/A ((DefaultTableModel) descTable.getModel()).setColumnIdentifiers(columnNames);
0N/A descTable.getColumnModel().getColumn(NAME_COLUMN).setPreferredWidth(140);
0N/A descTable.getColumnModel().getColumn(NAME_COLUMN).setMaxWidth(140);
0N/A descTable.getColumnModel().getColumn(NAME_COLUMN).setCellRenderer(renderer);
0N/A descTable.getColumnModel().getColumn(VALUE_COLUMN).setCellRenderer(renderer);
0N/A descTable.getColumnModel().getColumn(NAME_COLUMN).setCellEditor(editor);
0N/A descTable.getColumnModel().getColumn(VALUE_COLUMN).setCellEditor(editor);
0N/A descTable.addKeyListener(new Utils.CopyKeyAdapter());
0N/A descTable.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
0N/A JScrollPane descTableScrollPane = new JScrollPane(descTable);
0N/A descBorderPanel.setBorder(
5335N/A BorderFactory.createTitledBorder(Messages.DESCRIPTOR));
0N/A descBorderPanel.add(descTableScrollPane);
0N/A // Add the two tables to the grid
0N/A //
0N/A add(infoBorderPanel);
0N/A add(descBorderPanel);
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void emptyInfoTable() {
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A while (tableModel.getRowCount() > 0) {
0N/A tableModel.removeRow(0);
0N/A }
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void emptyDescTable() {
0N/A DefaultTableModel tableModel = (DefaultTableModel) descTable.getModel();
0N/A while (tableModel.getRowCount() > 0) {
0N/A tableModel.removeRow(0);
0N/A }
0N/A }
0N/A
32N/A // Call on EDT
0N/A private void addDescriptor(Descriptor desc, String text) {
0N/A if (desc != null && desc.getFieldNames().length > 0) {
0N/A DefaultTableModel tableModel = (DefaultTableModel) descTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
0N/A for (String fieldName : desc.getFieldNames()) {
0N/A rowData[0] = fieldName;
0N/A Object fieldValue = desc.getFieldValue(fieldName);
0N/A if (fieldValue instanceof boolean[]) {
0N/A rowData[1] = Arrays.toString((boolean[]) fieldValue);
0N/A } else if (fieldValue instanceof byte[]) {
0N/A rowData[1] = Arrays.toString((byte[]) fieldValue);
0N/A } else if (fieldValue instanceof char[]) {
0N/A rowData[1] = Arrays.toString((char[]) fieldValue);
0N/A } else if (fieldValue instanceof double[]) {
0N/A rowData[1] = Arrays.toString((double[]) fieldValue);
0N/A } else if (fieldValue instanceof float[]) {
0N/A rowData[1] = Arrays.toString((float[]) fieldValue);
0N/A } else if (fieldValue instanceof int[]) {
0N/A rowData[1] = Arrays.toString((int[]) fieldValue);
0N/A } else if (fieldValue instanceof long[]) {
0N/A rowData[1] = Arrays.toString((long[]) fieldValue);
0N/A } else if (fieldValue instanceof short[]) {
0N/A rowData[1] = Arrays.toString((short[]) fieldValue);
0N/A } else if (fieldValue instanceof Object[]) {
0N/A rowData[1] = Arrays.toString((Object[]) fieldValue);
0N/A } else {
0N/A rowData[1] = fieldValue;
0N/A }
0N/A tableModel.addRow(rowData);
0N/A }
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void addMBeanInfo(XMBean mbean, MBeanInfo mbeanInfo) {
0N/A emptyInfoTable();
0N/A emptyDescTable();
0N/A ((TitledBorder) infoBorderPanel.getBorder()).setTitle(
5335N/A Messages.MBEAN_INFO);
5335N/A String text = Messages.INFO + ":";
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.OBJECT_NAME;
0N/A rowData[1] = mbean.getObjectName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.CLASS_NAME;
0N/A rowData[1] = mbeanInfo.getClassName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mbeanInfo.getDescription();
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mbeanInfo.getDescriptor(), text);
0N/A // MBeanConstructorInfo
0N/A //
0N/A int i = 0;
0N/A for (MBeanConstructorInfo mbci : mbeanInfo.getConstructors()) {
0N/A addMBeanConstructorInfo(mbci,
5335N/A Messages.CONSTRUCTOR + "-" + i + ":");
0N/A // MBeanParameterInfo
0N/A //
0N/A int j = 0;
0N/A for (MBeanParameterInfo mbpi : mbci.getSignature()) {
0N/A addMBeanParameterInfo(mbpi,
5335N/A Messages.PARAMETER + "-" + i + "-" + j + ":");
0N/A j++;
0N/A }
0N/A i++;
0N/A }
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void addMBeanAttributeInfo(MBeanAttributeInfo mbai) {
0N/A emptyInfoTable();
0N/A emptyDescTable();
0N/A ((TitledBorder) infoBorderPanel.getBorder()).setTitle(
5335N/A Messages.MBEAN_ATTRIBUTE_INFO);
5335N/A String text = Messages.ATTRIBUTE + ":";
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NAME;
0N/A rowData[1] = mbai.getName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mbai.getDescription();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.READABLE;
0N/A rowData[1] = mbai.isReadable();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.WRITABLE;
0N/A rowData[1] = mbai.isWritable();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.IS;
0N/A rowData[1] = mbai.isIs();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.TYPE;
0N/A rowData[1] = mbai.getType();
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mbai.getDescriptor(), text);
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void addMBeanOperationInfo(MBeanOperationInfo mboi) {
0N/A emptyInfoTable();
0N/A emptyDescTable();
0N/A ((TitledBorder) infoBorderPanel.getBorder()).setTitle(
5335N/A Messages.MBEAN_OPERATION_INFO);
5335N/A String text = Messages.OPERATION + ":";
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NAME;
0N/A rowData[1] = mboi.getName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mboi.getDescription();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.IMPACT;
0N/A switch (mboi.getImpact()) {
0N/A case MBeanOperationInfo.INFO:
5335N/A rowData[1] = Messages.INFO_CAPITALIZED;
0N/A break;
0N/A case MBeanOperationInfo.ACTION:
5335N/A rowData[1] = Messages.ACTION_CAPITALIZED;
0N/A break;
0N/A case MBeanOperationInfo.ACTION_INFO:
5335N/A rowData[1] = Messages.ACTION_INFO_CAPITALIZED;
0N/A break;
0N/A case MBeanOperationInfo.UNKNOWN:
5335N/A rowData[1] = Messages.UNKNOWN_CAPITALIZED;
0N/A break;
0N/A }
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.RETURN_TYPE;
0N/A rowData[1] = mboi.getReturnType();
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mboi.getDescriptor(), text);
0N/A // MBeanParameterInfo
0N/A //
0N/A int i = 0;
0N/A for (MBeanParameterInfo mbpi : mboi.getSignature()) {
0N/A addMBeanParameterInfo(mbpi,
5335N/A Messages.PARAMETER + "-" + i++ + ":");
0N/A }
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A
32N/A // Call on EDT
0N/A public void addMBeanNotificationInfo(MBeanNotificationInfo mbni) {
0N/A emptyInfoTable();
0N/A emptyDescTable();
0N/A ((TitledBorder) infoBorderPanel.getBorder()).setTitle(
5335N/A Messages.MBEAN_NOTIFICATION_INFO);
5335N/A String text = Messages.NOTIFICATION + ":";
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NAME;
0N/A rowData[1] = mbni.getName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mbni.getDescription();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NOTIF_TYPES;
0N/A rowData[1] = Arrays.toString(mbni.getNotifTypes());
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mbni.getDescriptor(), text);
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A
32N/A // Call on EDT
0N/A private void addMBeanConstructorInfo(MBeanConstructorInfo mbci, String text) {
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NAME;
0N/A rowData[1] = mbci.getName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mbci.getDescription();
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mbci.getDescriptor(), text);
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A
32N/A // Call on EDT
0N/A private void addMBeanParameterInfo(MBeanParameterInfo mbpi, String text) {
0N/A DefaultTableModel tableModel = (DefaultTableModel) infoTable.getModel();
0N/A Object rowData[] = new Object[2];
0N/A rowData[0] = new TableRowDivider(text);
0N/A rowData[1] = new TableRowDivider("");
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.NAME;
0N/A rowData[1] = mbpi.getName();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.DESCRIPTION;
0N/A rowData[1] = mbpi.getDescription();
0N/A tableModel.addRow(rowData);
5335N/A rowData[0] = Messages.TYPE;
0N/A rowData[1] = mbpi.getType();
0N/A tableModel.addRow(rowData);
0N/A addDescriptor(mbpi.getDescriptor(), text);
0N/A tableModel.newDataAvailable(new TableModelEvent(tableModel));
0N/A }
0N/A}