257 lines · 9.8 KB · Java
RawDownload
/* * Copyright (c) 2004, 2007, Oracle and/or its affiliates. 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.  Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package sun.tools.jconsole; import java.awt.*;import java.awt.event.*;import java.io.*;import java.lang.management.*;import java.lang.reflect.*; import javax.swing.*;import javax.swing.border.*;import javax.swing.event.*;import javax.swing.text.*; import java.util.*;import java.util.List;import java.util.concurrent.*; import sun.awt.*; import static sun.tools.jconsole.Formatter.*;import static sun.tools.jconsole.Resources.*;import static sun.tools.jconsole.Utilities.*;  @SuppressWarnings("serial")class ClassTab extends Tab implements ActionListener {    PlotterPanel loadedClassesMeter;    TimeComboBox timeComboBox;    private JCheckBox verboseCheckBox;    private HTMLPane details;    private ClassOverviewPanel overviewPanel;    private boolean plotterListening = false;     private static final String loadedPlotterKey        = "loaded";    private static final String totalLoadedPlotterKey   = "totalLoaded";    private static final String loadedPlotterName       = Resources.getText("Loaded");    private static final String totalLoadedPlotterName  = Resources.getText("Total Loaded");    private static final Color  loadedPlotterColor      = Plotter.defaultColor;    private static final Color  totalLoadedPlotterColor = Color.red;     private static final String infoLabelFormat = "ClassTab.infoLabelFormat";     /*      Hierarchy of panels and layouts for this tab:         ClassTab (BorderLayout)             North:  topPanel (BorderLayout)                         Center: controlPanel (FlowLayout)                                    timeComboBox                         East:   topRightPanel (FlowLayout)                                    verboseCheckBox             Center: plotterPanel (BorderLayout)                         Center: plotter             South:  bottomPanel (BorderLayout)                         Center: details    */     public static String getTabName() {        return Resources.getText("Classes");    }     public ClassTab(VMPanel vmPanel) {        super(vmPanel, getTabName());         setLayout(new BorderLayout(0, 0));        setBorder(new EmptyBorder(4, 4, 3, 4));         JPanel topPanel     = new JPanel(new BorderLayout());        JPanel plotterPanel = new JPanel(new BorderLayout());        JPanel bottomPanel  = new JPanel(new BorderLayout());         add(topPanel,     BorderLayout.NORTH);        add(plotterPanel, BorderLayout.CENTER);        add(bottomPanel,  BorderLayout.SOUTH);         JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 5));        topPanel.add(controlPanel, BorderLayout.CENTER);         verboseCheckBox = new JCheckBox(Resources.getText("Verbose Output"));        verboseCheckBox.addActionListener(this);        verboseCheckBox.setToolTipText(getText("Verbose Output.toolTip"));        JPanel topRightPanel = new JPanel();        topRightPanel.setBorder(new EmptyBorder(0, 65-8, 0, 70));        topRightPanel.add(verboseCheckBox);        topPanel.add(topRightPanel, BorderLayout.AFTER_LINE_ENDS);         loadedClassesMeter = new PlotterPanel(Resources.getText("Number of Loaded Classes"),                                              Plotter.Unit.NONE, false);        loadedClassesMeter.plotter.createSequence(loadedPlotterKey,                                                  loadedPlotterName,                                                  loadedPlotterColor,                                                  true);        loadedClassesMeter.plotter.createSequence(totalLoadedPlotterKey,                                                  totalLoadedPlotterName,                                                  totalLoadedPlotterColor,                                                  true);        setAccessibleName(loadedClassesMeter.plotter,                          getText("ClassTab.loadedClassesPlotter.accessibleName"));        plotterPanel.add(loadedClassesMeter);         timeComboBox = new TimeComboBox(loadedClassesMeter.plotter);        controlPanel.add(new LabeledComponent(Resources.getText("Time Range:"),                                              getMnemonicInt("Time Range:"),                                              timeComboBox));         LabeledComponent.layout(plotterPanel);         bottomPanel.setBorder(new CompoundBorder(new TitledBorder(Resources.getText("Details")),                                                  new EmptyBorder(10, 10, 10, 10)));         details = new HTMLPane();        setAccessibleName(details, getText("Details"));        JScrollPane scrollPane = new JScrollPane(details);        scrollPane.setPreferredSize(new Dimension(0, 150));        bottomPanel.add(scrollPane, BorderLayout.SOUTH);     }     public void actionPerformed(ActionEvent ev) {        final boolean b = verboseCheckBox.isSelected();        workerAdd(new Runnable() {            public void run() {                ProxyClient proxyClient = vmPanel.getProxyClient();                try {                    proxyClient.getClassLoadingMXBean().setVerbose(b);                } catch (UndeclaredThrowableException e) {                    proxyClient.markAsDead();                } catch (IOException ex) {                    // Ignore                }            }        });    }      public SwingWorker<?, ?> newSwingWorker() {        final ProxyClient proxyClient = vmPanel.getProxyClient();         if (!plotterListening) {            proxyClient.addWeakPropertyChangeListener(loadedClassesMeter.plotter);            plotterListening = true;        }         return new SwingWorker<Boolean, Object>() {            private long clCount, cuCount, ctCount;            private boolean isVerbose;            private String detailsStr;            private long timeStamp;             public Boolean doInBackground() {                try {                    ClassLoadingMXBean classLoadingMBean = proxyClient.getClassLoadingMXBean();                     clCount = classLoadingMBean.getLoadedClassCount();                    cuCount = classLoadingMBean.getUnloadedClassCount();                    ctCount = classLoadingMBean.getTotalLoadedClassCount();                    isVerbose = classLoadingMBean.isVerbose();                    detailsStr = formatDetails();                    timeStamp = System.currentTimeMillis();                     return true;                } catch (UndeclaredThrowableException e) {                    proxyClient.markAsDead();                    return false;                } catch (IOException e) {                    return false;                }            }             protected void done() {                try {                    if (get()) {                        loadedClassesMeter.plotter.addValues(timeStamp, clCount, ctCount);                         if (overviewPanel != null) {                            overviewPanel.updateClassInfo(ctCount, clCount);                            overviewPanel.getPlotter().addValues(timeStamp, clCount);                        }                         loadedClassesMeter.setValueLabel(clCount + "");                        verboseCheckBox.setSelected(isVerbose);                        details.setText(detailsStr);                    }                } catch (InterruptedException ex) {                } catch (ExecutionException ex) {                    if (JConsole.isDebug()) {                        ex.printStackTrace();                    }                }            }             private String formatDetails() {                String text = "<table cellspacing=0 cellpadding=0>";                 long time = System.currentTimeMillis();                String timeStamp = formatDateTime(time);                text += newRow(Resources.getText("Time"), timeStamp);                text += newRow(Resources.getText("Current classes loaded"), justify(clCount, 5));                text += newRow(Resources.getText("Total classes loaded"),   justify(ctCount, 5));                text += newRow(Resources.getText("Total classes unloaded"), justify(cuCount, 5));                 return text;            }        };    }      OverviewPanel[] getOverviewPanels() {        if (overviewPanel == null) {            overviewPanel = new ClassOverviewPanel();        }        return new OverviewPanel[] { overviewPanel };    }     private static class ClassOverviewPanel extends OverviewPanel {        ClassOverviewPanel() {            super(getText("Classes"), loadedPlotterKey, loadedPlotterName, null);        }         private void updateClassInfo(long total, long loaded) {            long unloaded = (total - loaded);            getInfoLabel().setText(getText(infoLabelFormat, loaded, unloaded, total));        }    }}