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- &amp; Post-Processors</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@jakarta.apache.org
For additional commands, e-mail: notifications-help@jakarta.apache.org