1 | public class StatVisualizer extends AbstractVisualizer implements Clearable, ActionListener {↵ | | 1 | public class SummaryReport extends AbstractVisualizer implements Clearable, ActionListener {↵
|
2 | ↵ | | 2 | ↵
|
3 | private static final Logger log = LoggingManager.getLoggerForClass();↵ | | 3 | private static final Logger log = LoggingManager.getLoggerForClass();↵
|
|
4 | private final String[] COLUMNS = { ↵ | | 4 | private final String[] COLUMNS = { ↵
|
5 | JMeterUtils.getResString("sampler_label"), //$NON-NLS-1$↵ | | 5 | JMeterUtils.getResString("sampler_label"), //$NON-NLS-1$↵
|
6 | JMeterUtils.getResString("aggregate_report_count"), //$NON-NLS-1$↵ | | 6 | JMeterUtils.getResString("aggregate_report_count"), //$NON-NLS-1$↵
|
7 | JMeterUtils.getResString("average"), //$NON-NLS-1$↵ | | 7 | JMeterUtils.getResString("average"), //$NON-NLS-1$↵
|
8 | JMeterUtils.getResString("aggregate_report_median"), //$NON-NLS-1$↵ | | 8 | JMeterUtils.getResString("aggregate_report_min"), //$NON-NLS-1$↵
|
9 | JMeterUtils.getResString("aggregate_report_90%_line"), //$NON-NLS-1$↵ | | 9 | JMeterUtils.getResString("aggregate_report_max"), //$NON-NLS-1$↵
|
10 | JMeterUtils.getResString("aggregate_report_min"), //$NON-NLS-1$↵ | | 10 | JMeterUtils.getResString("aggregate_report_stddev"), //$NON-NLS-1$↵
|
11 | JMeterUtils.getResString("aggregate_report_max"), //$NON-NLS-1$↵ | | 11 | JMeterUtils.getResString("aggregate_report_error%"), //$NON-NLS-1$↵
|
12 | JMeterUtils.getResString("aggregate_report_error%"), //$NON-NLS-1$↵ | | 12 | JMeterUtils.getResString("aggregate_report_rate"), //$NON-NLS-1$↵
|
13 | JMeterUtils.getResString("aggregate_report_rate"), //$NON-NLS-1$↵ | | 13 | JMeterUtils.getResString("aggregate_report_bandwidth"), //$NON-NLS-1$↵
|
14 | JMeterUtils.getResString("aggregate_report_bandwidth") }; //$NON-NLS-1$
↵ | | 14 | JMeterUtils.getResString("average_bytes"), //$NON-NLS-1$
↵
|
| | | 15 | };
↵
|
|
15 | private final String TOTAL_ROW_LABEL ↵ | | 16 | private final String TOTAL_ROW_LABEL ↵
|
16 | = JMeterUtils.getResString("aggregate_report_total_label"); //$NON-NLS-1$↵ | | 17 | = JMeterUtils.getResString("aggregate_report_total_label"); //$NON-NLS-1$↵
|
|
17 | protected JTable myJTable;↵ | | 18 | protected JTable myJTable;↵
|
|
18 | protected JScrollPane myScrollPane;↵ | | 19 | protected JScrollPane myScrollPane;↵
|
|
19 | protected JButton saveTable = ↵ | | 20 | protected JButton saveTable = ↵
|
20 | new JButton(JMeterUtils.getResString("aggregate_graph_save_table")); //$NON-NLS-1$↵ | | 21 | new JButton(JMeterUtils.getResString("aggregate_graph_save_table")); //$NON-NLS-1$↵
|
21 | ↵ | | 22 | ↵
|
22 | private JCheckBox useGroupName = ↵ | | 23 | private JCheckBox useGroupName = ↵
|
23 | new JCheckBox(JMeterUtils.getResString("aggregate_graph_use_group_name")); //$NON-NLS-1$↵ | | 24 | new JCheckBox(JMeterUtils.getResString("aggregate_graph_use_group_name")); //$NON-NLS-1$↵
|
24 | ↵ | | 25 | ↵
|
25 | private transient ObjectTableModel model;↵ | | 26 | private transient ObjectTableModel model;↵
|
|
26 | Map tableRows = Collections.synchronizedMap(new HashMap());↵ | | 27 | Map tableRows = Collections.synchronizedMap(new HashMap());↵
|
|
27 | public StatVisualizer↵ | | 28 | // Column renderers↵
|
| | | 29 | private static final TableCellRenderer[] RENDERERS = ↵
|
| | | 30 | new TableCellRenderer[]{↵
|
| | | 31 | null, // Label↵
|
| | | 32 | null, // count↵
|
| | | 33 | null, // Mean↵
|
| | | 34 | null, // Min↵
|
| | | 35 | null, // Max↵
|
| | | 36 | new NumberRenderer("#0.00"), // Std Dev.↵
|
| | | 37 | new NumberRenderer("#0.00%"), // Error %age↵
|
| | | 38 | new RateRenderer("#.0"), // Throughpur↵
|
| | | 39 | new NumberRenderer("#0.00"), // kB/sec↵
|
| | | 40 | new NumberRenderer("#.0"), // avg. pageSize↵
|
| | | 41 | };↵
|
|
28 | () {↵ | | 42 | public SummaryReport() {↵
|
29 | super();↵ | | 43 | super();↵
|
30 | model = new ObjectTableModel(COLUMNS, ↵ | | 44 | model = new ObjectTableModel(COLUMNS,↵
|
31 | SamplingStatCalculator.class,↵ | | 45 | Calculator.class,// All rows have this class↵
|
32 | new Functor[] { ↵ | | 46 | new Functor[] { ↵
|
33 | new Functor("getLabel"), //$NON-NLS-1$↵ | | 47 | new Functor("getLabel"), //$NON-NLS-1$↵
|
34 | new Functor("getCount"), //$NON-NLS-1$↵ | | 48 | new Functor("getCount"), //$NON-NLS-1$↵
|
35 | new Functor("getMeanAsNumber"), //$NON-NLS-1$↵ | | 49 | new Functor("getMeanAsNumber"), //$NON-NLS-1$↵
|
36 | new Functor("getMedian"), //$NON-NLS-1$↵ | | 50 | new Functor("getMin"), ↵
|
37 | new Functor("getPercentPoint", //$NON-NLS-1$↵ | | |
|
38 | new Object[] { new Float(.900) }), ↵ | | |
|
39 | new Functor("getMin"),↵ | | 51 | //$NON-NLS-1$↵
|
40 | //$NON-NLS-1$↵ | | 52 | new Functor("getMax"), //$NON-NLS-1$↵
|
41 | new Functor("getMax"), //$NON-NLS-1$↵ | | 53 | new Functor("getStandardDeviation"), //$NON-NLS-1$↵
|
42 | new Functor("getErrorPercentage"), //$NON-NLS-1$↵ | | 54 | new Functor("getErrorPercentage"), //$NON-NLS-1$↵
|
43 | new Functor("getRate"), //$NON-NLS-1$↵ | | 55 | new Functor("getRate"), //$NON-NLS-1$↵
|
44 | new Functor("getKBPerSecond")↵ | | 56 | new Functor("getKBPerSecond"), //$NON-NLS-1$↵
|
45 | //$NON-NLS-1$↵ | | 57 | new Functor("getAvgPageBytes"), //$NON-NLS-1$↵
|
46 | },↵ | | 58 | },↵
|
47 | new Functor[] { null, null, null, null, null, null, null, null, null, null }, ↵ | | 59 | new Functor[] { null, null, null, null, null, null, null, null , null, null }, ↵
|
48 | new Class[] { String.class, Long.class, Long.class, Long.class, Long.class, ↵ | | 60 | new Class[] { String.class, Long.class, Long.class, Long.class, Long.class, ↵
|
49 | Long.class, Long.class, String.class, String.class, String.class });↵ | | 61 | String.class, String.class, String.class, String.class, String.class });↵
|
50 | clearData();↵ | | 62 | clearData();↵
|
51 | init();↵ | | 63 | init();↵
|
52 | }↵ | | 64 | }↵
|
|
53 | // Column renderers↵ | | |
|
54 | private static final TableCellRenderer[] RENDERERS = ↵ | | |
|
55 | new TableCellRenderer[]{↵ | | |
|
56 | null, // Label↵ | | |
|
57 | null, // count↵ | | |
|
58 | null, // Mean↵ | | |
|
59 | null, // median↵ | | |
|
60 | null, // 90%↵ | | |
|
61 | null, // Min↵ | | |
|
62 | null, // Max↵ | | |
|
63 | new NumberRenderer("#0.00%"), // Error %age //$NON-NLS-1$↵ | | |
|
64 | new RateRenderer("#.0"), // Throughput //$NON-NLS-1$↵ | | |
|
65 | new NumberRenderer("#.0"), // pageSize //$NON-NLS-1$↵ | | |
|
66 | };↵ | | |
|
| | | 65 | ↵
|
67 | public static boolean testFunctors(){↵ | | 66 | public static boolean testFunctors(){↵
|
68 | StatVisualizer instance = new StatVisualizer();↵ | | 67 | SummaryReport instance = new SummaryReport();↵
|
69 | return instance.model.checkFunctors(null,instance.getClass());↵ | | 68 | return instance.model.checkFunctors(null,instance.getClass());↵
|
70 | }↵ | | 69 | }↵
|
71 | ↵ | | 70 | ↵
|
72 | public String getLabelResource() {↵ | | 71 | public String getLabelResource() {↵
|
73 | return "aggregate_report"; //$NON-NLS-1$↵ | | 72 | return "summary_report"; //$NON-NLS-1$↵
|
74 | }↵ | | 73 | }↵
|
|
75 | public void add(SampleResult res) {↵ | | 74 | public void add(SampleResult res) {↵
|
76 | SamplingStatCalculator row = null;↵ | | 75 | Calculator row = null;↵
|
77 | final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());↵ | | 76 | final String sampleLabel = res.getSampleLabel(useGroupName.isSelected());↵
|
78 | synchronized (tableRows) {↵ | | 77 | synchronized (tableRows) {↵
|
79 | row = (SamplingStatCalculator) tableRows.get(sampleLabel);↵ | | 78 | row = (Calculator) tableRows.get(sampleLabel);↵
|
80 | if (row == null) {↵ | | 79 | if (row == null) {↵
|
81 | row = new SamplingStatCalculator(sampleLabel);↵ | | 80 | row = new Calculator(sampleLabel);↵
|
82 | tableRows.put(row.getLabel(), row);↵ | | 81 | tableRows.put(row.getLabel(), row);↵
|
83 | model.insertRow(row, model.getRowCount() - 1);↵ | | 82 | model.insertRow(row, model.getRowCount() - 1);↵
|
84 | }↵ | | 83 | }↵
|
85 | }↵ | | 84 | }↵
|
86 | /*↵ | | |
|
87 | ↵ | | 85 | /*↵
|
88 | * Synch is needed because multiple threads can update the counts.↵ | | 86 | * Synch is needed because multiple threads can update the counts.↵
|
89 | */↵ | | |
|
90 | ↵ | | 87 | */↵
|
91 | synchronized(row) { ↵ | | 88 | synchronized(row) {↵
|
92 | row.addSample(res);↵ | | 89 | row.addSample(res);↵
|
93 | }↵ | | |
|
94 | SamplingStat↵ | | 90 | }↵
|
95 | Calculator tot = (SamplingStatCalculator) tableRows.get(TOTAL_ROW_LABEL);↵ | | 91 | Calculator tot = ((Calculator) tableRows.get(TOTAL_ROW_LABEL));↵
|
96 | synchronized(tot) {↵ | | 92 | synchronized(tot) {↵
|
97 | tot.addSample(res);↵ | | 93 | tot.addSample(res);↵
|
98 | }↵ | | 94 | }↵
|
99 | model.fireTableDataChanged();↵ | | 95 | model.fireTableDataChanged();↵
|
100 | }↵ | | 96 | }↵
|
|
101 | /**↵ | | 97 | /**↵
|
102 | * Clears this visualizer and its model, and forces a repaint of the table.↵ | | 98 | * Clears this visualizer and its model, and forces a repaint of the table.↵
|
103 | */↵ | | 99 | */↵
|
104 | public void clearData() {↵ | | 100 | public void clearData() {↵
|
105 | synchronized (tableRows) {↵ | | 101 | synchronized (tableRows) {↵
|
106 | model.clearData();↵ | | 102 | model.clearData();↵
|
107 | tableRows.clear();↵ | | 103 | tableRows.clear();↵
|
108 | tableRows.put(TOTAL_ROW_LABEL, new SamplingStatCalculator(TOTAL_ROW_LABEL));↵ | | 104 | tableRows.put(TOTAL_ROW_LABEL, new Calculator(TOTAL_ROW_LABEL));↵
|
109 | model.addRow(tableRows.get(TOTAL_ROW_LABEL));↵ | | 105 | model.addRow(tableRows.get(TOTAL_ROW_LABEL));↵
|
110 | }↵ | | 106 | }↵
|
111 | }↵ | | 107 | }↵
|
|
112 | /**↵ | | 108 | /**↵
|
113 | * Main visualizer setup.↵ | | 109 | * Main visualizer setup.↵
|
114 | */↵ | | 110 | */↵
|
115 | private void init() {↵ | | 111 | private void init() {↵
|
116 | this.setLayout(new BorderLayout());↵ | | 112 | this.setLayout(new BorderLayout());↵
|
|
117 | // MAIN PANEL↵ | | 113 | // MAIN PANEL↵
|
118 | JPanel mainPanel = new JPanel();↵ | | 114 | JPanel mainPanel = new JPanel();↵
|
119 | Border margin = new EmptyBorder(10, 10, 5, 10);↵ | | 115 | Border margin = new EmptyBorder(10, 10, 5, 10);↵
|
|
120 | mainPanel.setBorder(margin);↵ | | 116 | mainPanel.setBorder(margin);↵
|
121 | mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));↵ | | 117 | mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));↵
|
|
122 | mainPanel.add(makeTitlePanel());↵ | | 118 | mainPanel.add(makeTitlePanel());↵
|
|
123 | // SortFilterModel mySortedModel =↵ | | |
|
124 | // new SortFilterModel(myStatTableModel);↵ | | |
|
125 | myJTable = new JTable(model);↵ | | 119 | myJTable = new JTable(model);↵
|
126 | myJTable.setPreferredScrollableViewportSize(new Dimension(500, 70));↵ | | 120 | myJTable.setPreferredScrollableViewportSize(new Dimension(500, 70));↵
|
127 | RendererUtils.applyRenderers(myJTable, RENDERERS);↵ | | 121 | RendererUtils.applyRenderers(myJTable, RENDERERS);↵
|
128 | myScrollPane = new JScrollPane(myJTable);↵ | | 122 | myScrollPane = new JScrollPane(myJTable);↵
|
129 | this.add(mainPanel, BorderLayout.NORTH);↵ | | 123 | this.add(mainPanel, BorderLayout.NORTH);↵
|
130 | this.add(myScrollPane, BorderLayout.CENTER);↵ | | 124 | this.add(myScrollPane, BorderLayout.CENTER);↵
|
131 | saveTable.addActionListener(this);↵ | | 125 | saveTable.addActionListener(this);↵
|
132 | JPanel opts = new JPanel();↵ | | 126 | JPanel opts = new JPanel();↵
|
133 | opts.add(useGroupName, BorderLayout.WEST);↵ | | 127 | opts.add(useGroupName, BorderLayout.WEST);↵
|
134 | opts.add(saveTable, BorderLayout.CENTER);↵ | | 128 | opts.add(saveTable, BorderLayout.CENTER);↵
|
135 | this.add(opts,BorderLayout.SOUTH);↵ | | 129 | this.add(opts,BorderLayout.SOUTH);↵
|
136 | }↵ | | 130 | }↵
|
|
137 | public void actionPerformed(ActionEvent ev) {↵ | | 131 | public void actionPerformed(ActionEvent ev) {↵
|
138 | if (ev.getSource() == saveTable) {↵ | | 132 | if (ev.getSource() == saveTable) {↵
|
139 | JFileChooser chooser = FileDialoger.promptToSaveFile("aggregate.csv");//$NON-NLS-1$↵ | | 133 | JFileChooser chooser = FileDialoger.promptToSaveFile("summary.csv");//$NON-NLS-1$↵
|
140 | if (chooser == null) {↵ | | 134 | if (chooser == null) {↵
|
141 | return;↵ | | 135 | return;↵
|
142 | }↵ | | 136 | }↵
|
143 | FileWriter writer = null;↵ | | 137 | FileWriter writer = null;↵
|
144 | try {↵ | | 138 | try {↵
|
145 | writer = new FileWriter(chooser.getSelectedFile());↵ | | 139 | writer = new FileWriter(chooser.getSelectedFile());↵
|
146 | CSVSaveService.saveCSVStats(model,writer);↵ | | 140 | CSVSaveService.saveCSVStats(model,writer);↵
|
147 | } catch (FileNotFoundException e) {↵ | | 141 | } catch (FileNotFoundException e) {↵
|
148 | log.warn(e.getMessage());↵ | | 142 | log.warn(e.getMessage());↵
|
149 | } catch (IOException e) {↵ | | 143 | } catch (IOException e) {↵
|
150 | log.warn(e.getMessage());↵ | | 144 | log.warn(e.getMessage());↵
|
151 | } finally {↵ | | 145 | } finally {↵
|
152 | JOrphanUtils.closeQuietly(writer);↵ | | 146 | JOrphanUtils.closeQuietly(writer);↵
|
153 | | | 147 |
|