ASF Bugzilla – Attachment 25731 Details for
Bug 49545
Formatted (parsed) view of Sample Result in Results Tree
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch to parsed view in sample result in tree results V2
ViewResultsTree-SampleResult-Tables_V2.patch (text/plain), 18.16 KB, created by
Milamber
on 2010-07-07 20:02:31 UTC
(
hide
)
Description:
Patch to parsed view in sample result in tree results V2
Filename:
MIME Type:
Creator:
Milamber
Created:
2010-07-07 20:02:31 UTC
Size:
18.16 KB
patch
obsolete
>Index: src/core/org/apache/jmeter/resources/messages.properties >=================================================================== >--- src/core/org/apache/jmeter/resources/messages.properties (revision 960984) >+++ src/core/org/apache/jmeter/resources/messages.properties (working copy) >@@ -974,6 +974,12 @@ > view_results_tab_request=Request > view_results_tab_response=Response data > view_results_tab_sampler=Sampler result >+view_results_table_fields_key=Additional field >+view_results_table_fields_value=Value >+view_results_table_headers_key=Response header >+view_results_table_headers_value=Value >+view_results_table_result_tab_parsed=Parsed >+view_results_table_result_tab_raw=Raw > view_results_thread_name=Thread Name: > view_results_title=View Results > view_results_tree_title=View Results Tree >Index: src/core/org/apache/jmeter/resources/messages_fr.properties >=================================================================== >--- src/core/org/apache/jmeter/resources/messages_fr.properties (revision 960984) >+++ src/core/org/apache/jmeter/resources/messages_fr.properties (working copy) >@@ -771,6 +771,12 @@ > view_results_tab_request=Requ\u00EAte > view_results_tab_response=Donn\u00E9es de r\u00E9ponse > view_results_tab_sampler=R\u00E9sultat de l'\u00E9chantillon >+view_results_table_fields_key=Champ suppl\u00E9mentaire >+view_results_table_fields_value=Valeur >+view_results_table_headers_key=Ent\u00EAte de r\u00E9ponse >+view_results_table_headers_value=Valeur >+view_results_table_result_tab_parsed=D\u00E9cod\u00E9 >+view_results_table_result_tab_raw=Brut > view_results_thread_name=Nom d'unit\u00E9 \: > view_results_title=Voir les r\u00E9sultats > view_results_tree_title=Arbre de r\u00E9sultats >Index: src/components/org/apache/jmeter/visualizers/SamplerResultTab.java >=================================================================== >--- src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (revision 960984) >+++ src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (working copy) >@@ -25,6 +25,8 @@ > import java.text.DateFormat; > import java.text.SimpleDateFormat; > import java.util.Date; >+import java.util.LinkedHashMap; >+import java.util.Set; > > import javax.swing.BorderFactory; > import javax.swing.Icon; >@@ -33,18 +35,26 @@ > import javax.swing.JLabel; > import javax.swing.JPanel; > import javax.swing.JScrollPane; >+import javax.swing.JSplitPane; > import javax.swing.JTabbedPane; >+import javax.swing.JTable; > import javax.swing.JTextArea; > import javax.swing.JTextPane; >+import javax.swing.table.TableCellRenderer; >+import javax.swing.table.TableColumn; > import javax.swing.text.BadLocationException; > import javax.swing.text.Style; > import javax.swing.text.StyleConstants; > import javax.swing.text.StyledDocument; > > import org.apache.jmeter.assertions.AssertionResult; >+import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer; > import org.apache.jmeter.samplers.SampleResult; > import org.apache.jmeter.util.JMeterUtils; > import org.apache.jorphan.gui.GuiUtils; >+import org.apache.jorphan.gui.ObjectTableModel; >+import org.apache.jorphan.gui.RendererUtils; >+import org.apache.jorphan.reflect.Functor; > > public abstract class SamplerResultTab implements ResultRenderer { > >@@ -96,12 +106,91 @@ > protected boolean activateSearchExtension = true; // most current subclasses can process text > > private Color backGround; >+ >+ private static final String[] COLUMNS_RESULT = new String[] { >+ " ", // one space for blank header // $NON-NLS-1$ >+ " " }; // one space for blank header // $NON-NLS-1$ >+ >+ private static final String[] COLUMNS_HEADERS = new String[] { >+ "view_results_table_headers_key", // $NON-NLS-1$ >+ "view_results_table_headers_value" }; // $NON-NLS-1$ >+ >+ private static final String[] COLUMNS_FIELDS = new String[] { >+ "view_results_table_fields_key", // $NON-NLS-1$ >+ "view_results_table_fields_value" }; // $NON-NLS-1$ >+ >+ private ObjectTableModel resultModel = null; >+ >+ private ObjectTableModel resHeadersModel = null; >+ >+ private ObjectTableModel resFieldsModel = null; >+ >+ private JTable tableResult = null; >+ >+ private JTable tableResHeaders = null; >+ >+ private JTable tableResFields = null; >+ >+ private JTabbedPane tabbedResult = null; >+ >+ private JScrollPane paneRaw = null; >+ >+ private JSplitPane paneParsed = null; >+ >+ // to save last select tab (raw/parsed) >+ private int lastResultTabIndex= 0; > >+ // Result column renderers >+ private static final TableCellRenderer[] RENDERERS_RESULT = new TableCellRenderer[] { >+ null, // Key >+ null, // Value >+ }; >+ >+ // Response headers column renderers >+ private static final TableCellRenderer[] RENDERERS_HEADERS = new TableCellRenderer[] { >+ null, // Key >+ null, // Value >+ }; >+ >+ // Response fields column renderers >+ private static final TableCellRenderer[] RENDERERS_FIELDS = new TableCellRenderer[] { >+ null, // Key >+ null, // Value >+ }; >+ >+ public SamplerResultTab() { >+ // create tables >+ resultModel = new ObjectTableModel(COLUMNS_RESULT, RowResult.class, // The object used for each row >+ new Functor[] { >+ new Functor("getKey"), // $NON-NLS-1$ >+ new Functor("getValue") }, // $NON-NLS-1$ >+ new Functor[] { >+ null, null }, new Class[] { >+ String.class, String.class }); >+ resHeadersModel = new ObjectTableModel(COLUMNS_HEADERS, >+ RowResult.class, // The object used for each row >+ new Functor[] { >+ new Functor("getKey"), // $NON-NLS-1$ >+ new Functor("getValue") }, // $NON-NLS-1$ >+ new Functor[] { >+ null, null }, new Class[] { >+ String.class, String.class }); >+ resFieldsModel = new ObjectTableModel(COLUMNS_FIELDS, RowResult.class, // The object used for each row >+ new Functor[] { >+ new Functor("getKey"), // $NON-NLS-1$ >+ new Functor("getValue") }, // $NON-NLS-1$ >+ new Functor[] { >+ null, null }, new Class[] { >+ String.class, String.class }); >+ } >+ >+ @Override > public void clearData() { > results.setText("");// Response Data // $NON-NLS-1$ > sampleDataField.setText("");// Request Data // $NON-NLS-1$ > } > >+ @Override > public void init() { > rightSide.addTab(JMeterUtils.getResString("view_results_tab_sampler"), createResponseMetadataPanel()); // $NON-NLS-1$ > // Create the panels for the other tabs >@@ -109,6 +198,7 @@ > resultsPane = createResponseDataPanel(); > } > >+ @Override > public void setupTabPane() { > StyledDocument statsDoc = stats.getStyledDocument(); > try { >@@ -136,6 +226,9 @@ > sampleDataField.setText(sd); > } > >+ final String samplerClass = sampleResult.getClass().getName(); >+ String typeResult = samplerClass.substring(1 + samplerClass.lastIndexOf('.')); >+ > StringBuilder statsBuff = new StringBuilder(200); > statsBuff.append(JMeterUtils.getResString("view_results_thread_name")).append(sampleResult.getThreadName()).append(NL); //$NON-NLS-1$ > String startTime = dateFormat.format(new Date(sampleResult.getStartTime())); >@@ -180,18 +273,43 @@ > String responseMsgStr = sampleResult.getResponseMessage(); > > statsBuff.append(JMeterUtils.getResString("view_results_response_message")).append(responseMsgStr).append(NL); //$NON-NLS-1$ >- > statsBuff.append(NL); > statsBuff.append(JMeterUtils.getResString("view_results_response_headers")).append(NL); //$NON-NLS-1$ > statsBuff.append(sampleResult.getResponseHeaders()).append(NL); > statsBuff.append(NL); >- final String samplerClass = sampleResult.getClass().getName(); >- statsBuff.append(samplerClass.substring(1 + samplerClass.lastIndexOf('.'))).append(" "+ JMeterUtils.getResString("view_results_fields")).append(NL); //$NON-NLS-1$ >- statsBuff.append("ContentType: ").append(sampleResult.getContentType()).append(NL); >- statsBuff.append("DataEncoding: ").append(sampleResult.getDataEncodingNoDefault()).append(NL); >+ statsBuff.append(typeResult + " "+ JMeterUtils.getResString("view_results_fields")).append(NL); //$NON-NLS-1$ $NON-NLS-2$ >+ statsBuff.append("ContentType: ").append(sampleResult.getContentType()).append(NL); //$NON-NLS-1$ >+ statsBuff.append("DataEncoding: ").append(sampleResult.getDataEncodingNoDefault()).append(NL); //$NON-NLS-1$ > statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null); > statsBuff = null; // Done >- >+ >+ // Tabbed results >+ resultModel.clearData(); // clear results table before filling >+ // fill table >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_thread_name"), sampleResult.getThreadName())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_sample_start"), startTime)); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_load_time"), sampleResult.getTime())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_latency"), sampleResult.getLatency())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_size_in_bytes"), sampleResult.getBytes())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_sample_count"), sampleResult.getSampleCount())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_error_count"), sampleResult.getErrorCount())); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_response_code"), responseCode)); //$NON-NLS-1$ >+ resultModel.addRow(new RowResult(getParsedLabel("view_results_response_message"), responseMsgStr)); //$NON-NLS-1$ >+ >+ resHeadersModel.clearData(); // clear response table before filling >+ // Parsed response headers >+ LinkedHashMap<String, String> lhm = parseResponseHeaders(sampleResult.getResponseHeaders()); >+ Set<String> keySet = lhm.keySet(); >+ for (String key : keySet) { >+ resHeadersModel.addRow(new RowResult(key, lhm.get(key))); >+ } >+ >+ resFieldsModel.clearData(); // clear fields table before filling >+ resFieldsModel.addRow(new RowResult("Type Result ", typeResult)); //$NON-NLS-1$ >+ //not sure needs I18N? >+ resFieldsModel.addRow(new RowResult("ContentType", sampleResult.getContentType())); //$NON-NLS-1$ >+ resFieldsModel.addRow(new RowResult("DataEncoding", sampleResult.getDataEncodingNoDefault())); //$NON-NLS-1$ >+ > // Reset search > if (activateSearchExtension) { > searchTextExtension.resetTextToFind(); >@@ -215,6 +333,11 @@ > } > > private void setupTabPaneForSampleResult() { >+ // restore tabbed pane parsed if needed >+ if (tabbedResult.getTabCount() < 2) { >+ tabbedResult.insertTab(JMeterUtils.getResString("view_results_table_result_tab_parsed"), null, paneParsed, null, 1); //$NON-NLS-1$ >+ tabbedResult.setSelectedIndex(lastResultTabIndex); // select last tab >+ } > // Set the title for the first tab > rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$ > // Add the other tabs if not present >@@ -229,8 +352,16 @@ > rightSide.setSelectedIndex(lastSelectedTab); > } > } >- >+ > private void setupTabPaneForAssertionResult() { >+ // Remove the other (parsed) tab if present >+ if (tabbedResult.getTabCount() >= 2) { >+ lastResultTabIndex = tabbedResult.getSelectedIndex(); >+ int parsedTabIndex = tabbedResult.indexOfTab(JMeterUtils.getResString("view_results_table_result_tab_parsed")); // $NON-NLS-1$ >+ if(parsedTabIndex >= 0) { >+ tabbedResult.removeTabAt(parsedTabIndex); >+ } >+ } > // Set the title for the first tab > rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_assertion")); //$NON-NLS-1$ > // Remove the other tabs if present >@@ -261,9 +392,51 @@ > style = doc.addStyle(STYLE_SERVER_ERROR, null); > StyleConstants.setForeground(style, SERVER_ERROR_COLOR); > >- JScrollPane pane = GuiUtils.makeScrollPane(stats); >- pane.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); >- return pane; >+ paneRaw = GuiUtils.makeScrollPane(stats); >+ paneRaw.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); >+ >+ // Set up the 1st table Result with empty headers >+ tableResult = new JTable(resultModel); >+ setFirstColumnPreferredSize(tableResult); >+ RendererUtils.applyRenderers(tableResult, RENDERERS_RESULT); >+ >+ // Set up the 2nd table >+ tableResHeaders = new JTable(resHeadersModel); >+ setFirstColumnPreferredSize(tableResHeaders); >+ tableResHeaders.getTableHeader().setDefaultRenderer( >+ new HeaderAsPropertyRenderer()); >+ RendererUtils.applyRenderers(tableResHeaders, RENDERERS_HEADERS); >+ >+ // Set up the 3rd table >+ tableResFields = new JTable(resFieldsModel); >+ setFirstColumnPreferredSize(tableResFields); >+ tableResFields.getTableHeader().setDefaultRenderer( >+ new HeaderAsPropertyRenderer()); >+ RendererUtils.applyRenderers(tableResFields, RENDERERS_FIELDS); >+ >+ // Prepare the Results tabbed pane >+ tabbedResult = new JTabbedPane(JTabbedPane.BOTTOM); >+ >+ // Create the split pane >+ JSplitPane topSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT, >+ GuiUtils.makeScrollPane(tableResHeaders), >+ GuiUtils.makeScrollPane(tableResFields)); >+ topSplit.setOneTouchExpandable(true); >+ topSplit.setResizeWeight(0.80); // set split ratio >+ >+ paneParsed = new JSplitPane(JSplitPane.VERTICAL_SPLIT, >+ GuiUtils.makeScrollPane(tableResult), topSplit); >+ paneParsed.setOneTouchExpandable(true); >+ paneParsed.setResizeWeight(0.40); // set split ratio >+ >+ // setup bottom tabs, first Raw, second Parsed >+ tabbedResult.addTab(JMeterUtils.getResString("view_results_table_result_tab_raw"), paneRaw); //$NON-NLS-1$ >+ tabbedResult.addTab(JMeterUtils.getResString("view_results_table_result_tab_parsed"), paneParsed); //$NON-NLS-1$ >+ >+ // Hint to background color on bottom tabs (grey, not blue) >+ JPanel panel = new JPanel(new BorderLayout()); >+ panel.add(tabbedResult); >+ return panel; > } > > private JPanel createRequestPanel() { >@@ -305,18 +478,22 @@ > resultsScrollPane.setViewportView(imageLabel); > } > >+ @Override > public synchronized void setSamplerResult(Object sample) { > userObject = sample; > } > >+ @Override > public synchronized void setRightSide(JTabbedPane side) { > rightSide = side; > } > >+ @Override > public void setLastSelectedTab(int index) { > lastSelectedTab = index; > } > >+ @Override > public void renderImage(SampleResult sampleResult) { > byte[] responseBytes = sampleResult.getResponseData(); > if (responseBytes != null) { >@@ -324,7 +501,86 @@ > } > } > >+ @Override > public void setBackgroundColor(Color backGround){ > this.backGround = backGround; > } >+ >+ /** >+ * To get I18N label from properties file >+ * @param key in messages.properties >+ * @return I18N label without (if exists) last colon ':' and spaces >+ */ >+ private String getParsedLabel(String key) { >+ String value = JMeterUtils.getResString(key); >+ return value.replaceFirst("(?m)\\s*?:\\s*$", ""); // $NON-NLS-1$ $NON-NLS-2$ >+ } >+ >+ private void setFirstColumnPreferredSize(JTable table) { >+ TableColumn column = table.getColumnModel().getColumn(0); >+ column.setMaxWidth(300); >+ column.setPreferredWidth(180); >+ } >+ >+ /** >+ * Split line into name/value pairs and remove colon ':' >+ */ >+ private LinkedHashMap<String, String> parseResponseHeaders(String responseHeaders) { >+ LinkedHashMap<String, String> linkedHeaders = new LinkedHashMap<String, String>(); >+ String[] list = responseHeaders.split(NL); >+ for (String header : list) { >+ int colon = header.indexOf(':'); // $NON-NLS-1$ >+ if (colon <= 0) { >+ linkedHeaders.put(header, ""); // Empty value // $NON-NLS-1$ >+ } else { >+ linkedHeaders.put(header.substring(0, colon).trim(), header >+ .substring(colon + 1).trim()); >+ } >+ } >+ return linkedHeaders; >+ } >+ >+ /** >+ * For model table >+ */ >+ public static class RowResult { >+ private String key; >+ >+ private Object value; >+ >+ public RowResult(String key, Object value) { >+ this.key = key; >+ this.value = value; >+ } >+ >+ /** >+ * @return the key >+ */ >+ public synchronized String getKey() { >+ return key; >+ } >+ >+ /** >+ * @param key >+ * the key to set >+ */ >+ public synchronized void setKey(String key) { >+ this.key = key; >+ } >+ >+ /** >+ * @return the value >+ */ >+ public synchronized Object getValue() { >+ return value; >+ } >+ >+ /** >+ * @param value >+ * the value to set >+ */ >+ public synchronized void setValue(Object value) { >+ this.value = value; >+ } >+ } > } >\ No newline at end of file >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 49545
:
25688
|
25689
|
25690
| 25731 |
25732