Mercurial > hg > blitz_condensed
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 } |