Mercurial > hg > blitz_condensed
diff src/org/dancres/blitz/tools/dash/StatsFrame.java @ 0:3dc0c5604566
Initial checkin of blitz 2.0 fcs - no installer yet.
author | Dan Creswell <dan.creswell@gmail.com> |
---|---|
date | Sat, 21 Mar 2009 11:00:06 +0000 |
parents | |
children | 28c84687bdb8 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/dancres/blitz/tools/dash/StatsFrame.java Sat Mar 21 11:00:06 2009 +0000 @@ -0,0 +1,272 @@ +package org.dancres.blitz.tools.dash; + +import java.awt.Color; +import java.awt.Component; +import java.awt.BorderLayout; +import java.awt.FlowLayout; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import java.util.logging.Level; + +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.JTree; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.tree.DefaultMutableTreeNode; +import org.dancres.blitz.stats.InstanceCount; +import org.dancres.blitz.stats.MemoryStat; +import org.dancres.blitz.stats.OpStat; +import org.dancres.blitz.stats.Stat; +import org.dancres.blitz.stats.TxnStat; +import org.dancres.blitz.stats.BlockingOpsStat; +import org.dancres.blitz.stats.FieldsStat; + +public class StatsFrame extends JDialog implements UpdateableView { + private JLabel _status; + private Thread _updater; + private boolean _exitOnClose; + private StatsTableModel _allStats = new StatsTableModel(); + private Map _lookup; + private PieChart _piechart; + private ChartPanel _chart = new ChartPanel(); + private int _mode; + private boolean _closed; + //added for FieldsStats + private TypeTreeView _treeTypeView=new TypeTreeView(); + //add for Outrigger views + private Object _adminProxy; + private JFrame _frame; + + public static final int OPSTATS = 0; + public static final int INSTANCES = 1; + public static final int MEMORY = 2; + public static final int TXNS = 3; + public static final int BLOCKERS = 4; + + public StatsFrame(JFrame parent,String title, int mode,Object adminProxy) { + super(parent,title,false); + _adminProxy=adminProxy; + init(parent,title,mode); + } + public StatsFrame(JFrame parent,String title, int mode) { + //super(parent,title+ " [" + _winCount++ + "]",false); + super(parent,title,false); + init(parent,title,mode); + } + private void init(JFrame parent,String title, int mode) { + + _frame=parent; + _exitOnClose = false; + _mode = mode; + //add listener to intterupt thread on close + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent evt) { + closeWin(); + } + }); + getContentPane().add(createUI(), BorderLayout.CENTER); + getContentPane().add(createStatusBar(), BorderLayout.SOUTH); + } + private void closeWin() { + _closed = true; + dispose(); + if (_exitOnClose) { + System.exit(0); + } + } + //creates the UI for this stats type + private JComponent createUI() { + final JTable table = new JTable(_allStats); + //table.setDefaultRenderer(Object.class, new DashTableCellRenderer()); + TableColumnModel tcm = table.getColumnModel(); + if (_mode == OPSTATS) { + //remove column 1 (instance count) + TableColumn tc = tcm.getColumn(1); + tcm.removeColumn(tc); + } else if (_mode == INSTANCES) { + //remove all other columns + int nCols = table.getColumnCount(); + for (int i = 2; i < nCols; i++) { + TableColumn tc = tcm.getColumn(2); + tcm.removeColumn(tc); + } + + } + + JTabbedPane tp = new JTabbedPane(); + if (_mode == OPSTATS) { + _piechart = new PieChart(); + tp.add("Entry table", new JScrollPane(table)); + tp.add("Type tree",_treeTypeView); + tp.add("Pie chart", _piechart); + tp.add("History", _chart); + } else if (_mode == INSTANCES) { + tp.add("Entry table", new JScrollPane(table)); + tp.add("Type tree",_treeTypeView); + tp.add("History", _chart); + tp.add("Entry browser",new OutriggerViewer(this,(com.sun.jini.outrigger.JavaSpaceAdmin)_adminProxy)); + + } else if (_mode == MEMORY || _mode == TXNS || _mode == BLOCKERS) { + tp.add("History", _chart); + } + return tp; + } + private JComponent createStatusBar() { + _status = new JLabel(); + JPanel p = new JPanel(); + p.setLayout(new FlowLayout(FlowLayout.LEFT)); + p.add(_status); + return p; + } + //updateable impl + public boolean update(Stat[] stats) { + if (_closed) { + return false; + } + try { + //needs to be configurable + _lookup = new HashMap(); + long readCounter = 0; + long writeCounter = 0; + long takeCounter = 0; + long instanceCounter = 0; + double memoryUsed = 0; + long txnCounter = 0; + long blockingReads = 0; + long blockingTakes = 0; + for (int i = 0; i < stats.length; i++) { + if (stats[i] instanceof MemoryStat) { + MemoryStat ms = (MemoryStat) stats[i]; + double max = ms.getMaxMemory(); + double used = ms.getCurrentMemory(); + + memoryUsed = used; + double pc = used / max * 100; + _status.setText("Memory: " + (int) pc + "% used: " + + (int) used + " max: " + (int) max); + } else if (stats[i] instanceof OpStat) { + OpStat op = (OpStat) stats[i]; + String type = op.getType(); + int theOp = op.getOp(); + Long count = new Long(op.getCount()); + Object[] data = getData(type); + data[0] = type; + switch (theOp) { + case OpStat.READS : + data[2] = count; + readCounter += count.longValue(); + break; + case OpStat.WRITES : + data[3] = count; + writeCounter += count.longValue(); + break; + case OpStat.TAKES : + data[4] = count; + takeCounter += count.longValue(); + break; + } + } else if (stats[i] instanceof InstanceCount) { + InstanceCount myCount = (InstanceCount) stats[i]; + String type = myCount.getType(); + Object[] data = getData(type); + data[0] = type; + data[1] = new Integer(myCount.getCount()); + instanceCounter += myCount.getCount(); + } else if (stats[i] instanceof TxnStat) { + TxnStat myTxns = (TxnStat) stats[i]; + txnCounter = myTxns.getActiveTxnCount(); + } else if (stats[i] instanceof BlockingOpsStat) { + BlockingOpsStat myBlocks = (BlockingOpsStat) stats[i]; + blockingReads = myBlocks.getReaders(); + blockingTakes = myBlocks.getTakers(); + } else if (stats[i] instanceof FieldsStat) { + FieldsStat myFieldsStat = (FieldsStat) stats[i]; + //update type tree view + /* + System.out.println("--- "+myFieldsStat.getType()+" ---"); + String [] flds=myFieldsStat.getFields(); + for(int f=0;flds!=null && f<flds.length;f++){ + System.out.println(flds[f]); + } + */ + _treeTypeView.update(myFieldsStat.getType(),myFieldsStat.getFields()); + } + } + Collection col = _lookup.values(); + ArrayList list = new ArrayList(); + list.addAll(col); + _allStats.update(list); + if (_piechart != null) { + _piechart.update((int) takeCounter, (int) writeCounter, + (int) readCounter); + } + if (_mode == OPSTATS) { + //update chart with read write and take + _chart.update(new String[]{"read", "write", "take"}, + new long[]{readCounter, writeCounter, takeCounter}); + } else if (_mode == INSTANCES) { + _chart.update(new String[]{"Instance count"}, + new long[]{instanceCounter}); + } else if (_mode == MEMORY) { + _chart.update(new String[]{"Memory usage KB"}, + new long[]{(long) (memoryUsed / 1024) }); + } else if (_mode == TXNS) { + _chart.update(new String[]{"Active Txns"}, + new long[]{txnCounter}); + } else if (_mode == BLOCKERS) { + _chart.update(new String[]{"read", "take"}, + new long[]{blockingReads, blockingTakes}); + } + } catch (Exception ex) { + closeWin(); + DashBoardFrame.theLogger.log(Level.SEVERE, "Problem in update", ex); + } + return true; + } + private Object[] getData(String type) { + Object[] data = (Object[]) _lookup.get(type); + if (data == null) { + data = new Object[]{"", new Long(0), new Long(0), new Long(0), + new Long(0)}; + _lookup.put(type, data); + } + return data; + } + + /* + //adds Entry icon to table and colors to fields + private class DashTableCellRenderer extends DefaultTableCellRenderer{ + + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, int row, int column) { + + JLabel lab = (JLabel)super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); + if(column==0){ + lab.setIcon(TypeTreeView._entryIcon); + lab.setForeground(Color.blue); + }else{ + lab.setIcon(null); + lab.setForeground(Color.black); + } + + return lab; + } + } + */ +}