| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
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 { | 
 | 
      | 
 | 
    private static final int PLOTTER_DECIMALS = 4;  | 
 | 
 | 
 | 
    private JButton plotButton;  | 
 | 
      | 
 | 
    private static HashMap<String, XPlottingViewer> plotterCache =  | 
 | 
        new HashMap<String, XPlottingViewer>();  | 
 | 
     private static HashMap<String, Timer> timerCache =  | 
 | 
         new HashMap<String, Timer>();  | 
 | 
    private MBeansTab tab;  | 
 | 
    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.table = table;  | 
 | 
        this.attributeName = attributeName;  | 
 | 
        Plotter plotter = createPlotter(mbean, attributeName, key, table);  | 
 | 
        setupDisplay(plotter);  | 
 | 
    }  | 
 | 
 | 
 | 
    static void dispose(MBeansTab tab) { | 
 | 
        Iterator<String> it = plotterCache.keySet().iterator();  | 
 | 
        while(it.hasNext()) { | 
 | 
            String key = it.next();  | 
 | 
            if(key.startsWith(String.valueOf(tab.hashCode()))) { | 
 | 
                it.remove();  | 
 | 
            }  | 
 | 
        }  | 
 | 
          | 
 | 
        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);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    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;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
        }*/  | 
 | 
    @Override  | 
 | 
    public void actionPerformed(ActionEvent evt) { | 
 | 
        plotterCache.remove(key);  | 
 | 
        Timer t = timerCache.remove(key);  | 
 | 
        t.cancel();  | 
 | 
        ((XMBeanAttributes) table).collapse(attributeName, this);  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    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(Messages.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();  | 
 | 
    }  | 
 | 
 | 
 | 
}  |