222 lines · 8.6 KB · Java
RawDownload
/* * Copyright (c) 2004, 2008, 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.inspector; import java.awt.*;import java.awt.event.*;import java.util.*;import java.util.Timer; import javax.swing.*; import sun.tools.jconsole.*; @SuppressWarnings("serial")public class XPlottingViewer extends PlotterPanel implements ActionListener {    // TODO: Make number of decimal places customizable    private static final int PLOTTER_DECIMALS = 4;     private JButton plotButton;    // The plotter cache holds Plotter instances for the various attributes    private static HashMap<String, XPlottingViewer> plotterCache =        new HashMap<String, XPlottingViewer>();     private static HashMap<String, Timer> timerCache =         new HashMap<String, Timer>();    private JPanel bordered;    private Number value;    private MBeansTab tab;    private XMBean mbean;    private String attributeName;    private String key;    private JTable table;    private XPlottingViewer(String key,                            XMBean mbean,                            String attributeName,                            Object value,                            JTable table,                            MBeansTab tab) {        super(null);         this.tab = tab;        this.key = key;        this.mbean = mbean;        this.table = table;        this.attributeName = attributeName;        Plotter plotter = createPlotter(mbean, attributeName, key, table);        setupDisplay(plotter);    }     static void dispose(MBeansTab tab) {        Iterator it = plotterCache.keySet().iterator();        while(it.hasNext()) {            String key = (String) it.next();            if(key.startsWith(String.valueOf(tab.hashCode()))) {                it.remove();            }        }        //plotterCache.clear();        it = timerCache.keySet().iterator();        while(it.hasNext()) {            String key = (String) it.next();            if(key.startsWith(String.valueOf(tab.hashCode()))) {                Timer t = timerCache.get(key);                t.cancel();                it.remove();            }        }    }     public static boolean isViewableValue(Object value) {        return (value instanceof Number);    }     //Fired by dbl click    public  static Component loadPlotting(XMBean mbean,                                          String attributeName,                                          Object value,                                          JTable table,                                          MBeansTab tab) {        Component comp = null;        if(isViewableValue(value)) {            String key = String.valueOf(tab.hashCode()) + " " + String.valueOf(mbean.hashCode()) + " " + mbean.getObjectName().getCanonicalName() + attributeName;            XPlottingViewer plotter = plotterCache.get(key);            if(plotter == null) {                plotter = new XPlottingViewer(key,                                              mbean,                                              attributeName,                                              value,                                              table,                                              tab);                plotterCache.put(key, plotter);            }             comp = plotter;        }        return comp;    }     /*public void paintComponent(Graphics g) {        super.paintComponent(g);        setBackground(g.getColor());        plotter.paintComponent(g);        }*/    @Override    public void actionPerformed(ActionEvent evt) {        plotterCache.remove(key);        Timer t = timerCache.remove(key);        t.cancel();        ((XMBeanAttributes) table).collapse(attributeName, this);    }     //Create plotter instance    public Plotter createPlotter(final XMBean xmbean,                                 final String attributeName,                                 String key,                                 JTable table) {        final Plotter plotter = new XPlotter(table, Plotter.Unit.NONE) {                Dimension prefSize = new Dimension(400, 170);            @Override                public Dimension getPreferredSize() {                    return prefSize;                }            @Override                public Dimension getMinimumSize() {                    return prefSize;                }            };         plotter.createSequence(attributeName, attributeName, null, true);         TimerTask timerTask = new TimerTask() {                public void run() {                    tab.workerAdd(new Runnable() {                            public void run() {                                try {                                    Number n =                                        (Number) xmbean.getSnapshotMBeanServerConnection().getAttribute(xmbean.getObjectName(), attributeName);                                    long v;                                    if (n instanceof Float || n instanceof Double) {                                        plotter.setDecimals(PLOTTER_DECIMALS);                                        double d = (n instanceof Float) ? (Float)n : (Double)n;                                        v = Math.round(d * Math.pow(10.0, PLOTTER_DECIMALS));                                    } else {                                        v = n.longValue();                                    }                                    plotter.addValues(System.currentTimeMillis(), v);                                } catch (Exception ex) {                                    // Should have a trace logged with proper                                    // trace mecchanism                                }                            }                        });                }            };         String timerName = "Timer-" + key;        Timer timer = new Timer(timerName, true);        timer.schedule(timerTask, 0, tab.getUpdateInterval());        timerCache.put(key, timer);        return plotter;    }     private void setupDisplay(Plotter plotter) {        final JPanel buttonPanel = new JPanel();        final GridBagLayout gbl = new GridBagLayout();        buttonPanel.setLayout(gbl);        setLayout(new BorderLayout());        plotButton = new JButton(Resources.getText("Discard chart"));        plotButton.addActionListener(this);        plotButton.setEnabled(true);         GridBagConstraints buttonConstraints = new GridBagConstraints();        buttonConstraints.gridx = 0;        buttonConstraints.gridy = 0;        buttonConstraints.fill = GridBagConstraints.VERTICAL;        buttonConstraints.anchor = GridBagConstraints.CENTER;        gbl.setConstraints(plotButton, buttonConstraints);        buttonPanel.add(plotButton);         if (attributeName != null && attributeName.length()!=0) {            final JPanel plotterLabelPanel = new JPanel();            final JLabel label = new JLabel(attributeName);            final GridBagLayout gbl2 = new GridBagLayout();            plotterLabelPanel.setLayout(gbl2);            final GridBagConstraints labelConstraints = new GridBagConstraints();            labelConstraints.gridx = 0;            labelConstraints.gridy = 0;            labelConstraints.fill = GridBagConstraints.VERTICAL;            labelConstraints.anchor = GridBagConstraints.CENTER;            labelConstraints.ipady = 10;            gbl2.setConstraints(label, labelConstraints);            plotterLabelPanel.add(label);            add(plotterLabelPanel, BorderLayout.NORTH);        }        setPlotter(plotter);        add(buttonPanel, BorderLayout.SOUTH);        repaint();    } }