Lines 25-30
Link Here
|
25 |
import java.text.DateFormat; |
25 |
import java.text.DateFormat; |
26 |
import java.text.SimpleDateFormat; |
26 |
import java.text.SimpleDateFormat; |
27 |
import java.util.Date; |
27 |
import java.util.Date; |
|
|
28 |
import java.util.LinkedHashMap; |
29 |
import java.util.Set; |
28 |
|
30 |
|
29 |
import javax.swing.BorderFactory; |
31 |
import javax.swing.BorderFactory; |
30 |
import javax.swing.Icon; |
32 |
import javax.swing.Icon; |
Lines 33-50
Link Here
|
33 |
import javax.swing.JLabel; |
35 |
import javax.swing.JLabel; |
34 |
import javax.swing.JPanel; |
36 |
import javax.swing.JPanel; |
35 |
import javax.swing.JScrollPane; |
37 |
import javax.swing.JScrollPane; |
|
|
38 |
import javax.swing.JSplitPane; |
36 |
import javax.swing.JTabbedPane; |
39 |
import javax.swing.JTabbedPane; |
|
|
40 |
import javax.swing.JTable; |
37 |
import javax.swing.JTextArea; |
41 |
import javax.swing.JTextArea; |
38 |
import javax.swing.JTextPane; |
42 |
import javax.swing.JTextPane; |
|
|
43 |
import javax.swing.table.TableCellRenderer; |
39 |
import javax.swing.text.BadLocationException; |
44 |
import javax.swing.text.BadLocationException; |
40 |
import javax.swing.text.Style; |
45 |
import javax.swing.text.Style; |
41 |
import javax.swing.text.StyleConstants; |
46 |
import javax.swing.text.StyleConstants; |
42 |
import javax.swing.text.StyledDocument; |
47 |
import javax.swing.text.StyledDocument; |
43 |
|
48 |
|
44 |
import org.apache.jmeter.assertions.AssertionResult; |
49 |
import org.apache.jmeter.assertions.AssertionResult; |
|
|
50 |
import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer; |
45 |
import org.apache.jmeter.samplers.SampleResult; |
51 |
import org.apache.jmeter.samplers.SampleResult; |
46 |
import org.apache.jmeter.util.JMeterUtils; |
52 |
import org.apache.jmeter.util.JMeterUtils; |
47 |
import org.apache.jorphan.gui.GuiUtils; |
53 |
import org.apache.jorphan.gui.GuiUtils; |
|
|
54 |
import org.apache.jorphan.gui.ObjectTableModel; |
55 |
import org.apache.jorphan.gui.RendererUtils; |
56 |
import org.apache.jorphan.reflect.Functor; |
48 |
|
57 |
|
49 |
public abstract class SamplerResultTab implements ResultRenderer { |
58 |
public abstract class SamplerResultTab implements ResultRenderer { |
50 |
|
59 |
|
Lines 96-101
Link Here
|
96 |
protected boolean activateSearchExtension = true; // most current subclasses can process text |
105 |
protected boolean activateSearchExtension = true; // most current subclasses can process text |
97 |
|
106 |
|
98 |
private Color backGround; |
107 |
private Color backGround; |
|
|
108 |
|
109 |
private static final String[] COLUMNS_RESULT = new String[] { |
110 |
"", // empty for no header // $NON-NLS-1$ |
111 |
"" }; // empty for no header // $NON-NLS-1$ |
112 |
|
113 |
private static final String[] COLUMNS_HEADERS = new String[] { |
114 |
"view_results_table_headers_key", // $NON-NLS-1$ |
115 |
"view_results_table_headers_value" }; // $NON-NLS-1$ |
116 |
|
117 |
private static final String[] COLUMNS_FIELDS = new String[] { |
118 |
"view_results_table_fields_key", // $NON-NLS-1$ |
119 |
"view_results_table_fields_value" }; // $NON-NLS-1$ |
120 |
|
121 |
private ObjectTableModel resultModel = null; |
122 |
|
123 |
private ObjectTableModel resHeadersModel = null; |
124 |
|
125 |
private ObjectTableModel resFieldsModel = null; |
126 |
|
127 |
private JTable tableResult = null; |
128 |
|
129 |
private JTable tableResHeaders = null; |
130 |
|
131 |
private JTable tableResFields = null; |
132 |
|
133 |
private JTabbedPane tabbedResult = null; |
134 |
|
135 |
private JSplitPane paneParsed = null; |
136 |
|
137 |
// Result column renderers |
138 |
private static final TableCellRenderer[] RENDERERS_RESULT = new TableCellRenderer[] { |
139 |
null, // Key |
140 |
null, // Value |
141 |
}; |
142 |
|
143 |
// Response headers column renderers |
144 |
private static final TableCellRenderer[] RENDERERS_HEADERS = new TableCellRenderer[] { |
145 |
null, // Key |
146 |
null, // Value |
147 |
}; |
148 |
|
149 |
// Response fields column renderers |
150 |
private static final TableCellRenderer[] RENDERERS_FIELDS = new TableCellRenderer[] { |
151 |
null, // Key |
152 |
null, // Value |
153 |
}; |
154 |
|
155 |
public SamplerResultTab() { |
156 |
// create tables |
157 |
resultModel = new ObjectTableModel(COLUMNS_RESULT, RowResult.class, // The object used for each row |
158 |
new Functor[] { |
159 |
new Functor("getKey"), // $NON-NLS-1$ |
160 |
new Functor("getValue") }, // $NON-NLS-1$ |
161 |
new Functor[] { |
162 |
null, null }, new Class[] { |
163 |
String.class, String.class }); |
164 |
resHeadersModel = new ObjectTableModel(COLUMNS_HEADERS, |
165 |
RowResult.class, // The object used for each row |
166 |
new Functor[] { |
167 |
new Functor("getKey"), // $NON-NLS-1$ |
168 |
new Functor("getValue") }, // $NON-NLS-1$ |
169 |
new Functor[] { |
170 |
null, null }, new Class[] { |
171 |
String.class, String.class }); |
172 |
resFieldsModel = new ObjectTableModel(COLUMNS_FIELDS, RowResult.class, // The object used for each row |
173 |
new Functor[] { |
174 |
new Functor("getKey"), // $NON-NLS-1$ |
175 |
new Functor("getValue") }, // $NON-NLS-1$ |
176 |
new Functor[] { |
177 |
null, null }, new Class[] { |
178 |
String.class, String.class }); |
179 |
} |
99 |
|
180 |
|
100 |
public void clearData() { |
181 |
public void clearData() { |
101 |
results.setText("");// Response Data // $NON-NLS-1$ |
182 |
results.setText("");// Response Data // $NON-NLS-1$ |
Lines 136-141
Link Here
|
136 |
sampleDataField.setText(sd); |
217 |
sampleDataField.setText(sd); |
137 |
} |
218 |
} |
138 |
|
219 |
|
|
|
220 |
final String samplerClass = sampleResult.getClass().getName(); |
221 |
String typeResult = samplerClass.substring(1 + samplerClass.lastIndexOf('.')); |
222 |
|
139 |
StringBuilder statsBuff = new StringBuilder(200); |
223 |
StringBuilder statsBuff = new StringBuilder(200); |
140 |
statsBuff.append(JMeterUtils.getResString("view_results_thread_name")).append(sampleResult.getThreadName()).append(NL); //$NON-NLS-1$ |
224 |
statsBuff.append(JMeterUtils.getResString("view_results_thread_name")).append(sampleResult.getThreadName()).append(NL); //$NON-NLS-1$ |
141 |
String startTime = dateFormat.format(new Date(sampleResult.getStartTime())); |
225 |
String startTime = dateFormat.format(new Date(sampleResult.getStartTime())); |
Lines 180-196
Link Here
|
180 |
String responseMsgStr = sampleResult.getResponseMessage(); |
264 |
String responseMsgStr = sampleResult.getResponseMessage(); |
181 |
|
265 |
|
182 |
statsBuff.append(JMeterUtils.getResString("view_results_response_message")).append(responseMsgStr).append(NL); //$NON-NLS-1$ |
266 |
statsBuff.append(JMeterUtils.getResString("view_results_response_message")).append(responseMsgStr).append(NL); //$NON-NLS-1$ |
183 |
|
|
|
184 |
statsBuff.append(NL); |
267 |
statsBuff.append(NL); |
185 |
statsBuff.append(JMeterUtils.getResString("view_results_response_headers")).append(NL); //$NON-NLS-1$ |
268 |
statsBuff.append(JMeterUtils.getResString("view_results_response_headers")).append(NL); //$NON-NLS-1$ |
186 |
statsBuff.append(sampleResult.getResponseHeaders()).append(NL); |
269 |
statsBuff.append(sampleResult.getResponseHeaders()).append(NL); |
187 |
statsBuff.append(NL); |
270 |
statsBuff.append(NL); |
188 |
final String samplerClass = sampleResult.getClass().getName(); |
271 |
statsBuff.append(typeResult + " "+ JMeterUtils.getResString("view_results_fields")).append(NL); //$NON-NLS-1$ $NON-NLS-2$ |
189 |
statsBuff.append(samplerClass.substring(1 + samplerClass.lastIndexOf('.'))).append(" "+ JMeterUtils.getResString("view_results_fields")).append(NL); //$NON-NLS-1$ |
272 |
statsBuff.append("ContentType: ").append(sampleResult.getContentType()).append(NL); //$NON-NLS-1$ |
190 |
statsBuff.append("ContentType: ").append(sampleResult.getContentType()).append(NL); |
273 |
statsBuff.append("DataEncoding: ").append(sampleResult.getDataEncodingNoDefault()).append(NL); //$NON-NLS-1$ |
191 |
statsBuff.append("DataEncoding: ").append(sampleResult.getDataEncodingNoDefault()).append(NL); |
|
|
192 |
statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null); |
274 |
statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null); |
193 |
statsBuff = null; // Done |
275 |
statsBuff = null; // Done |
|
|
276 |
|
277 |
// Tabbed results |
278 |
resultModel.clearData(); // clear results table before filling |
279 |
// fill table |
280 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_thread_name"), sampleResult.getThreadName())); //$NON-NLS-1$ |
281 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_sample_start"), startTime)); //$NON-NLS-1$ |
282 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_load_time"), sampleResult.getTime())); //$NON-NLS-1$ |
283 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_latency"), sampleResult.getLatency())); //$NON-NLS-1$ |
284 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_size_in_bytes"), sampleResult.getBytes())); //$NON-NLS-1$ |
285 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_sample_count"), sampleResult.getSampleCount())); //$NON-NLS-1$ |
286 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_error_count"), sampleResult.getErrorCount())); //$NON-NLS-1$ |
287 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_response_code"), responseCode)); //$NON-NLS-1$ |
288 |
resultModel.addRow(new RowResult(getParsedLabel("view_results_response_message"), responseMsgStr)); //$NON-NLS-1$ |
289 |
|
290 |
resHeadersModel.clearData(); // clear response table before filling |
291 |
// Parsed response headers |
292 |
LinkedHashMap<String, String> lhm = parseResponseHeaders(sampleResult.getResponseHeaders()); |
293 |
Set<String> keySet = lhm.keySet(); |
294 |
for (String key : keySet) { |
295 |
resHeadersModel.addRow(new RowResult(key, lhm.get(key))); |
296 |
} |
297 |
|
298 |
resFieldsModel.clearData(); // clear fields table before filling |
299 |
resFieldsModel.addRow(new RowResult("Type Result ", typeResult)); //$NON-NLS-1$ |
300 |
//not sure needs I18N? |
301 |
resFieldsModel.addRow(new RowResult("ContentType", sampleResult.getContentType())); //$NON-NLS-1$ |
302 |
resFieldsModel.addRow(new RowResult("DataEncoding", sampleResult.getDataEncodingNoDefault())); //$NON-NLS-1$ |
194 |
|
303 |
|
195 |
// Reset search |
304 |
// Reset search |
196 |
if (activateSearchExtension) { |
305 |
if (activateSearchExtension) { |
Lines 215-220
Link Here
|
215 |
} |
324 |
} |
216 |
|
325 |
|
217 |
private void setupTabPaneForSampleResult() { |
326 |
private void setupTabPaneForSampleResult() { |
|
|
327 |
tabbedResult.insertTab(JMeterUtils.getResString("view_results_table_result_tab_parsed"), null, paneParsed, null, 0); //$NON-NLS-1$ |
328 |
tabbedResult.setSelectedIndex(0); // select first tab (parsed) |
218 |
// Set the title for the first tab |
329 |
// Set the title for the first tab |
219 |
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$ |
330 |
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$ |
220 |
// Add the other tabs if not present |
331 |
// Add the other tabs if not present |
Lines 231-236
Link Here
|
231 |
} |
342 |
} |
232 |
|
343 |
|
233 |
private void setupTabPaneForAssertionResult() { |
344 |
private void setupTabPaneForAssertionResult() { |
|
|
345 |
// Remove the other tabs if present |
346 |
int parsedTabIndex = tabbedResult.indexOfTab(JMeterUtils.getResString("view_results_table_result_tab_parsed")); // $NON-NLS-1$ |
347 |
if(parsedTabIndex >= 0) { |
348 |
tabbedResult.removeTabAt(parsedTabIndex); |
349 |
} |
234 |
// Set the title for the first tab |
350 |
// Set the title for the first tab |
235 |
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_assertion")); //$NON-NLS-1$ |
351 |
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_assertion")); //$NON-NLS-1$ |
236 |
// Remove the other tabs if present |
352 |
// Remove the other tabs if present |
Lines 261-269
Link Here
|
261 |
style = doc.addStyle(STYLE_SERVER_ERROR, null); |
377 |
style = doc.addStyle(STYLE_SERVER_ERROR, null); |
262 |
StyleConstants.setForeground(style, SERVER_ERROR_COLOR); |
378 |
StyleConstants.setForeground(style, SERVER_ERROR_COLOR); |
263 |
|
379 |
|
264 |
JScrollPane pane = GuiUtils.makeScrollPane(stats); |
380 |
JScrollPane paneRaw = GuiUtils.makeScrollPane(stats); |
265 |
pane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
381 |
paneRaw.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
266 |
return pane; |
382 |
|
|
|
383 |
// Set up the 1st table Result with no headers |
384 |
tableResult = new JTable(resultModel); |
385 |
RendererUtils.applyRenderers(tableResult, RENDERERS_RESULT); |
386 |
|
387 |
// Set up the 2nd table |
388 |
tableResHeaders = new JTable(resHeadersModel); |
389 |
tableResHeaders.getTableHeader().setDefaultRenderer( |
390 |
new HeaderAsPropertyRenderer()); |
391 |
RendererUtils.applyRenderers(tableResHeaders, RENDERERS_HEADERS); |
392 |
|
393 |
// Set up the 3rd table |
394 |
tableResFields = new JTable(resFieldsModel); |
395 |
tableResFields.getTableHeader().setDefaultRenderer( |
396 |
new HeaderAsPropertyRenderer()); |
397 |
RendererUtils.applyRenderers(tableResFields, RENDERERS_FIELDS); |
398 |
|
399 |
// Prepare the Results tabbed pane |
400 |
tabbedResult = new JTabbedPane(JTabbedPane.BOTTOM); |
401 |
|
402 |
// Create the split pane |
403 |
JSplitPane topSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT, |
404 |
GuiUtils.makeScrollPane(tableResHeaders), |
405 |
GuiUtils.makeScrollPane(tableResFields)); |
406 |
topSplit.setOneTouchExpandable(true); |
407 |
topSplit.setResizeWeight(0.80); |
408 |
paneParsed = new JSplitPane(JSplitPane.VERTICAL_SPLIT, |
409 |
GuiUtils.makeScrollPane(tableResult), topSplit); |
410 |
paneParsed.setOneTouchExpandable(true); |
411 |
paneParsed.setResizeWeight(0.40); |
412 |
|
413 |
// setup bottom tabs |
414 |
tabbedResult.addTab(JMeterUtils.getResString("view_results_table_result_tab_parsed"), paneParsed); //$NON-NLS-1$ |
415 |
tabbedResult.addTab(JMeterUtils.getResString("view_results_table_result_tab_raw"), paneRaw); //$NON-NLS-1$ |
416 |
|
417 |
// Hint to background color on bottom tabs (grey, not blue) |
418 |
JPanel panel = new JPanel(new BorderLayout()); |
419 |
panel.add(tabbedResult); |
420 |
return panel; |
267 |
} |
421 |
} |
268 |
|
422 |
|
269 |
private JPanel createRequestPanel() { |
423 |
private JPanel createRequestPanel() { |
Lines 327-330
Link Here
|
327 |
public void setBackgroundColor(Color backGround){ |
481 |
public void setBackgroundColor(Color backGround){ |
328 |
this.backGround = backGround; |
482 |
this.backGround = backGround; |
329 |
} |
483 |
} |
|
|
484 |
|
485 |
/** |
486 |
* To get I18N label from properties file |
487 |
* @param key in messages.properties |
488 |
* @return I18N label without (if exists) last colon ':' and spaces |
489 |
*/ |
490 |
private String getParsedLabel(String key) { |
491 |
String value = JMeterUtils.getResString(key); |
492 |
return value.replaceFirst("(?m)\\s*?:\\s*$", ""); // $NON-NLS-1$ $NON-NLS-2$ |
493 |
} |
494 |
|
495 |
/** |
496 |
* Split line into name/value pairs and remove colon ':' |
497 |
*/ |
498 |
private LinkedHashMap<String, String> parseResponseHeaders(String responseHeaders) { |
499 |
LinkedHashMap<String, String> linkedHeaders = new LinkedHashMap<String, String>(); |
500 |
String[] list = responseHeaders.split(NL); |
501 |
for (String header : list) { |
502 |
int colon = header.indexOf(':'); // $NON-NLS-1$ |
503 |
if (colon <= 0) { |
504 |
linkedHeaders.put(header, ""); // Empty value // $NON-NLS-1$ |
505 |
} else { |
506 |
linkedHeaders.put(header.substring(0, colon).trim(), header |
507 |
.substring(colon + 1).trim()); |
508 |
} |
509 |
} |
510 |
return linkedHeaders; |
511 |
} |
512 |
|
513 |
/** |
514 |
* For model table |
515 |
*/ |
516 |
public static class RowResult { |
517 |
private String key; |
518 |
|
519 |
private Object value; |
520 |
|
521 |
public RowResult(String key, Object value) { |
522 |
this.key = key; |
523 |
this.value = value; |
524 |
} |
525 |
|
526 |
/** |
527 |
* @return the key |
528 |
*/ |
529 |
public synchronized String getKey() { |
530 |
return key; |
531 |
} |
532 |
|
533 |
/** |
534 |
* @param key |
535 |
* the key to set |
536 |
*/ |
537 |
public synchronized void setKey(String key) { |
538 |
this.key = key; |
539 |
} |
540 |
|
541 |
/** |
542 |
* @return the value |
543 |
*/ |
544 |
public synchronized Object getValue() { |
545 |
return value; |
546 |
} |
547 |
|
548 |
/** |
549 |
* @param value |
550 |
* the value to set |
551 |
*/ |
552 |
public synchronized void setValue(Object value) { |
553 |
this.value = value; |
554 |
} |
555 |
} |
330 |
} |
556 |
} |