View | Details | Raw Unified | Return to bug 49545
Collapse All | Expand All

(-)src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (-8 / +234 lines)
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
}
(-)src/core/org/apache/jmeter/resources/messages_fr.properties (+6 lines)
Lines 771-776 Link Here
771
view_results_tab_request=Requ\u00EAte
771
view_results_tab_request=Requ\u00EAte
772
view_results_tab_response=Donn\u00E9es de r\u00E9ponse
772
view_results_tab_response=Donn\u00E9es de r\u00E9ponse
773
view_results_tab_sampler=R\u00E9sultat de l'\u00E9chantillon
773
view_results_tab_sampler=R\u00E9sultat de l'\u00E9chantillon
774
view_results_table_fields_key=Champ suppl\u00E9mentaire
775
view_results_table_fields_value=Valeur
776
view_results_table_headers_key=Ent\u00EAte de r\u00E9ponse
777
view_results_table_headers_value=Valeur
778
view_results_table_result_tab_parsed=D\u00E9cod\u00E9
779
view_results_table_result_tab_raw=Brut
774
view_results_thread_name=Nom d'unit\u00E9 \: 
780
view_results_thread_name=Nom d'unit\u00E9 \: 
775
view_results_title=Voir les r\u00E9sultats
781
view_results_title=Voir les r\u00E9sultats
776
view_results_tree_title=Arbre de r\u00E9sultats
782
view_results_tree_title=Arbre de r\u00E9sultats
(-)src/core/org/apache/jmeter/resources/messages.properties (+6 lines)
Lines 969-974 Link Here
969
view_results_tab_request=Request
969
view_results_tab_request=Request
970
view_results_tab_response=Response data
970
view_results_tab_response=Response data
971
view_results_tab_sampler=Sampler result
971
view_results_tab_sampler=Sampler result
972
view_results_table_fields_key=Additional field
973
view_results_table_fields_value=Value
974
view_results_table_headers_key=Response header
975
view_results_table_headers_value=Value
976
view_results_table_result_tab_parsed=Parsed
977
view_results_table_result_tab_raw=Raw
972
view_results_thread_name=Thread Name: 
978
view_results_thread_name=Thread Name: 
973
view_results_title=View Results
979
view_results_title=View Results
974
view_results_tree_title=View Results Tree
980
view_results_tree_title=View Results Tree

Return to bug 49545