/* * 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(); } }
/*
* 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();
}
}