You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@jakarta.apache.org by mi...@apache.org on 2010/10/12 00:50:55 UTC
svn commit: r1021539 - in /jakarta/jmeter/trunk:
src/components/org/apache/jmeter/visualizers/
src/core/org/apache/jmeter/resources/ src/core/org/apache/jmeter/util/
src/protocol/http/org/apache/jmeter/protocol/http/visualizers/ xdocs/
Author: milamber
Date: Mon Oct 11 22:50:55 2010
New Revision: 1021539
URL: http://svn.apache.org/viewvc?rev=1021539&view=rev
Log:
Bug 37156 - Formatted view of Request in Results Tree
Added:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java (with props)
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/
jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java (with props)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
jakarta/jmeter/trunk/xdocs/changes.xml
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java?rev=1021539&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java Mon Oct 11 22:50:55 2010
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.visualizers;
+
+import java.awt.BorderLayout;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * Manipulate all classes which implements request view panel interface
+ * and return a super panel with a bottom tab list of this classes
+ *
+ */
+public class RequestPanel {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ private LinkedList<RequestView> listRequestView;
+
+ private JTabbedPane tabbedRequest;
+
+ private JPanel panel;
+
+ /**
+ * Find and instanciate all class that extend RequestView
+ * and Create Request Panel
+ */
+ public RequestPanel() {
+ listRequestView = new LinkedList<RequestView>();
+ List<String> classesToAdd = Collections.<String> emptyList();
+ try {
+ classesToAdd = JMeterUtils.findClassesThatExtend(RequestView.class);
+ } catch (IOException e1) {
+ // ignored
+ }
+ String rawTab = JMeterUtils.getResString(RequestViewRaw.KEY_LABEL); // $NON-NLS-1$
+ Object rawObject = null;
+ for (String clazz : classesToAdd) {
+ try {
+ // Instantiate requestview classes
+ final RequestView requestView = (RequestView) Class.forName(clazz).newInstance();
+ if (rawTab.equals(requestView.getLabel())) {
+ rawObject = requestView; // use later
+ } else {
+ listRequestView.add(requestView);
+ }
+ } catch (Exception e) {
+ log.warn("Error in load result render:" + clazz, e); // $NON-NLS-1$
+ }
+ }
+ // place raw tab in first position (first tab)
+ if (rawObject != null) {
+ listRequestView.addFirst((RequestView) rawObject);
+ }
+
+ // Prepare the Request tabbed pane
+ tabbedRequest = new JTabbedPane(JTabbedPane.BOTTOM);
+ for (RequestView requestView : listRequestView) {
+ requestView.init();
+ tabbedRequest.addTab(requestView.getLabel(), requestView.getPanel());
+ }
+
+ // Hint to background color on bottom tabs (grey, not blue)
+ panel = new JPanel(new BorderLayout());
+ panel.add(tabbedRequest);
+ }
+
+ /**
+ * Clear data in all request view
+ */
+ public void clearData() {
+ for (RequestView requestView : listRequestView) {
+ requestView.clearData();
+ }
+ }
+
+ /**
+ * Put SamplerResult in all request view
+ *
+ * @param samplerResult
+ */
+ public void setSamplerResult(SampleResult samplerResult) {
+ for (RequestView requestView : listRequestView) {
+ requestView.setSamplerResult(samplerResult);
+ }
+ }
+
+ /**
+ * @return a tabbed panel for view request
+ */
+ public JPanel getPanel() {
+ return panel;
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestPanel.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java?rev=1021539&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java Mon Oct 11 22:50:55 2010
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.visualizers;
+
+import javax.swing.JPanel;
+
+/**
+ * Interface for request panel in View Results Tree
+ * All classes which implements this interface is display
+ * on bottom tab in request panel
+ *
+ */
+public interface RequestView {
+
+ /**
+ * Init the panel
+ */
+ public void init();
+
+ /**
+ * Clear all data in panel
+ */
+ public void clearData();
+
+ /**
+ * Put the result bean to display in panel
+ * @param userObject result to display
+ */
+ public void setSamplerResult(Object userObject);
+
+ /**
+ * Get the panel
+ * @return the panel viewer
+ */
+ public JPanel getPanel();
+
+ /**
+ * Get the label. Use as name for bottom tab
+ * @return the label's panel
+ */
+ public String getLabel(); // return label
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestView.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java?rev=1021539&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java Mon Oct 11 22:50:55 2010
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.visualizers;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.GuiUtils;
+
+/**
+ * (historical) Panel to view request data
+ *
+ */
+public class RequestViewRaw implements RequestView {
+
+ public static String KEY_LABEL = "view_results_table_request_tab_raw"; //$NON-NLS-1$
+
+ private JTextArea sampleDataField;
+
+ private JPanel paneRaw; /** request pane content */
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#init()
+ */
+ public void init() {
+ paneRaw = new JPanel(new BorderLayout(0, 5));
+ sampleDataField = new JTextArea();
+ sampleDataField.setEditable(false);
+ sampleDataField.setLineWrap(true);
+ sampleDataField.setWrapStyleWord(true);
+
+ paneRaw.add(GuiUtils.makeScrollPane(sampleDataField));
+
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#clearData()
+ */
+ public void clearData() {
+ sampleDataField.setText(""); //$NON-NLS-1$
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#setSamplerResult(java.lang.Object)
+ */
+ public void setSamplerResult(Object objectResult) {
+
+ if (objectResult instanceof SampleResult) {
+ SampleResult sampleResult = (SampleResult) objectResult;
+ // load time label
+ String sd = sampleResult.getSamplerData();
+ if (sd != null) {
+ String rh = sampleResult.getRequestHeaders();
+ // Don't display Request headers label if rh is null or empty
+ if (rh != null && rh.length() > 0) {
+ StringBuilder sb = new StringBuilder(sd.length()
+ + rh.length() + 20);
+ sb.append(sd);
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(JMeterUtils.getResString("view_results_request_headers")); //$NON-NLS-1$
+ sb.append("\n"); //$NON-NLS-1$
+ sb.append(rh);
+ sd = sb.toString();
+ }
+ sampleDataField.setText(sd);
+ } else {
+ // add a message when no request data (ex. Java request)
+ sampleDataField.setText(JMeterUtils
+ .getResString("view_results_table_request_raw_nodata")); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#getPanel()
+ */
+ public JPanel getPanel() {
+ return paneRaw;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#getLabel()
+ */
+ public String getLabel() {
+ return JMeterUtils.getResString(KEY_LABEL);
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RequestViewRaw.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java?rev=1021539&r1=1021538&r2=1021539&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (original)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java Mon Oct 11 22:50:55 2010
@@ -38,7 +38,6 @@ 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;
@@ -57,6 +56,10 @@ import org.apache.jorphan.gui.ObjectTabl
import org.apache.jorphan.gui.RendererUtils;
import org.apache.jorphan.reflect.Functor;
+/**
+ * Right side in View Results Tree
+ *
+ */
public abstract class SamplerResultTab implements ResultRenderer {
// N.B. these are not multi-threaded, so don't make it static
@@ -71,6 +74,8 @@ public abstract class SamplerResultTab i
public static final Color REDIRECT_COLOR = Color.green;
protected static final String TEXT_COMMAND = "text"; // $NON-NLS-1$
+
+ protected static final String REQUEST_VIEW_COMMAND = "change_request_view"; // $NON-NLS-1$
private static final String STYLE_SERVER_ERROR = "ServerError"; // $NON-NLS-1$
@@ -86,9 +91,7 @@ public abstract class SamplerResultTab i
private JLabel imageLabel;
- private JPanel requestPane;
-
- private JTextArea sampleDataField; /** request pane content */
+ private RequestPanel requestPanel; /** request pane content */
protected JTabbedPane rightSide; /** holds the tabbed panes */
@@ -187,13 +190,13 @@ public abstract class SamplerResultTab i
public void clearData() {
results.setText("");// Response Data // $NON-NLS-1$
- sampleDataField.setText("");// Request Data // $NON-NLS-1$
+ requestPanel.clearData();// Request Data // $NON-NLS-1$
}
public void init() {
rightSide.addTab(JMeterUtils.getResString("view_results_tab_sampler"), createResponseMetadataPanel()); // $NON-NLS-1$
// Create the panels for the other tabs
- requestPane = createRequestPanel();
+ requestPanel = new RequestPanel();
resultsPane = createResponseDataPanel();
}
@@ -201,29 +204,15 @@ public abstract class SamplerResultTab i
public void setupTabPane() {
StyledDocument statsDoc = stats.getStyledDocument();
try {
+ // Clear data before display a new
statsDoc.remove(0, statsDoc.getLength());
- sampleDataField.setText(""); // $NON-NLS-1$
+ requestPanel.clearData();
results.setText(""); // $NON-NLS-1$
if (userObject instanceof SampleResult) {
sampleResult = (SampleResult) userObject;
// We are displaying a SampleResult
setupTabPaneForSampleResult();
-
- // load time label
- String sd = sampleResult.getSamplerData();
- if (sd != null) {
- String rh = sampleResult.getRequestHeaders();
- if (rh != null) {
- StringBuilder sb = new StringBuilder(sd.length() + rh.length() + 20);
- sb.append(sd);
- sb.append("\n"); //$NON-NLS-1$
- sb.append(JMeterUtils.getResString("view_results_request_headers")); //$NON-NLS-1$
- sb.append("\n"); //$NON-NLS-1$
- sb.append(rh);
- sd = sb.toString();
- }
- sampleDataField.setText(sd);
- }
+ requestPanel.setSamplerResult(sampleResult);
final String samplerClass = sampleResult.getClass().getName();
String typeResult = samplerClass.substring(1 + samplerClass.lastIndexOf('.'));
@@ -285,19 +274,19 @@ public abstract class SamplerResultTab i
// 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$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_thread_name"), sampleResult.getThreadName())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_sample_start"), startTime)); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_load_time"), sampleResult.getTime())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_latency"), sampleResult.getLatency())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_size_in_bytes"), sampleResult.getBytes())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_sample_count"), sampleResult.getSampleCount())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_error_count"), sampleResult.getErrorCount())); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.getParsedLabel("view_results_response_code"), responseCode)); //$NON-NLS-1$
+ resultModel.addRow(new RowResult(JMeterUtils.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());
+ LinkedHashMap<String, String> lhm = JMeterUtils.parseHeaders(sampleResult.getResponseHeaders());
Set<String> keySet = lhm.keySet();
for (String key : keySet) {
resHeadersModel.addRow(new RowResult(key, lhm.get(key)));
@@ -341,7 +330,7 @@ public abstract class SamplerResultTab i
rightSide.setTitleAt(0, JMeterUtils.getResString("view_results_tab_sampler")); //$NON-NLS-1$
// Add the other tabs if not present
if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")) < 0) { // $NON-NLS-1$
- rightSide.addTab(JMeterUtils.getResString("view_results_tab_request"), requestPane); // $NON-NLS-1$
+ rightSide.addTab(JMeterUtils.getResString("view_results_tab_request"), requestPanel.getPanel()); // $NON-NLS-1$
}
if(rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")) < 0) { // $NON-NLS-1$
rightSide.addTab(JMeterUtils.getResString("view_results_tab_response"), resultsPane); // $NON-NLS-1$
@@ -444,17 +433,6 @@ public abstract class SamplerResultTab i
return panel;
}
- private JPanel createRequestPanel() {
- sampleDataField = new JTextArea();
- sampleDataField.setEditable(false);
- sampleDataField.setLineWrap(true);
- sampleDataField.setWrapStyleWord(true);
-
- JPanel pane = new JPanel(new BorderLayout(0, 5));
- pane.add(GuiUtils.makeScrollPane(sampleDataField));
- return pane;
- }
-
private JPanel createResponseDataPanel() {
results = new JEditorPane();
results.setEditable(false);
@@ -506,39 +484,11 @@ public abstract class SamplerResultTab i
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
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1021539&r1=1021538&r2=1021539&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Mon Oct 11 22:50:55 2010
@@ -989,6 +989,20 @@ view_results_table_fields_key=Additional
view_results_table_fields_value=Value
view_results_table_headers_key=Response header
view_results_table_headers_value=Value
+view_results_table_request_headers_key=Request header
+view_results_table_request_headers_value=Value
+view_results_table_request_http_cookie=Cookie
+view_results_table_request_http_host=Host
+view_results_table_request_http_method=Method
+view_results_table_request_http_nohttp=No HTTP Sample
+view_results_table_request_http_path=Path
+view_results_table_request_http_port=Port
+view_results_table_request_http_protocol=Protocol
+view_results_table_request_raw_nodata=No data to display
+view_results_table_request_params_key=Parameter name
+view_results_table_request_params_value=Value
+view_results_table_request_tab_http=HTTP
+view_results_table_request_tab_raw=Raw
view_results_table_result_tab_parsed=Parsed
view_results_table_result_tab_raw=Raw
view_results_thread_name=Thread Name:
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1021539&r1=1021538&r2=1021539&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Mon Oct 11 22:50:55 2010
@@ -886,6 +886,20 @@ view_results_table_fields_key=Champ supp
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_request_headers_key=Ent\u00EAte de r\u00E9qu\u00EAte
+view_results_table_request_headers_value=Valeur
+view_results_table_request_http_cookie=Cookie
+view_results_table_request_http_host=H\u00F4te
+view_results_table_request_http_method=M\u00E9thode
+view_results_table_request_http_nohttp=N'est pas un \u00E9chantillon HTTP
+view_results_table_request_http_path=Cheming
+view_results_table_request_http_port=Port
+view_results_table_request_http_protocol=Protocole
+view_results_table_request_raw_nodata=Pas de donn\u00E9es \u00E0 afficher
+view_results_table_request_params_key=Nom de param\u00E8tre
+view_results_table_request_params_value=Valeur
+view_results_table_request_tab_http=HTTP
+view_results_table_request_tab_raw=Brut
view_results_table_result_tab_parsed=D\u00E9cod\u00E9
view_results_table_result_tab_raw=Brut
view_results_thread_name=Nom d'unit\u00E9 \:
Modified: jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java?rev=1021539&r1=1021538&r2=1021539&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java (original)
+++ jakarta/jmeter/trunk/src/core/org/apache/jmeter/util/JMeterUtils.java Mon Oct 11 22:50:55 2010
@@ -33,6 +33,7 @@ import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
@@ -46,7 +47,6 @@ import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
-// import javax.xml.parsers.SAXParserFactory;
import org.apache.commons.io.IOUtils;
import org.apache.jmeter.gui.GuiPackage;
@@ -464,6 +464,18 @@ public class JMeterUtils implements Unit
}
/**
+ * To get I18N label from properties file
+ *
+ * @param key
+ * in messages.properties
+ * @return I18N label without (if exists) last colon ':' and spaces
+ */
+ public static String getParsedLabel(String key) {
+ String value = JMeterUtils.getResString(key);
+ return value.replaceFirst("(?m)\\s*?:\\s*$", ""); // $NON-NLS-1$ $NON-NLS-2$
+ }
+
+ /**
* Get the locale name as a resource.
* Does not log an error if the resource does not exist.
* This is needed to support additional locales, as they won't be in existing messages files.
@@ -1202,4 +1214,27 @@ public class JMeterUtils implements Unit
localHostName=localHost.getHostName();
localHostFullName=localHost.getCanonicalHostName();
}
+
+ /**
+ * Split line into name/value pairs and remove colon ':'
+ *
+ * @param headers
+ * multi-line string headers
+ * @return a map name/value for each header
+ */
+ public static LinkedHashMap<String, String> parseHeaders(String headers) {
+ LinkedHashMap<String, String> linkedHeaders = new LinkedHashMap<String, String>();
+ String[] list = headers.split("\n"); // $NON-NLS-1$
+ 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;
+ }
+
}
Added: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java?rev=1021539&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java (added)
+++ jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java Mon Oct 11 22:50:55 2010
@@ -0,0 +1,333 @@
+/*
+o * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.protocol.http.visualizers;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.JPanel;
+import javax.swing.JSplitPane;
+import javax.swing.JTable;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
+
+import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer;
+import org.apache.jmeter.gui.util.TextBoxDialoger.TextBoxDoubleClick;
+import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jmeter.visualizers.RequestView;
+import org.apache.jmeter.visualizers.SamplerResultTab.RowResult;
+import org.apache.jorphan.gui.GuiUtils;
+import org.apache.jorphan.gui.ObjectTableModel;
+import org.apache.jorphan.gui.RendererUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.reflect.Functor;
+import org.apache.log.Logger;
+
+/**
+ * Specializer panel to view a HTTP request parsed
+ *
+ */
+public class RequestViewHTTP implements RequestView {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ public static String KEY_LABEL = "view_results_table_request_tab_http"; //$NON-NLS-1$
+
+ private static String CHARSET_DECODE = "ISO-8859-1"; //$NON-NLS-1$
+
+ private static String PARAM_CONCATENATE = "&"; //$NON-NLS-1$
+
+ private JPanel paneParsed;
+
+ private ObjectTableModel requestModel = null;
+
+ private ObjectTableModel paramsModel = null;
+
+ private ObjectTableModel headersModel = null;
+
+ private static final String[] COLUMNS_REQUEST = new String[] {
+ " ", // one space for blank header // $NON-NLS-1$
+ " " }; // one space for blank header // $NON-NLS-1$
+
+ private static final String[] COLUMNS_PARAMS = new String[] {
+ "view_results_table_request_params_key", // $NON-NLS-1$
+ "view_results_table_request_params_value" }; // $NON-NLS-1$
+
+ private static final String[] COLUMNS_HEADERS = new String[] {
+ "view_results_table_request_headers_key", // $NON-NLS-1$
+ "view_results_table_request_headers_value" }; // $NON-NLS-1$
+
+ private JTable tableRequest = null;
+
+ private JTable tableParams = null;
+
+ private JTable tableHeaders = null;
+
+ // Request headers column renderers
+ private static final TableCellRenderer[] RENDERERS_REQUEST = new TableCellRenderer[] {
+ null, // Key
+ null, // Value
+ };
+
+ // Request headers column renderers
+ private static final TableCellRenderer[] RENDERERS_PARAMS = new TableCellRenderer[] {
+ null, // Key
+ null, // Value
+ };
+
+ // Request headers column renderers
+ private static final TableCellRenderer[] RENDERERS_HEADERS = new TableCellRenderer[] {
+ null, // Key
+ null, // Value
+ };
+
+ /**
+ * Pane to view HTTP request sample in view results tree
+ */
+ public RequestViewHTTP() {
+ requestModel = new ObjectTableModel(COLUMNS_REQUEST, 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 }, false);
+ paramsModel = new ObjectTableModel(COLUMNS_PARAMS, 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 }, false);
+ headersModel = 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 }, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#init()
+ */
+ public void init() {
+ paneParsed = new JPanel(new BorderLayout(0, 5));
+ paneParsed.add(createRequestPane());
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#clearData()
+ */
+ public void clearData() {
+ requestModel.clearData();
+ paramsModel.clearData();
+ headersModel.clearData(); // clear results table before filling
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#setSamplerResult(java.lang.Object)
+ */
+ public void setSamplerResult(Object objectResult) {
+
+ if (objectResult instanceof HTTPSampleResult) {
+ HTTPSampleResult sampleResult = (HTTPSampleResult) objectResult;
+ URL hUrl = sampleResult.getURL();
+
+ // Display with same order HTTP protocol
+ requestModel.addRow(new RowResult(
+ JMeterUtils.getResString("view_results_table_request_http_method"), //$NON-NLS-1$
+ sampleResult.getHTTPMethod()));
+ requestModel.addRow(new RowResult(JMeterUtils
+ .getResString("view_results_table_request_http_protocol"), //$NON-NLS-1$
+ hUrl.getProtocol()));
+ requestModel.addRow(new RowResult(
+ JMeterUtils.getResString("view_results_table_request_http_host"), //$NON-NLS-1$
+ hUrl.getHost()));
+ int port = hUrl.getPort() == -1 ? hUrl.getDefaultPort() : hUrl.getPort();
+ requestModel.addRow(new RowResult(
+ JMeterUtils.getResString("view_results_table_request_http_port"), //$NON-NLS-1$
+ port));
+ requestModel.addRow(new RowResult(
+ JMeterUtils.getResString("view_results_table_request_http_path"), //$NON-NLS-1$
+ hUrl.getPath()));
+
+ String queryGet = hUrl.getQuery() == null ? "" : hUrl.getQuery(); //$NON-NLS-1$
+ // Concatenate query post if exists
+ String queryPost = sampleResult.getQueryString();
+ if (queryPost != null && queryPost.length() > 0) {
+ if (queryGet.length() > 0) {
+ queryGet += PARAM_CONCATENATE;
+ }
+ queryGet += queryPost;
+ }
+ queryGet = RequestViewHTTP.decodeQuery(queryGet);
+ if (queryGet != null) {
+ Map<String, String> mapQuery = RequestViewHTTP.getQueryMap(queryGet);
+ Set<String> keys = mapQuery.keySet();
+ for (String key : keys) {
+ paramsModel.addRow(new RowResult(key, mapQuery.get(key)));
+ }
+ }
+
+ // Display cookie in headers table (same location on http protocol)
+ String cookie = sampleResult.getCookies();
+ if (cookie != null && cookie.length() > 0) {
+ headersModel.addRow(new RowResult(
+ JMeterUtils.getParsedLabel("view_results_table_request_http_cookie"), //$NON-NLS-1$
+ sampleResult.getCookies()));
+ }
+ // Parsed request headers
+ LinkedHashMap<String, String> lhm = JMeterUtils.parseHeaders(sampleResult.getRequestHeaders());
+ Set<String> keySet = lhm.keySet();
+ for (String key : keySet) {
+ headersModel.addRow(new RowResult(key, lhm.get(key)));
+ }
+
+ } else {
+ // add a message when no http sample
+ requestModel.addRow(new RowResult("", //$NON-NLS-1$
+ JMeterUtils.getResString("view_results_table_request_http_nohttp"))); //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * @param query
+ * @return Map params and Svalue
+ */
+ //TODO: move to utils class (JMeterUtils?)
+ public static Map<String, String> getQueryMap(String query) {
+
+ Map<String, String> map = new HashMap<String, String>();
+ if (query.trim().startsWith("<?")) { // $NON-NLS-1$
+ // SOAP request (generally)
+ map.put(" ", query); //blank name // $NON-NLS-1$
+ return map;
+ }
+ String[] params = query.split(PARAM_CONCATENATE);
+ for (String param : params) {
+ String[] paramSplit = param.split("="); // $NON-NLS-1$
+ String name = null;
+ if (paramSplit.length > 0) {
+ name = paramSplit[0];
+ }
+ String value = ""; // empty init // $NON-NLS-1$
+ if (paramSplit.length > 1) {
+ value = paramSplit[1];
+ }
+ map.put(name, value);
+ }
+ return map;
+ }
+
+ /**
+ * Decode a query string
+ *
+ * @param query
+ * to decode
+ * @return a decode query string
+ */
+ public static String decodeQuery(String query) {
+ if (query != null && query.length() > 0) {
+ try {
+ query = URLDecoder.decode(query, CHARSET_DECODE); // better ISO-8859-1 than UTF-8
+ } catch (UnsupportedEncodingException uee) {
+ log.warn("Error in parse query:" + query, uee);
+ return null;
+ }
+ return query;
+ }
+ return null;
+ }
+
+ public JPanel getPanel() {
+ return paneParsed;
+ }
+
+ /**
+ * Create a pane with three tables (request, params, headers)
+ *
+ * @return Pane to display request data
+ */
+ private Component createRequestPane() {
+ // Set up the 1st table Result with empty headers
+ tableRequest = new JTable(requestModel);
+ tableRequest.setToolTipText(JMeterUtils.getResString("textbox_tooltip_cell")); // $NON-NLS-1$
+ tableRequest.addMouseListener(new TextBoxDoubleClick(tableRequest));
+
+ setFirstColumnPreferredSize(tableRequest);
+ RendererUtils.applyRenderers(tableRequest, RENDERERS_REQUEST);
+
+ // Set up the 2nd table
+ tableParams = new JTable(paramsModel);
+ tableParams.setToolTipText(JMeterUtils.getResString("textbox_tooltip_cell")); // $NON-NLS-1$
+ tableParams.addMouseListener(new TextBoxDoubleClick(tableParams));
+ setFirstColumnPreferredSize(tableParams);
+ tableParams.getTableHeader().setDefaultRenderer(
+ new HeaderAsPropertyRenderer());
+ RendererUtils.applyRenderers(tableParams, RENDERERS_PARAMS);
+
+ // Set up the 3rd table
+ tableHeaders = new JTable(headersModel);
+ tableHeaders.setToolTipText(JMeterUtils.getResString("textbox_tooltip_cell")); // $NON-NLS-1$
+ tableHeaders.addMouseListener(new TextBoxDoubleClick(tableHeaders));
+ setFirstColumnPreferredSize(tableHeaders);
+ tableHeaders.getTableHeader().setDefaultRenderer(
+ new HeaderAsPropertyRenderer());
+ RendererUtils.applyRenderers(tableHeaders, RENDERERS_HEADERS);
+
+ // Create the split pane
+ JSplitPane topSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
+ GuiUtils.makeScrollPane(tableParams),
+ GuiUtils.makeScrollPane(tableHeaders));
+ topSplit.setOneTouchExpandable(true);
+ topSplit.setResizeWeight(0.50); // set split ratio
+
+ JSplitPane paneParsed = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
+ GuiUtils.makeScrollPane(tableRequest), topSplit);
+ paneParsed.setOneTouchExpandable(true);
+ paneParsed.setResizeWeight(0.25); // set split ratio (only 5 lines to display)
+
+ // Hint to background color on bottom tabs (grey, not blue)
+ JPanel panel = new JPanel(new BorderLayout());
+ panel.add(paneParsed);
+ return panel;
+ }
+
+ private void setFirstColumnPreferredSize(JTable table) {
+ TableColumn column = table.getColumnModel().getColumn(0);
+ column.setMaxWidth(300);
+ column.setPreferredWidth(160);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.jmeter.visualizers.request.RequestView#getLabel()
+ */
+ public String getLabel() {
+ return JMeterUtils.getResString(KEY_LABEL);
+ }
+}
Propchange: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/protocol/http/org/apache/jmeter/protocol/http/visualizers/RequestViewHTTP.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jakarta/jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/xdocs/changes.xml?rev=1021539&r1=1021538&r2=1021539&view=diff
==============================================================================
--- jakarta/jmeter/trunk/xdocs/changes.xml (original)
+++ jakarta/jmeter/trunk/xdocs/changes.xml Mon Oct 11 22:50:55 2010
@@ -124,6 +124,7 @@ To override the default local language f
<h3>Listeners</h3>
<ul>
<li>View Results Tree - Add a dialog's text box on "Sampler result tab > Parsed" to display the long value with a double click on cell</li>
+<li>Bug 37156 - Formatted view of Request in Results Tree</li>
</ul>
<h3>Timers, Assertions, Config, Pre- & Post-Processors</h3>
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@jakarta.apache.org
For additional commands, e-mail: notifications-help@jakarta.apache.org