comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:3dc0c5604566
1 package org.dancres.blitz.tools.dash;
2
3 import java.awt.Color;
4 import java.awt.Component;
5 import java.awt.BorderLayout;
6 import java.awt.FlowLayout;
7 import java.awt.event.WindowAdapter;
8 import java.awt.event.WindowEvent;
9 import java.awt.event.MouseAdapter;
10 import java.awt.event.MouseEvent;
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.HashMap;
14 import java.util.Map;
15
16 import java.util.logging.Level;
17
18 import javax.swing.JComponent;
19 import javax.swing.JFrame;
20 import javax.swing.JDialog;
21 import javax.swing.JLabel;
22 import javax.swing.JOptionPane;
23 import javax.swing.JPanel;
24 import javax.swing.JScrollPane;
25 import javax.swing.JTabbedPane;
26 import javax.swing.JTable;
27 import javax.swing.JTree;
28 import javax.swing.table.TableColumn;
29 import javax.swing.table.TableColumnModel;
30 import javax.swing.table.DefaultTableCellRenderer;
31 import javax.swing.tree.DefaultMutableTreeNode;
32 import org.dancres.blitz.stats.InstanceCount;
33 import org.dancres.blitz.stats.MemoryStat;
34 import org.dancres.blitz.stats.OpStat;
35 import org.dancres.blitz.stats.Stat;
36 import org.dancres.blitz.stats.TxnStat;
37 import org.dancres.blitz.stats.BlockingOpsStat;
38 import org.dancres.blitz.stats.FieldsStat;
39
40 public class StatsFrame extends JDialog implements UpdateableView {
41 private JLabel _status;
42 private Thread _updater;
43 private boolean _exitOnClose;
44 private StatsTableModel _allStats = new StatsTableModel();
45 private Map _lookup;
46 private PieChart _piechart;
47 private ChartPanel _chart = new ChartPanel();
48 private int _mode;
49 private boolean _closed;
50 //added for FieldsStats
51 private TypeTreeView _treeTypeView=new TypeTreeView();
52 //add for Outrigger views
53 private Object _adminProxy;
54 private JFrame _frame;
55
56 public static final int OPSTATS = 0;
57 public static final int INSTANCES = 1;
58 public static final int MEMORY = 2;
59 public static final int TXNS = 3;
60 public static final int BLOCKERS = 4;
61
62 public StatsFrame(JFrame parent,String title, int mode,Object adminProxy) {
63 super(parent,title,false);
64 _adminProxy=adminProxy;
65 init(parent,title,mode);
66 }
67 public StatsFrame(JFrame parent,String title, int mode) {
68 //super(parent,title+ " [" + _winCount++ + "]",false);
69 super(parent,title,false);
70 init(parent,title,mode);
71 }
72 private void init(JFrame parent,String title, int mode) {
73
74 _frame=parent;
75 _exitOnClose = false;
76 _mode = mode;
77 //add listener to intterupt thread on close
78 addWindowListener(new WindowAdapter() {
79 public void windowClosing(WindowEvent evt) {
80 closeWin();
81 }
82 });
83 getContentPane().add(createUI(), BorderLayout.CENTER);
84 getContentPane().add(createStatusBar(), BorderLayout.SOUTH);
85 }
86 private void closeWin() {
87 _closed = true;
88 dispose();
89 if (_exitOnClose) {
90 System.exit(0);
91 }
92 }
93 //creates the UI for this stats type
94 private JComponent createUI() {
95 final JTable table = new JTable(_allStats);
96 //table.setDefaultRenderer(Object.class, new DashTableCellRenderer());
97 TableColumnModel tcm = table.getColumnModel();
98 if (_mode == OPSTATS) {
99 //remove column 1 (instance count)
100 TableColumn tc = tcm.getColumn(1);
101 tcm.removeColumn(tc);
102 } else if (_mode == INSTANCES) {
103 //remove all other columns
104 int nCols = table.getColumnCount();
105 for (int i = 2; i < nCols; i++) {
106 TableColumn tc = tcm.getColumn(2);
107 tcm.removeColumn(tc);
108 }
109
110 }
111
112 JTabbedPane tp = new JTabbedPane();
113 if (_mode == OPSTATS) {
114 _piechart = new PieChart();
115 tp.add("Entry table", new JScrollPane(table));
116 tp.add("Type tree",_treeTypeView);
117 tp.add("Pie chart", _piechart);
118 tp.add("History", _chart);
119 } else if (_mode == INSTANCES) {
120 tp.add("Entry table", new JScrollPane(table));
121 tp.add("Type tree",_treeTypeView);
122 tp.add("History", _chart);
123 tp.add("Entry browser",new OutriggerViewer(this,(com.sun.jini.outrigger.JavaSpaceAdmin)_adminProxy));
124
125 } else if (_mode == MEMORY || _mode == TXNS || _mode == BLOCKERS) {
126 tp.add("History", _chart);
127 }
128 return tp;
129 }
130 private JComponent createStatusBar() {
131 _status = new JLabel();
132 JPanel p = new JPanel();
133 p.setLayout(new FlowLayout(FlowLayout.LEFT));
134 p.add(_status);
135 return p;
136 }
137 //updateable impl
138 public boolean update(Stat[] stats) {
139 if (_closed) {
140 return false;
141 }
142 try {
143 //needs to be configurable
144 _lookup = new HashMap();
145 long readCounter = 0;
146 long writeCounter = 0;
147 long takeCounter = 0;
148 long instanceCounter = 0;
149 double memoryUsed = 0;
150 long txnCounter = 0;
151 long blockingReads = 0;
152 long blockingTakes = 0;
153 for (int i = 0; i < stats.length; i++) {
154 if (stats[i] instanceof MemoryStat) {
155 MemoryStat ms = (MemoryStat) stats[i];
156 double max = ms.getMaxMemory();
157 double used = ms.getCurrentMemory();
158
159 memoryUsed = used;
160 double pc = used / max * 100;
161 _status.setText("Memory: " + (int) pc + "% used: "
162 + (int) used + " max: " + (int) max);
163 } else if (stats[i] instanceof OpStat) {
164 OpStat op = (OpStat) stats[i];
165 String type = op.getType();
166 int theOp = op.getOp();
167 Long count = new Long(op.getCount());
168 Object[] data = getData(type);
169 data[0] = type;
170 switch (theOp) {
171 case OpStat.READS :
172 data[2] = count;
173 readCounter += count.longValue();
174 break;
175 case OpStat.WRITES :
176 data[3] = count;
177 writeCounter += count.longValue();
178 break;
179 case OpStat.TAKES :
180 data[4] = count;
181 takeCounter += count.longValue();
182 break;
183 }
184 } else if (stats[i] instanceof InstanceCount) {
185 InstanceCount myCount = (InstanceCount) stats[i];
186 String type = myCount.getType();
187 Object[] data = getData(type);
188 data[0] = type;
189 data[1] = new Integer(myCount.getCount());
190 instanceCounter += myCount.getCount();
191 } else if (stats[i] instanceof TxnStat) {
192 TxnStat myTxns = (TxnStat) stats[i];
193 txnCounter = myTxns.getActiveTxnCount();
194 } else if (stats[i] instanceof BlockingOpsStat) {
195 BlockingOpsStat myBlocks = (BlockingOpsStat) stats[i];
196 blockingReads = myBlocks.getReaders();
197 blockingTakes = myBlocks.getTakers();
198 } else if (stats[i] instanceof FieldsStat) {
199 FieldsStat myFieldsStat = (FieldsStat) stats[i];
200 //update type tree view
201 /*
202 System.out.println("--- "+myFieldsStat.getType()+" ---");
203 String [] flds=myFieldsStat.getFields();
204 for(int f=0;flds!=null && f<flds.length;f++){
205 System.out.println(flds[f]);
206 }
207 */
208 _treeTypeView.update(myFieldsStat.getType(),myFieldsStat.getFields());
209 }
210 }
211 Collection col = _lookup.values();
212 ArrayList list = new ArrayList();
213 list.addAll(col);
214 _allStats.update(list);
215 if (_piechart != null) {
216 _piechart.update((int) takeCounter, (int) writeCounter,
217 (int) readCounter);
218 }
219 if (_mode == OPSTATS) {
220 //update chart with read write and take
221 _chart.update(new String[]{"read", "write", "take"},
222 new long[]{readCounter, writeCounter, takeCounter});
223 } else if (_mode == INSTANCES) {
224 _chart.update(new String[]{"Instance count"},
225 new long[]{instanceCounter});
226 } else if (_mode == MEMORY) {
227 _chart.update(new String[]{"Memory usage KB"},
228 new long[]{(long) (memoryUsed / 1024) });
229 } else if (_mode == TXNS) {
230 _chart.update(new String[]{"Active Txns"},
231 new long[]{txnCounter});
232 } else if (_mode == BLOCKERS) {
233 _chart.update(new String[]{"read", "take"},
234 new long[]{blockingReads, blockingTakes});
235 }
236 } catch (Exception ex) {
237 closeWin();
238 DashBoardFrame.theLogger.log(Level.SEVERE, "Problem in update", ex);
239 }
240 return true;
241 }
242 private Object[] getData(String type) {
243 Object[] data = (Object[]) _lookup.get(type);
244 if (data == null) {
245 data = new Object[]{"", new Long(0), new Long(0), new Long(0),
246 new Long(0)};
247 _lookup.put(type, data);
248 }
249 return data;
250 }
251
252 /*
253 //adds Entry icon to table and colors to fields
254 private class DashTableCellRenderer extends DefaultTableCellRenderer{
255
256 public Component getTableCellRendererComponent(JTable table,
257 Object value, boolean isSelected, boolean hasFocus, int row, int column) {
258
259 JLabel lab = (JLabel)super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
260 if(column==0){
261 lab.setIcon(TypeTreeView._entryIcon);
262 lab.setForeground(Color.blue);
263 }else{
264 lab.setIcon(null);
265 lab.setForeground(Color.black);
266 }
267
268 return lab;
269 }
270 }
271 */
272 }