[Mc4j-cvs] mc4j/src/org/mc4j/jre15/components ThreadsViewComponent.java,1.1,1.2 MemoryUsageComponent
Brought to you by:
ghinkl
From: Greg H. <gh...@us...> - 2006-04-12 19:14:43
|
Update of /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20162/src/org/mc4j/jre15/components Modified Files: MemoryUsageComponent.java MemoryUsageLineChartComponent.java MemoryUsagePieChartComponent.java DeadlockDetectionComponent.java MemoryUsageAreaChartComponent.java ThreadMBeanThreadBrowserComponent.java Added Files: ThreadsViewComponent.java Log Message: Merging EMS into head for the 2.0 release work Index: ThreadMBeanThreadBrowserComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/ThreadMBeanThreadBrowserComponent.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ThreadMBeanThreadBrowserComponent.java 5 Oct 2004 05:16:19 -0000 1.4 --- ThreadMBeanThreadBrowserComponent.java 12 Apr 2006 19:14:04 -0000 1.5 *************** *** 17,50 **** package org.mc4j.jre15.components; import org.openide.ErrorManager; - import org.mc4j.console.dashboard.Dashboard; - import org.mc4j.console.dashboard.DashboardComponent; - - import java.awt.BorderLayout; - import java.awt.Component; - import java.lang.management.ManagementFactory; - import java.lang.management.ThreadInfo; - import java.lang.management.ThreadMXBean; - import java.util.Arrays; - import java.util.HashMap; - import java.util.HashSet; - import java.util.Iterator; - import java.util.Map; - import java.util.Set; - import javax.management.MBeanServer; ! import javax.management.MBeanServerInvocationHandler; ! import javax.management.MalformedObjectNameException; ! import javax.management.ObjectName; ! import javax.management.openmbean.CompositeData; ! import javax.swing.Icon; ! import javax.swing.ImageIcon; ! import javax.swing.JPanel; ! import javax.swing.JScrollPane; ! import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; /** --- 17,33 ---- package org.mc4j.jre15.components; + import org.mc4j.console.dashboard.components.BeanComponent; + import org.mc4j.ems.connection.bean.EmsBean; import org.openide.ErrorManager; import javax.management.MBeanServer; ! import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; + import java.awt.*; + import java.lang.management.ThreadInfo; + import java.lang.management.ThreadMXBean; + import java.util.*; /** *************** *** 55,60 **** * @version $Revision$($Author$ / $Date$) */ ! public class ThreadMBeanThreadBrowserComponent extends JPanel implements DashboardComponent { protected ThreadMXBean threadMBean; --- 38,44 ---- * @version $Revision$($Author$ / $Date$) */ ! public class ThreadMBeanThreadBrowserComponent extends JPanel implements BeanComponent { + protected EmsBean emsThreadBean; protected ThreadMXBean threadMBean; *************** *** 66,70 **** protected MBeanServer server; ! protected Map threadMap; public ThreadMBeanThreadBrowserComponent() { --- 50,54 ---- protected MBeanServer server; ! protected Map<Long, DefaultMutableTreeNode> threadMap; public ThreadMBeanThreadBrowserComponent() { *************** *** 92,127 **** } ! public void setContext(Map context) { ! MBeanServer mBeanServer = (MBeanServer) context.get(Dashboard.CONTEXT_MBEAN_SERVER); ! this.server = mBeanServer; ! try { ! ! this.threadMBean = (ThreadMXBean) ! MBeanServerInvocationHandler.newProxyInstance( ! mBeanServer, ! new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME), ! ThreadMXBean.class, ! false); ! ! } catch (MalformedObjectNameException moe) { ! ErrorManager.getDefault().notify(moe); ! } refresh(); this.treeModel.nodeStructureChanged(root); } - public void refresh() { try { // TODO GH: the added set is not being used and right now i'm firing // update events for each insertion or removal. this is probably much // slower than firing a single event with all of the changes. ! Set deadThreadSet = new HashSet(threadMap.values()); ! Set addedSet = new HashSet(); long[] threadIds = this.threadMBean.getAllThreadIds(); --- 76,107 ---- } + public void setBean(EmsBean emsBean) { + this.emsThreadBean = emsBean; ! this.threadMBean = this.emsThreadBean.getProxy(ThreadMXBean.class); refresh(); this.treeModel.nodeStructureChanged(root); + } + public void setContext(Map context) { + + + } + + public synchronized void refresh() { + + try { // TODO GH: the added set is not being used and right now i'm firing // update events for each insertion or removal. this is probably much // slower than firing a single event with all of the changes. ! Set<DefaultMutableTreeNode> deadThreadSet = new HashSet<DefaultMutableTreeNode>(threadMap.values()); ! Set<DefaultMutableTreeNode> addedSet = new HashSet<DefaultMutableTreeNode>(); long[] threadIds = this.threadMBean.getAllThreadIds(); *************** *** 132,155 **** ! CompositeData[] compositeDatas = ! (CompositeData[]) ! this.server.invoke( ! new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME), ! "getThreadInfo", ! new Object[] { threadIds, new Integer(Integer.MAX_VALUE) }, ! new String[] { threadIds.getClass().getName(), Integer.TYPE.getName() }); ! ! for (int i = 0; i < compositeDatas.length; i++) { ! ThreadInfo threadInfo = ThreadInfo.from(compositeDatas[i]); DefaultMutableTreeNode threadNode = null; ! threadNode = (DefaultMutableTreeNode) threadMap.get(new Long(threadInfo.getThreadId())); if (threadNode == null) { threadNode = new DefaultMutableTreeNode(threadInfo); root.add(threadNode); ! threadMap.put(new Long(threadInfo.getThreadId()),threadNode); addedSet.add(threadNode); this.treeModel.nodesWereInserted(root, new int[] { root.getChildCount() - 1 }); --- 112,128 ---- ! ThreadInfo[] threadInfos = ! threadMBean.getThreadInfo(threadIds,Integer.MAX_VALUE); ! for (ThreadInfo threadInfo : threadInfos) { DefaultMutableTreeNode threadNode = null; ! threadNode = (DefaultMutableTreeNode) threadMap.get(threadInfo.getThreadId()); if (threadNode == null) { threadNode = new DefaultMutableTreeNode(threadInfo); root.add(threadNode); ! threadMap.put(threadInfo.getThreadId(),threadNode); addedSet.add(threadNode); this.treeModel.nodesWereInserted(root, new int[] { root.getChildCount() - 1 }); *************** *** 161,167 **** StackTraceElement[] stackElements = threadInfo.getStackTrace(); ! for (int j = 0; j < stackElements.length; j++) { ! StackTraceElement stackElement = stackElements[j]; ! DefaultMutableTreeNode stackNode = new DefaultMutableTreeNode(stackElement); threadNode.add(stackNode); --- 134,138 ---- StackTraceElement[] stackElements = threadInfo.getStackTrace(); ! for (StackTraceElement stackElement : stackElements) { DefaultMutableTreeNode stackNode = new DefaultMutableTreeNode(stackElement); threadNode.add(stackNode); *************** *** 174,183 **** // Remove any threads we didn't remove from the dead thread set... and which are therefore now dead ! for (Iterator iterator = deadThreadSet.iterator(); iterator.hasNext();) { ! DefaultMutableTreeNode defaultMutableTreeNode = (DefaultMutableTreeNode) iterator.next(); int index = root.getIndex(defaultMutableTreeNode); root.remove(defaultMutableTreeNode); ! this.treeModel.nodesWereRemoved(root, new int[] { index }, new Object[] { defaultMutableTreeNode }); ! threadMap.remove(new Long(((ThreadInfo)defaultMutableTreeNode.getUserObject()).getThreadId())); } --- 145,153 ---- // Remove any threads we didn't remove from the dead thread set... and which are therefore now dead ! for (DefaultMutableTreeNode defaultMutableTreeNode : deadThreadSet) { int index = root.getIndex(defaultMutableTreeNode); root.remove(defaultMutableTreeNode); ! this.treeModel.nodesWereRemoved(root, new int[]{index}, new Object[]{defaultMutableTreeNode}); ! threadMap.remove(((ThreadInfo) defaultMutableTreeNode.getUserObject()).getThreadId()); } Index: MemoryUsageLineChartComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/MemoryUsageLineChartComponent.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** MemoryUsageLineChartComponent.java 5 Oct 2004 05:16:19 -0000 1.5 --- MemoryUsageLineChartComponent.java 12 Apr 2006 19:14:04 -0000 1.6 *************** *** 17,37 **** package org.mc4j.jre15.components; ! import org.jfree.data.DefaultPieDataset; import org.jfree.data.time.Millisecond; import org.jfree.data.time.TimeSeries; ! ! import org.mc4j.console.bean.MBeanNode; ! import org.mc4j.console.dashboard.Dashboard; import org.mc4j.console.dashboard.components.NumericAttributeGraph; import java.lang.management.MemoryUsage; - import java.util.Iterator; import java.util.List; import java.util.Map; - import javax.management.MBeanServer; - import javax.management.ObjectName; - import javax.management.openmbean.CompositeData; - /** * You use this like an Attribute Graph Panel and it shows a --- 17,33 ---- package org.mc4j.jre15.components; ! ! import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.time.Millisecond; import org.jfree.data.time.TimeSeries; ! import org.mc4j.console.dashboard.components.BeanListComponent; import org.mc4j.console.dashboard.components.NumericAttributeGraph; + import org.mc4j.ems.connection.bean.EmsBean; + import javax.management.openmbean.CompositeData; import java.lang.management.MemoryUsage; import java.util.List; import java.util.Map; /** * You use this like an Attribute Graph Panel and it shows a *************** *** 41,45 **** * @version $Revision$($Author$ / $Date$) */ ! public class MemoryUsageLineChartComponent extends NumericAttributeGraph { public static final String COMMITTED = "Committed"; --- 37,41 ---- * @version $Revision$($Author$ / $Date$) */ ! public class MemoryUsageLineChartComponent extends NumericAttributeGraph implements BeanListComponent { public static final String COMMITTED = "Committed"; *************** *** 50,66 **** protected DefaultPieDataset pieDataset; ! protected List beanList; public void addObservation() throws Exception { ! for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { ! try { ! MBeanNode beanNode = (MBeanNode) iterator.next(); ! ObjectName objectName = beanNode.getObjectName(); //String name = (String) this.server.getAttribute(objectName, "Name"); - MemoryUsage usage = MemoryUsage.from((CompositeData) this.server.getAttribute(objectName, "Usage")); ! TimeSeries ts = getTimeSeries(beanNode); ts.add(new Millisecond(), usage.getUsed()); --- 46,61 ---- protected DefaultPieDataset pieDataset; ! protected List<EmsBean> beanList; public void addObservation() throws Exception { ! for (EmsBean bean : beanList) { + try { //String name = (String) this.server.getAttribute(objectName, "Name"); ! MemoryUsage usage = MemoryUsage.from((CompositeData) bean.getAttribute("Usage").refresh()); ! ! TimeSeries ts = getTimeSeries(bean); ts.add(new Millisecond(), usage.getUsed()); *************** *** 76,93 **** public void setContext(Map context) { ! List beanList = (List) context.get(Dashboard.CONTEXT_MBEAN_LIST); ! ! this.beanList = beanList; ! ! this.server = (MBeanServer) context.get(Dashboard.CONTEXT_MBEAN_SERVER); ! ! for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { ! MBeanNode beanNode = (MBeanNode) iterator.next(); ! ObjectName objectName = beanNode.getObjectName(); try { ! String name = (String) this.server.getAttribute(objectName, "Name"); ! createTimeSeries(name, beanNode); } catch (Exception e) { e.printStackTrace(); --- 71,80 ---- public void setContext(Map context) { ! for (EmsBean bean : beanList) { try { ! String name = (String) bean.getAttribute("Name").getValue(); ! createTimeSeries(name, bean); } catch (Exception e) { e.printStackTrace(); *************** *** 98,100 **** --- 85,90 ---- } + public void setBeanList(List<EmsBean> beanList) { + this.beanList = beanList; + } } Index: DeadlockDetectionComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/DeadlockDetectionComponent.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** DeadlockDetectionComponent.java 5 Oct 2004 05:16:19 -0000 1.5 --- DeadlockDetectionComponent.java 12 Apr 2006 19:14:04 -0000 1.6 *************** *** 17,41 **** package org.mc4j.jre15.components; import org.openide.ErrorManager; ! import org.mc4j.console.dashboard.Dashboard; ! import org.mc4j.console.dashboard.DashboardComponent; ! ! import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; ! import java.util.HashMap; ! import java.util.HashSet; ! import java.util.Iterator; ! import java.util.Map; ! import java.util.Set; ! ! import javax.management.MBeanServer; ! import javax.management.MBeanServerInvocationHandler; ! import javax.management.MalformedObjectNameException; ! import javax.management.ObjectName; ! import javax.management.openmbean.CompositeData; ! import javax.swing.BoxLayout; ! import javax.swing.JPanel; --- 17,28 ---- package org.mc4j.jre15.components; + import org.mc4j.console.dashboard.components.BeanComponent; + import org.mc4j.ems.connection.bean.EmsBean; import org.openide.ErrorManager; ! import javax.swing.*; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; ! import java.util.*; *************** *** 45,71 **** * @version $Revision$($Author$ / $Date$) */ ! public class DeadlockDetectionComponent extends JPanel implements DashboardComponent { private ThreadMXBean threadMBean; - private MBeanServer server; ! private Map deadThreads = new HashMap(); ! public void setContext(Map context) { ! MBeanServer mBeanServer = (MBeanServer) context.get(Dashboard.CONTEXT_MBEAN_SERVER); ! this.server = mBeanServer; ! try { ! this.threadMBean = (ThreadMXBean) ! MBeanServerInvocationHandler.newProxyInstance( ! mBeanServer, ! new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME), ! ThreadMXBean.class, ! false); - } catch (MalformedObjectNameException moe) { - ErrorManager.getDefault().notify(moe); - } setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); --- 32,54 ---- * @version $Revision$($Author$ / $Date$) */ ! public class DeadlockDetectionComponent extends JPanel implements BeanComponent { + private EmsBean emsBean; private ThreadMXBean threadMBean; ! private Map<Long,DeadlockedThreadComponent> deadThreads = new HashMap<Long, DeadlockedThreadComponent>(); ! public void setBean(EmsBean emsBean) { ! this.emsBean = emsBean; ! this.threadMBean = this.emsBean.getProxy(ThreadMXBean.class); ! refresh(); ! ! } ! ! ! public void setContext(Map context) { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); *************** *** 86,89 **** --- 69,73 ---- Thread t2 = new Thread(new Runnable() { + @SuppressWarnings({"InfiniteLoopStatement"}) public void run() { while(true) { *************** *** 108,113 **** try { - // TODO GH: This does not work yet! It doesn't appear to have been completed before - // the beta release of 1.5 long[] result = this.threadMBean.findMonitorDeadlockedThreads(); --- 92,95 ---- *************** *** 119,132 **** try { ThreadInfo info = ! ThreadInfo.from( ! (CompositeData) ! server.invoke( ! new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME), ! "getThreadInfo", ! new Object[] { new Long(threadId), new Integer(Integer.MAX_VALUE) }, ! new String[] { Long.TYPE.getName(), Integer.TYPE.getName() })); ! if (!deadThreads.containsKey(new Long(info.getThreadId()))) { DeadlockedThreadComponent deadThread = --- 101,108 ---- try { ThreadInfo info = ! threadMBean.getThreadInfo(threadId,Integer.MAX_VALUE); ! if (!deadThreads.containsKey(info.getThreadId())) { DeadlockedThreadComponent deadThread = *************** *** 136,140 **** } ! stillDeadThreads.add(new Long(info.getThreadId())); } catch (Exception e) { --- 112,116 ---- } ! stillDeadThreads.add(info.getThreadId()); } catch (Exception e) { *************** *** 163,165 **** --- 139,142 ---- } + } Index: MemoryUsageAreaChartComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/MemoryUsageAreaChartComponent.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** MemoryUsageAreaChartComponent.java 5 Oct 2004 05:16:19 -0000 1.4 --- MemoryUsageAreaChartComponent.java 12 Apr 2006 19:14:04 -0000 1.5 *************** *** 22,37 **** import org.jfree.chart.labels.XYItemLabelGenerator; import org.jfree.chart.plot.PlotOrientation; ! import org.jfree.chart.renderer.StackedXYAreaRenderer; ! import org.jfree.data.XYDataset; import org.jfree.data.time.Millisecond; import org.jfree.data.time.RegularTimePeriod; ! ! import org.mc4j.console.bean.MBeanNode; ! import org.mc4j.console.bean.attribute.AttributeNode; ! import org.mc4j.console.dashboard.Dashboard; import org.mc4j.console.dashboard.components.BeanListComponent; import org.mc4j.console.dashboard.components.NumericAttributeGraph; ! import org.mc4j.console.swing.graph.data.BoundedTimeTableXYDataset; import java.awt.BorderLayout; import java.awt.Color; --- 22,36 ---- import org.jfree.chart.labels.XYItemLabelGenerator; import org.jfree.chart.plot.PlotOrientation; ! import org.jfree.chart.renderer.xy.StackedXYAreaRenderer; ! import org.jfree.data.xy.XYDataset; import org.jfree.data.time.Millisecond; import org.jfree.data.time.RegularTimePeriod; ! import org.jfree.data.time.TimeTableXYDataset; import org.mc4j.console.dashboard.components.BeanListComponent; import org.mc4j.console.dashboard.components.NumericAttributeGraph; ! import org.mc4j.ems.connection.bean.EmsBean; + import javax.management.openmbean.CompositeData; + import javax.swing.border.LineBorder; import java.awt.BorderLayout; import java.awt.Color; *************** *** 39,53 **** import java.text.DecimalFormat; import java.text.NumberFormat; - import java.util.ArrayList; - import java.util.Collections; - import java.util.Iterator; import java.util.List; import java.util.Map; - import javax.management.MBeanServer; - import javax.management.ObjectName; - import javax.management.openmbean.CompositeData; - import javax.swing.border.LineBorder; - /** * You use this like an Attribute Graph Panel and it shows a --- 38,44 ---- *************** *** 61,69 **** public static final String USED = "Used"; ! protected List beanList; ! ! protected List nameList = new ArrayList(); ! protected BoundedTimeTableXYDataset dataset2 = new BoundedTimeTableXYDataset(); protected RegularTimePeriod removeArray[] = new RegularTimePeriod[60]; --- 52,58 ---- public static final String USED = "Used"; ! protected List<EmsBean> beanList; ! protected TimeTableXYDataset dataset2 = new TimeTableXYDataset(); protected RegularTimePeriod removeArray[] = new RegularTimePeriod[60]; *************** *** 102,107 **** ! renderer.setBaseLabelGenerator(new XYItemLabelGenerator() { ! public String generateItemLabel(XYDataset dataset, int series, int item) { Number x = dataset.getXValue(series, item); long bytes = x.longValue(); --- 91,96 ---- ! renderer.setItemLabelGenerator(new XYItemLabelGenerator() { ! public String generateLabel(XYDataset dataset, int series, int item) { Number x = dataset.getXValue(series, item); long bytes = x.longValue(); *************** *** 153,164 **** //time = System.currentTimeMillis(); ! for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { try { ! MBeanNode beanNode = (MBeanNode) iterator.next(); ! ObjectName objectName = beanNode.getObjectName(); ! ! MemoryUsage usage = MemoryUsage.from((CompositeData) this.server.getAttribute(objectName, "Usage")); ! String name = (String) ((AttributeNode)beanNode.getAttributeNodeMap().get("Name")).getValue(); dataset2.add(time, new Long(usage.getUsed()), name, false); --- 142,150 ---- //time = System.currentTimeMillis(); ! for (EmsBean bean : beanList) { try { ! MemoryUsage usage = MemoryUsage.from((CompositeData) bean.getAttribute("Usage").refresh()); ! String name = (String) bean.getAttribute("Name").getValue(); dataset2.add(time, new Long(usage.getUsed()), name, false); *************** *** 169,173 **** } ! dataset2.rebound(); chart.fireChartChanged(); --- 155,159 ---- } ! // dataset2.rebound(); chart.fireChartChanged(); *************** *** 185,208 **** - - this.server = (MBeanServer) context.get(Dashboard.CONTEXT_MBEAN_SERVER); - - ArrayList list = new ArrayList(); - Collections.reverse(beanList); - for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { - MBeanNode beanNode = (MBeanNode) iterator.next(); - ObjectName objectName = beanNode.getObjectName(); - - try { - String name = (String) this.server.getAttribute(objectName, "Name"); - - this.nameList.add(name); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - initGraphPanel2(); reschedule(); --- 171,174 ---- --- NEW FILE: ThreadsViewComponent.java --- /* * Copyright 2002-2005 Greg Hinkle * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.mc4j.jre15.components; import org.jdesktop.swingx.JXTable; import org.jdesktop.swingx.decorator.AlternateRowHighlighter; import org.jdesktop.swingx.decorator.Highlighter; import org.jdesktop.swingx.decorator.HighlighterPipeline; import org.mc4j.console.dashboard.DashboardComponent; import org.mc4j.console.dashboard.components.BeanComponent; import org.mc4j.console.swing.graph.GlassWindow; import org.mc4j.ems.connection.bean.EmsBean; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * @author Greg Hinkle (gh...@us...), Apr 3, 2006 * @version $Revision: 1.2 $($Author: ghinkl $ / $Date: 2006/04/12 19:14:04 $) */ public class ThreadsViewComponent extends JPanel implements DashboardComponent, BeanComponent { EmsBean emsThreadBean; ThreadMXBean threadBean; JXTable table; ThreadsTableModel model; private static final int TIME_HISTORY = 100 * 1000; public void setContext(Map context) { model = new ThreadsTableModel(threadBean); table = new JXTable(model); table.setColumnControlVisible(true); table.setHighlighters(new HighlighterPipeline(new Highlighter[]{new AlternateRowHighlighter()})); table.getColumnExt(2).setCellRenderer(new ThreadStateCellRenderer()); table.getColumnExt(3).setCellRenderer(new ThreadDataGraphRenderer()); table.getColumnExt(5).setCellRenderer(new PercentageCellRenderer()); setLayout(new BorderLayout()); add(new JScrollPane(table), BorderLayout.CENTER); table.getColumnExt(0).setPreferredWidth(35); // Id table.getColumnExt(1).setPreferredWidth(180); // Name table.getColumnExt(2).setPreferredWidth(35); // State table.getColumnExt(3).setMinWidth(200); table.getColumnExt(3).setPreferredWidth(350); table.getColumnExt(4).setVisible(false); // CPU Total table.getColumnExt(6).setVisible(false); // User CPU Total table.getColumnExt(7).setVisible(false); // Blocks Total table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { ThreadsTableModel.ThreadData d = model.getData(e.getFirstIndex()); JTextPane textPane = new JTextPane(); StringBuilder b = new StringBuilder(); ThreadInfo ti = threadBean.getThreadInfo(d.getLastData().getThreadId(), Integer.MAX_VALUE); if (ti != null) { for (StackTraceElement el : ti.getStackTrace()) { b.append(el); b.append("\n"); } textPane.setEditable(false); textPane.setText(b.toString()); textPane.setPreferredSize(new Dimension(500,600)); GlassWindow.show(new JScrollPane(textPane),ThreadsViewComponent.this); } } }); } public void refresh() { model.refresh(); model.fireTableDataChanged(); } public void setBean(EmsBean emsBean) { this.emsThreadBean = emsBean; threadBean = emsBean.getProxy(ThreadMXBean.class); // TODO: This is a little nasty, what if someone connects to a production system? this.threadBean.setThreadContentionMonitoringEnabled(true); this.threadBean.setThreadCpuTimeEnabled(true); } public static class ThreadDataGraphRenderer extends DefaultTableCellRenderer { ThreadsTableModel.ThreadData data; private static final Color blocked = new Color(205, 92, 92); private static final Color neww = new Color(135, 206, 250); private static final Color runnable = new Color(144, 238, 144); private static final Color terminated = new Color(112, 128, 244); private static final Color timed_waiting = new Color(240, 128, 128); private static final Color waiting = new Color(255, 239, 213); public ThreadDataGraphRenderer() { setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { data = (ThreadsTableModel.ThreadData) value; return this; } protected void paintComponent(Graphics g) { LinkedList<ThreadsTableModel.ThreadData.ThreadStatePoint> list = data.getStatePoints(); g.setColor(getBackground()); g.fillRect(0,0, getWidth(), getHeight()); Color c = null; long now = System.currentTimeMillis(); long then = now - TIME_HISTORY; double last = 0d; for (ThreadsTableModel.ThreadData.ThreadStatePoint point : list) { switch (point.getState()) { case BLOCKED: c = blocked; break; case NEW: c = neww; break; case RUNNABLE: c = runnable; break; case TERMINATED: c = terminated; break; case TIMED_WAITING: c = timed_waiting; break; case WAITING: c = waiting; break; } g.setColor(c); int width = getWidth() - 4; int height = getHeight() - 4; double d = width * ((double) (point.getTime() - then) / TIME_HISTORY) + 2; if (last == 0) last = width * ((double) (point.getTime() - then - 1000) / TIME_HISTORY) + 2; g.fillRect(((int) (last)) + 1, 2, (int) d, height); last = d; } } } public static class PercentageCellRenderer extends DefaultTableCellRenderer { static NumberFormat f; static { f = DecimalFormat.getPercentInstance(); f.setMaximumFractionDigits(2); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { return super.getTableCellRendererComponent(table, f.format(value), isSelected, hasFocus, row, column); } } public static class ThreadStateCellRenderer extends DefaultTableCellRenderer { public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Icon icon = null; if (value instanceof Thread.State) { switch ((Thread.State)value) { case BLOCKED: icon = threadBlockedIcon; break; case NEW: icon = threadIcon; break; case RUNNABLE: icon = threadRunningIcon; break; case TERMINATED: icon = threadTerminatedIcon; break; case TIMED_WAITING: icon = threadWaitingIcon; break; case WAITING: icon = threadWaitingIcon; break; } } else { icon = threadIcon; } setHorizontalAlignment(CENTER); setIcon(icon); return this; } private static Icon threadIcon = createImageIcon("images/Thread.gif"); private static Icon threadRunningIcon = createImageIcon("images/ThreadRunning.gif"); private static Icon threadWaitingIcon = createImageIcon("images/ThreadWaiting.gif"); private static Icon threadBlockedIcon = createImageIcon("images/ThreadBlocked.gif"); private static Icon threadTerminatedIcon = createImageIcon("images/ThreadTerminated.gif"); private static Icon stackElementIcon = createImageIcon("images/StackElement.gif"); /** * Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = ThreadMBeanThreadBrowserComponent.class.getClassLoader().getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn't find file: " + path); return null; } } } public static class ThreadsTableModel extends AbstractTableModel { private static final String[] COLUMNS = new String[]{ "Id", "Name", "State", "History", "CPU Total","CPU %", "User Total", "Blocks", "Block Time", "Lock" }; ThreadMXBean threadBean; LinkedHashMap<Long, ThreadData> data = new LinkedHashMap<Long, ThreadData>(); List<Long> threadList = new ArrayList<Long>(); long lastTotalCpu; long currentTotalCpu; public ThreadsTableModel(ThreadMXBean threadBean) { this.threadBean = threadBean; } public synchronized void refresh() { // Refresh all at once so we don't get weird array out of bounds stuff or something like that // Threads never disappear from this list, that'd be confusing, but their data would obviously stop updating long[] threadIds = threadBean.getAllThreadIds(); ThreadInfo[] threadInfos = threadBean.getThreadInfo(threadIds); HashSet<Long> deadCheck = new HashSet<Long>(threadList); currentTotalCpu = 0L; for (ThreadInfo thread : threadInfos) { ThreadData d; if (!data.containsKey(thread.getThreadId())) { threadList.add(thread.getThreadId()); d = new ThreadData(); data.put(thread.getThreadId(), d); } else { d = data.get(thread.getThreadId()); } d.update(thread); long cpu = threadBean.getThreadCpuTime(thread.getThreadId()); d.setCpuTimeForInterval(cpu - d.getCpuTime()); // subtract last recorded cpu time d.setCpuTime(cpu); currentTotalCpu += d.getCpuTimeForInterval(); d.setUserTime(threadBean.getThreadUserTime(thread.getThreadId())); deadCheck.remove(thread.getThreadId()); } for (Long deadId : deadCheck) { data.get(deadId).setDead(true); } } public int getRowCount() { return threadList.size(); } public int getColumnCount() { return COLUMNS.length; } public String getColumnName(int column) { return COLUMNS[column]; } public ThreadData getData(int row) { return data.get(threadList.get(row)); } public synchronized Object getValueAt(int rowIndex, int columnIndex) { ThreadData d = data.get(threadList.get(rowIndex)); switch (columnIndex) { case 0: return d.getLastData().getThreadId(); case 1: return d.getLastData().getThreadName(); case 2: return (d.isDead()) ? "Dead" : d.getLastData().getThreadState(); case 3: return d; case 4: return d.getCpuTime(); case 5: return (double) d.getCpuTimeForInterval() / currentTotalCpu; case 6: return d.getUserTime(); case 7: return d.getLastData().getBlockedCount(); case 8: return d.getLastData().getBlockedTime(); case 9: return d.getLastData().getLockName(); } return null; } public static class ThreadData { boolean dead = false; ThreadInfo lastData; LinkedList<ThreadStatePoint> statePoints = new LinkedList<ThreadStatePoint>(); long cpuTimeForInterval; long cpuTime; long userTime; public void update(ThreadInfo info) { lastData = info; long oldest = System.currentTimeMillis() - TIME_HISTORY; while (statePoints.size() > 0 && statePoints.getFirst().getTime() < oldest) { statePoints.removeFirst(); } statePoints.add(new ThreadStatePoint(info.getThreadState())); } public long getCpuTimeForInterval() { return cpuTimeForInterval; } public void setCpuTimeForInterval(long cpuTimeForInterval) { this.cpuTimeForInterval = cpuTimeForInterval; } public long getCpuTime() { return cpuTime; } public void setCpuTime(long cpuTime) { this.cpuTime = cpuTime; } public long getUserTime() { return userTime; } public void setUserTime(long userTime) { this.userTime = userTime; } public ThreadInfo getLastData() { return lastData; } public LinkedList<ThreadStatePoint> getStatePoints() { return statePoints; } public boolean isDead() { return dead; } public void setDead(boolean dead) { this.dead = dead; } public static class ThreadStatePoint { private long time; private Thread.State state; public ThreadStatePoint(Thread.State state) { this.time = System.currentTimeMillis(); this.state = state; } public long getTime() { return time; } public Thread.State getState() { return state; } } } } } Index: MemoryUsageComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/MemoryUsageComponent.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** MemoryUsageComponent.java 5 Oct 2004 05:16:19 -0000 1.3 --- MemoryUsageComponent.java 12 Apr 2006 19:14:04 -0000 1.4 *************** *** 19,29 **** import org.jfree.data.time.Millisecond; import org.jfree.data.time.TimeSeries; - import org.mc4j.console.dashboard.components.NumericAttributeGraph; - import java.lang.management.MemoryUsage; - - import javax.management.MBeanAttributeInfo; import javax.management.openmbean.CompositeData; /** --- 19,27 ---- import org.jfree.data.time.Millisecond; import org.jfree.data.time.TimeSeries; import org.mc4j.console.dashboard.components.NumericAttributeGraph; + import org.mc4j.ems.connection.bean.attribute.EmsAttribute; import javax.management.openmbean.CompositeData; + import java.lang.management.MemoryUsage; /** *************** *** 55,68 **** ! for (int i = 0; i < attributeInfo.length; i++) { ! MBeanAttributeInfo info = attributeInfo[i]; ! ! String attributeName = info.getName(); ! Object value = this.server.getAttribute(this.objectName, attributeName); MemoryUsage usage = MemoryUsage.from((CompositeData) value); TimeSeries ts; ! ts = getTimeSeries(attributeName + COMMITTED); ts.add(new Millisecond(), usage.getCommitted()); --- 53,63 ---- ! for (EmsAttribute attribute : getAttributes()) { ! Object value = attribute.refresh(); //this.emsBean.getAttribute(attributeName).refresh(); MemoryUsage usage = MemoryUsage.from((CompositeData) value); TimeSeries ts; ! String attributeName = ""; ts = getTimeSeries(attributeName + COMMITTED); ts.add(new Millisecond(), usage.getCommitted()); Index: MemoryUsagePieChartComponent.java =================================================================== RCS file: /cvsroot/mc4j/mc4j/src/org/mc4j/jre15/components/MemoryUsagePieChartComponent.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** MemoryUsagePieChartComponent.java 5 Oct 2004 05:16:19 -0000 1.4 --- MemoryUsagePieChartComponent.java 12 Apr 2006 19:14:04 -0000 1.5 *************** *** 23,47 **** import org.jfree.chart.entity.ChartEntity; import org.jfree.chart.entity.PieSectionEntity; ! import org.jfree.chart.labels.StandardPieItemLabelGenerator; import org.jfree.chart.plot.PiePlot; ! import org.jfree.data.DefaultPieDataset; ! ! import org.openide.windows.IOProvider; ! ! import org.mc4j.console.bean.MBeanNode; ! import org.mc4j.console.dashboard.Dashboard; import org.mc4j.console.dashboard.components.NumericAttributeGraph; ! import org.mc4j.console.install.ExplorerUtil; import java.awt.BorderLayout; import java.lang.management.MemoryUsage; - import java.util.Iterator; import java.util.List; import java.util.Map; - import javax.management.MBeanServer; - import javax.management.ObjectName; - import javax.management.openmbean.CompositeData; - /** * You use this like an Attribute Graph Panel and it shows a --- 23,40 ---- import org.jfree.chart.entity.ChartEntity; import org.jfree.chart.entity.PieSectionEntity; ! import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.PiePlot; ! import org.jfree.data.general.DefaultPieDataset; ! import org.mc4j.console.dashboard.components.BeanListComponent; import org.mc4j.console.dashboard.components.NumericAttributeGraph; ! import org.mc4j.ems.connection.bean.EmsBean; ! import org.openide.windows.IOProvider; + import javax.management.openmbean.CompositeData; import java.awt.BorderLayout; import java.lang.management.MemoryUsage; import java.util.List; import java.util.Map; /** * You use this like an Attribute Graph Panel and it shows a *************** *** 51,55 **** * @version $Revision$($Author$ / $Date$) */ ! public class MemoryUsagePieChartComponent extends NumericAttributeGraph { public static final String COMMITTED = "Committed"; --- 44,48 ---- * @version $Revision$($Author$ / $Date$) */ ! public class MemoryUsagePieChartComponent extends NumericAttributeGraph implements BeanListComponent { public static final String COMMITTED = "Committed"; *************** *** 60,64 **** protected DefaultPieDataset pieDataset; ! protected List beanList; protected void initGraphPanel() { --- 53,57 ---- protected DefaultPieDataset pieDataset; ! protected List<EmsBean> beanList; protected void initGraphPanel() { *************** *** 66,70 **** pieDataset = new DefaultPieDataset(); ! this.chart = ChartFactory.createPieChart( "JVM Memory Pool Usage", // chart title pieDataset, // data --- 59,63 ---- pieDataset = new DefaultPieDataset(); ! this.chart = ChartFactory.createPieChart3D( "JVM Memory Pool Usage", // chart title pieDataset, // data *************** *** 73,76 **** --- 66,70 ---- false ); + // set the background color for the chart... *************** *** 78,82 **** PiePlot plot = (PiePlot) chart.getPlot(); ! plot.setLabelGenerator(new StandardPieItemLabelGenerator()); //StandardPieItemLabelGenerator spilg = new StandardPieItemLabelGenerator(); --- 72,76 ---- PiePlot plot = (PiePlot) chart.getPlot(); ! plot.setLabelGenerator(new StandardPieSectionLabelGenerator()); //StandardPieItemLabelGenerator spilg = new StandardPieItemLabelGenerator(); *************** *** 97,111 **** IOProvider.getDefault().getStdOut().println("Browsing to: " + pieSection.getSectionKey()); ! for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { try { ! MBeanNode beanNode = (MBeanNode) iterator.next(); ! ! ObjectName objectName = beanNode.getObjectName(); ! ! // TODO GH: Don't need to get this from the server every time ! String name = (String) MemoryUsagePieChartComponent.this.server.getAttribute(objectName, "Name"); if (pieSection.getSectionKey().equals(name)) { ! ExplorerUtil.browseTo(beanNode); } } catch(Exception e) { --- 91,101 ---- IOProvider.getDefault().getStdOut().println("Browsing to: " + pieSection.getSectionKey()); ! for (EmsBean bean : beanList) { try { ! String name = (String) bean.getAttribute("Name").getValue(); if (pieSection.getSectionKey().equals(name)) { ! // TODO: How to do this now? ! //ExplorerUtil.browseTo(beanNode); } } catch(Exception e) { *************** *** 133,150 **** ! for (Iterator iterator = beanList.iterator(); iterator.hasNext();) { try { - MBeanNode beanNode = (MBeanNode) iterator.next(); - ObjectName objectName = beanNode.getObjectName(); // TODO GH: Don't need to get this from the server every time ! String name = (String) this.server.getAttribute(objectName, "Name"); - Object object = this.server.getAttribute(objectName, "Usage"); - MemoryUsage usage = MemoryUsage.from((CompositeData) object); ! // Old support for beta 1 ! //usage = (MemoryUsage) this.server.getAttribute(objectName, "Usage"); pieDataset.setValue(name, usage.getUsed()); --- 123,137 ---- ! for (EmsBean bean : beanList) { try { // TODO GH: Don't need to get this from the server every time ! String name = (String) bean.getAttribute("Name").getValue(); ! Object object = bean.getAttribute("Usage").refresh(); ! ! MemoryUsage usage = MemoryUsage.from((CompositeData) object); pieDataset.setValue(name, usage.getUsed()); *************** *** 165,174 **** } ! public void setContext(Map context) { ! List beanList = (List) context.get(Dashboard.CONTEXT_MBEAN_LIST); ! this.beanList = beanList; ! this.server = (MBeanServer) context.get(Dashboard.CONTEXT_MBEAN_SERVER); reschedule(); --- 152,160 ---- } ! public void setBeanList(List<EmsBean> beanList) { this.beanList = beanList; + } ! public void setContext(Map context) { reschedule(); |