Author: sebb
Date: Tue Dec 1 01:51:15 2009
New Revision: 885648
URL: http://svn.apache.org/viewvc?rev=885648&view=rev
Log:
Bug 47474 - View Results Tree support for plugin renderers
Added:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java (with props)
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (with props)
jakarta/jmeter/trunk/src/jorphan/org/apache/jorphan/gui/GuiUtils.java (with props)
Modified:
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SearchTextExtension.java
jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ViewResultsFullVisualizer.java
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
jakarta/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,150 @@
+/*
+ * 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.JEditorPane;
+import javax.swing.text.ComponentView;
+import javax.swing.text.Document;
+import javax.swing.text.EditorKit;
+import javax.swing.text.Element;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLEditorKit;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+public class RenderAsHTML extends SamplerResultTab implements ResultRenderer {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ private static final String TEXT_HTML = "text/html"; // $NON-NLS-1$
+
+ // Keep copies of the two editors needed
+ private static final EditorKit customisedEditor = new LocalHTMLEditorKit();
+
+ private static final EditorKit defaultHtmlEditor = JEditorPane.createEditorKitForContentType(TEXT_HTML);
+
+ /** {@inheritDoc} */
+ public void renderResult(SampleResult sampleResult) {
+ // get the text response and image icon
+ // to determine which is NOT null
+ String response = ViewResultsFullVisualizer.getResponseAsString(sampleResult);
+ showRenderedResponse(response, sampleResult);
+ }
+
+ protected void showRenderedResponse(String response, SampleResult res) {
+ showRenderedResponse(response, res, false);
+ }
+
+ protected void showRenderedResponse(String response, SampleResult res, boolean embedded) {
+ if (response == null) {
+ results.setText("");
+ return;
+ }
+
+ int htmlIndex = response.indexOf("<HTML"); // could be <HTML lang=""> // $NON-NLS-1$
+
+ // Look for a case variation
+ if (htmlIndex < 0) {
+ htmlIndex = response.indexOf("<html"); // ditto // $NON-NLS-1$
+ }
+
+ // If we still can't find it, just try using all of the text
+ if (htmlIndex < 0) {
+ htmlIndex = 0;
+ }
+
+ String html = response.substring(htmlIndex);
+
+ /*
+ * To disable downloading and rendering of images and frames, enable the
+ * editor-kit. The Stream property can then be
+ */
+ log.debug("html embedded=" + embedded);
+ // Must be done before setContentType
+ results.setEditorKitForContentType(TEXT_HTML, embedded ? defaultHtmlEditor : customisedEditor);
+
+ results.setContentType(TEXT_HTML);
+
+ if (embedded) {
+ // Allow JMeter to render frames (and relative images)
+ // Must be done after setContentType [Why?]
+ results.getDocument().putProperty(Document.StreamDescriptionProperty, res.getURL());
+ }
+ /*
+ * Get round problems parsing <META http-equiv='content-type'
+ * content='text/html; charset=utf-8'> See
+ * http://issues.apache.org/bugzilla/show_bug.cgi?id=23315
+ *
+ * Is this due to a bug in Java?
+ */
+ results.getDocument().putProperty("IgnoreCharsetDirective", Boolean.TRUE); // $NON-NLS-1$
+
+ results.setText(html);
+ results.setCaretPosition(0);
+ resultsScrollPane.setViewportView(results);
+
+ }
+
+ private static class LocalHTMLEditorKit extends HTMLEditorKit {
+
+ private static final long serialVersionUID = -3399554318202905392L;
+
+ private static final ViewFactory defaultFactory = new LocalHTMLFactory();
+
+ @Override
+ public ViewFactory getViewFactory() {
+ return defaultFactory;
+ }
+
+ private static class LocalHTMLFactory extends javax.swing.text.html.HTMLEditorKit.HTMLFactory {
+ /*
+ * Provide dummy implementations to suppress download and display of
+ * related resources: - FRAMEs - IMAGEs TODO create better dummy
+ * displays TODO suppress LINK somehow
+ */
+ @Override
+ public View create(Element elem) {
+ Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);
+ if (o instanceof HTML.Tag) {
+ HTML.Tag kind = (HTML.Tag) o;
+ if (kind == HTML.Tag.FRAME) {
+ return new ComponentView(elem);
+ } else if (kind == HTML.Tag.IMG) {
+ return new ComponentView(elem);
+ }
+ }
+ return super.create(elem);
+ }
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("view_results_render_html"); // $NON-NLS-1$
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTML.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,41 @@
+/*
+ * 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 org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+
+public class RenderAsHTMLWithEmbedded extends RenderAsHTML
+ implements ResultRenderer {
+
+ /** {@inheritDoc} */
+ @Override
+ protected void showRenderedResponse(String response, SampleResult res) {
+ // enable embedded html resources
+ showRenderedResponse(response, res, true);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("view_results_render_html_embedded"); // $NON-NLS-1$
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsHTMLWithEmbedded.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,117 @@
+/*
+ * 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.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+
+public class RenderAsJSON extends SamplerResultTab implements ResultRenderer {
+
+ private static final String ESC_CHAR_REGEX = "\\\\[\"\\\\/bfnrt]|\\\\u[0-9A-Fa-f]{4}"; // $NON-NLS-1$
+
+ private static final String NORMAL_CHARACTER_REGEX = "[^\"\\\\]"; // $NON-NLS-1$
+
+ private static final String STRING_REGEX = "\"(" + ESC_CHAR_REGEX + "|" + NORMAL_CHARACTER_REGEX + ")*\""; // $NON-NLS-1$
+
+ // This 'other value' regex is deliberately weak, even accepting an empty string, to be useful when reporting malformed data.
+ private static final String OTHER_VALUE_REGEX = "[^\\{\\[\\]\\}\\,]*"; // $NON-NLS-1$
+
+ private static final String VALUE_OR_PAIR_REGEX = "((" + STRING_REGEX + "\\s*:)?\\s*(" + STRING_REGEX + "|" + OTHER_VALUE_REGEX + ")\\s*,?\\s*)"; // $NON-NLS-1$
+
+ private static final Pattern VALUE_OR_PAIR_PATTERN = Pattern.compile(VALUE_OR_PAIR_REGEX);
+
+ /** {@inheritDoc} */
+ public void renderResult(SampleResult sampleResult) {
+ String response = ViewResultsFullVisualizer.getResponseAsString(sampleResult);
+ showRenderJSONResponse(response);
+ }
+
+ private void showRenderJSONResponse(String response) {
+ results.setContentType("text/plain"); // $NON-NLS-1$
+ results.setText(response == null ? "" : prettyJSON(response));
+ results.setCaretPosition(0);
+ resultsScrollPane.setViewportView(results);
+ }
+
+ // It might be useful also to make this available in the 'Request' tab, for
+ // when posting JSON.
+ private static String prettyJSON(String json) {
+ StringBuffer pretty = new StringBuffer(json.length() * 2); // Educated guess
+
+ final String tab = ": "; // $NON-NLS-1$
+ StringBuffer index = new StringBuffer();
+ String nl = ""; // $NON-NLS-1$
+
+ Matcher valueOrPair = VALUE_OR_PAIR_PATTERN.matcher(json);
+
+ boolean misparse = false;
+
+ for (int i = 0; i < json.length(); ) {
+ final char currentChar = json.charAt(i);
+ if ((currentChar == '{') || (currentChar == '[')) {
+ pretty.append(nl).append(index).append(currentChar);
+ i++;
+ index.append(tab);
+ misparse = false;
+ }
+ else if ((currentChar == '}') || (currentChar == ']')) {
+ if (index.length() > 0) {
+ index.delete(0, tab.length());
+ }
+ pretty.append(nl).append(index).append(currentChar);
+ i++;
+ int j = i;
+ while ((j < json.length()) && Character.isWhitespace(json.charAt(j))) {
+ j++;
+ }
+ if ((j < json.length()) && (json.charAt(j) == ',')) {
+ pretty.append(","); // $NON-NLS-1$
+ i=j+1;
+ }
+ misparse = false;
+ }
+ else if (valueOrPair.find(i) && valueOrPair.group().length() > 0) {
+ pretty.append(nl).append(index).append(valueOrPair.group());
+ i=valueOrPair.end();
+ misparse = false;
+ }
+ else {
+ if (!misparse) {
+ pretty.append(nl).append("- Parse failed from:");
+ }
+ pretty.append(currentChar);
+ i++;
+ misparse = true;
+ }
+ nl = "\n"; // $NON-NLS-1$
+ }
+ return pretty.toString();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("view_results_render_json"); // $NON-NLS-1$
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsJSON.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,253 @@
+/*
+ * 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.awt.Color;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.GuiUtils;
+import org.apache.jorphan.gui.JLabeledTextField;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+import org.apache.oro.text.PatternCacheLRU;
+import org.apache.oro.text.regex.MatchResult;
+import org.apache.oro.text.regex.Pattern;
+import org.apache.oro.text.regex.PatternMatcherInput;
+import org.apache.oro.text.regex.Perl5Compiler;
+import org.apache.oro.text.regex.Perl5Matcher;
+
+/**
+ * Implement ResultsRender for Regexp tester
+ */
+public class RenderAsRegexp implements ResultRenderer, ActionListener {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ private static final String REGEXP_TESTER_COMMAND = "regexp_tester"; // $NON-NLS-1$
+
+ private JPanel regexpPane;
+
+ private JTextArea regexpDataField;
+
+ private JLabeledTextField regexpField;
+
+ private JTextArea regexpResultField;
+
+ private JTabbedPane rightSide;
+
+ private SampleResult sampleResult = null;
+
+ /** {@inheritDoc} */
+ public void clearData() {
+ this.clearFields();
+ }
+
+ /** {@inheritDoc} */
+ public void init() {
+ // Create the panels for the regexp tab
+ regexpPane = createRegexpPanel();
+ }
+
+ /**
+ * Display the response as text or as rendered HTML. Change the text on the
+ * button appropriate to the current display.
+ *
+ * @param e the ActionEvent being processed
+ */
+ public void actionPerformed(ActionEvent e) {
+ String command = e.getActionCommand();
+ if ((sampleResult != null) && (REGEXP_TESTER_COMMAND.equals(command))) {
+ String response = ViewResultsFullVisualizer.getResponseAsString(sampleResult);
+ executeAndShowRegexpTester(response);
+ }
+ }
+
+ /**
+ * Launch regexp engine to parse a input text
+ * @param textToParse
+ */
+ private void executeAndShowRegexpTester(String textToParse) {
+ if (textToParse != null && textToParse.length() > 0
+ && this.regexpField.getText().length() > 0) {
+ log.debug("regexpField = " + this.regexpField.getText());
+ this.regexpResultField.setText(process(textToParse));
+ }
+ }
+
+ private String process(String textToParse) {
+
+ Perl5Matcher matcher = new Perl5Matcher();
+ PatternMatcherInput input = new PatternMatcherInput(textToParse);
+
+ PatternCacheLRU pcLRU = new PatternCacheLRU();
+ Pattern pattern = pcLRU.getPattern(regexpField.getText(), Perl5Compiler.READ_ONLY_MASK);
+ List<MatchResult> matches = new LinkedList<MatchResult>();
+ int x = 0;
+ boolean done = false;
+ do {
+ if (matcher.contains(input, pattern)) {
+ //log.debug("RegexExtractor: Match found!");
+ matches.add(matcher.getMatch());
+ } else {
+ done = true;
+ }
+ x++;
+ } while (!done);
+
+ // Construct a multi-line string with all matches
+ StringBuffer sb = new StringBuffer();
+ for (int j = 0; j < matches.size(); j++) {
+ MatchResult mr = matches.get(j);
+ final int groups = mr.groups();
+ for (int i = 0; i < groups; i++) {
+ sb.append(" group[" + j + "][" + i + "]=" + mr.group(i) + "\n");
+
+ }
+ }
+ return sb.toString();
+
+ }
+ /** {@inheritDoc} */
+ public void renderResult(SampleResult sampleResult) {
+ this.clearFields();
+
+ if ((SampleResult.TEXT).equals(sampleResult.getDataType())) {
+ String response = ViewResultsFullVisualizer.getResponseAsString(sampleResult);
+ regexpDataField.setText(response);
+ regexpDataField.setCaretPosition(0);
+ } else {
+ regexpDataField.setText(JMeterUtils.getResString("regexp_render_no_text"));
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void setupTabPane() {
+ // Add regexp tester pane
+ if (rightSide.indexOfTab(JMeterUtils.getResString("regexp_tester_title")) < 0) { // $NON-NLS-1$
+ rightSide.addTab(JMeterUtils.getResString("regexp_tester_title"), regexpPane); // $NON-NLS-1$
+ }
+ clearData();
+ }
+
+ /**
+ * @return RegExp Tester panel
+ */
+ private JPanel createRegexpPanel() {
+ regexpDataField = new JTextArea();
+ regexpDataField.setEditable(false);
+ regexpDataField.setLineWrap(true);
+ regexpDataField.setWrapStyleWord(true);
+
+ JScrollPane regexpDataPane = GuiUtils.makeScrollPane(regexpDataField);
+ regexpDataPane.setMinimumSize(new Dimension(0, 200));
+
+ JPanel pane = new JPanel(new BorderLayout(0, 5));
+
+ JSplitPane mainSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
+ regexpDataPane, createRegexpTasksPanel());
+ mainSplit.setDividerLocation(300);
+ pane.add(mainSplit, BorderLayout.CENTER);
+ return pane;
+ }
+
+ /**
+ * Create the Regexp task pane
+ *
+ * @return Regexp task pane
+ */
+ private JPanel createRegexpTasksPanel() {
+ JPanel regexpActionPanel = new JPanel();
+ regexpField = new JLabeledTextField(JMeterUtils.getResString("regexp_tester_field"), 30); // $NON-NLS-1$
+ regexpActionPanel.add(regexpField, BorderLayout.WEST);
+
+ JButton regexpTester = new JButton(JMeterUtils.getResString("regexp_tester_button_test"));
+ regexpTester.setActionCommand(REGEXP_TESTER_COMMAND);
+ regexpTester.addActionListener(this);
+ regexpActionPanel.add(regexpTester, BorderLayout.EAST);
+
+ regexpResultField = new JTextArea();
+ regexpResultField.setEditable(false);
+ regexpResultField.setLineWrap(true);
+ regexpResultField.setWrapStyleWord(true);
+
+ JPanel regexpTasksPanel = new JPanel(new BorderLayout(0, 5));
+ regexpTasksPanel.add(regexpActionPanel, BorderLayout.NORTH);
+ regexpTasksPanel.add(GuiUtils.makeScrollPane(regexpResultField), BorderLayout.CENTER);
+
+ return regexpTasksPanel;
+ }
+
+ private void clearFields() {
+ regexpDataField.setText(""); // $NON-NLS-1$
+ // don't set empty to keep regexp
+ // regexpField.setText(""); // $NON-NLS-1$
+ regexpResultField.setText(""); // $NON-NLS-1$
+ }
+
+ /** {@inheritDoc} */
+ public synchronized void setRightSide(JTabbedPane side) {
+ rightSide = side;
+ }
+
+ /** {@inheritDoc} */
+ public synchronized void setSamplerResult(Object userObject) {
+ if (userObject instanceof SampleResult) {
+ sampleResult = (SampleResult) userObject;
+ }
+ }
+
+ /** {@inheritDoc} */
+ public void setLastSelectedTab(int index) {
+ // nothing to do
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("regexp_tester_title");
+ }
+
+ /** {@inheritDoc} */
+ public void renderImage(SampleResult sampleResult) {
+ clearData();
+ }
+
+ /** {@inheritDoc} */
+ public void setBackgroundColor(Color backGround) {
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsRegexp.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,46 @@
+/*
+ * 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 org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+
+public class RenderAsText extends SamplerResultTab implements ResultRenderer {
+
+ /** {@inheritDoc} */
+ public void renderResult(SampleResult sampleResult) {
+ String response = ViewResultsFullVisualizer.getResponseAsString(sampleResult);
+ showTextResponse(response);
+ }
+
+ private void showTextResponse(String response) {
+ results.setContentType("text/plain"); // $NON-NLS-1$
+ results.setText(response == null ? "" : response); // $NON-NLS-1$
+ results.setCaretPosition(0);
+ resultsScrollPane.setViewportView(results);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("view_results_render_text");
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsText.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,222 @@
+/*
+ * 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.Component;
+import java.awt.GridLayout;
+import java.io.ByteArrayInputStream;
+import java.io.StringWriter;
+
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.ToolTipManager;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreeSelectionModel;
+
+import org.apache.jmeter.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jmeter.util.XPathUtil;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.util.JOrphanUtils;
+import org.apache.log.Logger;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.tidy.Tidy;
+import org.xml.sax.SAXException;
+
+public class RenderAsXML extends SamplerResultTab
+ implements ResultRenderer {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ private static final byte[] XML_PFX = "<?xml ".getBytes(); // $NON-NLS-1$
+
+ public RenderAsXML(){
+ activateSearchExtension = false; // TODO work out how to search the XML pane
+ }
+
+ /** {@inheritDoc} */
+ public void renderResult(SampleResult sampleResult) {
+ showRenderXMLResponse(sampleResult);
+ }
+
+ private void showRenderXMLResponse(SampleResult res) {
+ results.setContentType("text/xml"); // $NON-NLS-1$
+ results.setCaretPosition(0);
+ byte[] source = res.getResponseData();
+ final ByteArrayInputStream baIS = new ByteArrayInputStream(source);
+ for(int i=0; i<source.length-XML_PFX.length; i++){
+ if (JOrphanUtils.startsWith(source, XML_PFX, i)){
+ baIS.skip(i);// Skip the leading bytes (if any)
+ break;
+ }
+ }
+
+ // there is also a javax.swing.text.Document class.
+ org.w3c.dom.Document document = null;
+
+ StringWriter sw = new StringWriter();
+ Tidy tidy = XPathUtil.makeTidyParser(true, true, true, sw);
+ document = tidy.parseDOM(baIS, null);
+ document.normalize();
+ if (tidy.getParseErrors() > 0) {
+ showErrorMessageDialog(sw.toString(),
+ "Tidy: " + tidy.getParseErrors() + " errors, " + tidy.getParseWarnings() + " warnings",
+ JOptionPane.WARNING_MESSAGE);
+ }
+
+ JPanel domTreePanel = new DOMTreePanel(document);
+ resultsScrollPane.setViewportView(domTreePanel);
+ }
+
+ /**
+ *
+ * A Dom tree panel for to display response as tree view author <a
+ * href="mailto:[email protected]">Dave Maung</a> TODO implement to find any
+ * nodes in the tree using TreePath.
+ *
+ */
+ private static class DOMTreePanel extends JPanel {
+
+ private static final long serialVersionUID = 6871690021183779153L;
+
+ private JTree domJTree;
+
+ public DOMTreePanel(org.w3c.dom.Document document) {
+ super(new GridLayout(1, 0));
+ try {
+ Node firstElement = getFirstElement(document);
+ DefaultMutableTreeNode top = new XMLDefaultMutableTreeNode(firstElement);
+ domJTree = new JTree(top);
+
+ domJTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ domJTree.setShowsRootHandles(true);
+ JScrollPane domJScrollPane = new JScrollPane(domJTree);
+ domJTree.setAutoscrolls(true);
+ this.add(domJScrollPane);
+ ToolTipManager.sharedInstance().registerComponent(domJTree);
+ domJTree.setCellRenderer(new DomTreeRenderer());
+ } catch (SAXException e) {
+ log.warn("", e);
+ }
+
+ }
+
+ /**
+ * Skip all DTD nodes, all prolog nodes. They dont support in tree view
+ * We let user to insert them however in DOMTreeView, we dont display it
+ *
+ * @param root
+ * @return
+ */
+ private Node getFirstElement(Node parent) {
+ NodeList childNodes = parent.getChildNodes();
+ Node toReturn = parent; // Must return a valid node, or may generate an NPE
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ Node childNode = childNodes.item(i);
+ toReturn = childNode;
+ if (childNode.getNodeType() == Node.ELEMENT_NODE){
+ break;
+ }
+
+ }
+ return toReturn;
+ }
+
+ /**
+ * This class is to view as tooltext. This is very useful, when the
+ * contents has long string and does not fit in the view. it will also
+ * automatically wrap line for each 100 characters since tool tip
+ * support html. author <a href="mailto:[email protected]">Dave Maung</a>
+ */
+ private static class DomTreeRenderer extends DefaultTreeCellRenderer {
+
+ private static final long serialVersionUID = 240210061375790195L;
+
+ @Override
+ public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
+ boolean leaf, int row, boolean phasFocus) {
+ super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, phasFocus);
+
+ DefaultMutableTreeNode valueTreeNode = (DefaultMutableTreeNode) value;
+ setToolTipText(getHTML(valueTreeNode.toString(), "<br>", 100)); // $NON-NLS-1$
+ return this;
+ }
+
+ /**
+ * get the html
+ *
+ * @param str
+ * @param separator
+ * @param maxChar
+ * @return
+ */
+ private String getHTML(String str, String separator, int maxChar) {
+ StringBuffer strBuf = new StringBuffer("<html><body bgcolor=\"yellow\"><b>"); // $NON-NLS-1$
+ char[] chars = str.toCharArray();
+ for (int i = 0; i < chars.length; i++) {
+
+ if (i % maxChar == 0 && i != 0) {
+ strBuf.append(separator);
+ }
+ strBuf.append(encode(chars[i]));
+
+ }
+ strBuf.append("</b></body></html>"); // $NON-NLS-1$
+ return strBuf.toString();
+
+ }
+
+ private String encode(char c) {
+ String toReturn = String.valueOf(c);
+ switch (c) {
+ case '<': // $NON-NLS-1$
+ toReturn = "<"; // $NON-NLS-1$
+ break;
+ case '>': // $NON-NLS-1$
+ toReturn = ">"; // $NON-NLS-1$
+ break;
+ case '\'': // $NON-NLS-1$
+ toReturn = "'"; // $NON-NLS-1$
+ break;
+ case '\"': // $NON-NLS-1$
+ toReturn = """; // $NON-NLS-1$
+ break;
+
+ }
+ return toReturn;
+ }
+ }
+ }
+
+ private static void showErrorMessageDialog(String message, String title, int messageType) {
+ JOptionPane.showMessageDialog(null, message, title, messageType);
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public String toString() {
+ return JMeterUtils.getResString("view_results_render_xml");
+ }
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/RenderAsXML.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java?rev=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,61 @@
+/*
+ * 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.Color;
+
+import javax.swing.JTabbedPane;
+
+import org.apache.jmeter.samplers.SampleResult;
+
+
+/**
+ * Interface to results render
+ */
+public interface ResultRenderer {
+
+ public void clearData();
+
+ public void init();
+
+ public void setupTabPane();
+
+ public void setLastSelectedTab(int index);
+
+ public void setRightSide(JTabbedPane rightSide);
+
+ public void setSamplerResult(Object userObject);
+
+ public void renderResult(SampleResult sampleResult);
+
+ public void renderImage(SampleResult sampleResult);
+
+ /**
+ *
+ * @return the string to be displayed by the ComboBox
+ */
+ public String toString();
+
+ public void setBackgroundColor(Color backGround);
+
+}
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/ResultRenderer.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: 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=885648&view=auto
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java (added)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java Tue Dec 1 01:51:15 2009
@@ -0,0 +1,345 @@
+/*
+ * 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.awt.Color;
+import java.awt.Component;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.JTextArea;
+import javax.swing.JTextPane;
+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.samplers.SampleResult;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.GuiUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+public abstract class SamplerResultTab implements ResultRenderer {
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ // N.B. these are not multi-threaded, so don't make it static
+ private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z"); // ISO format $NON-NLS-1$
+
+ private static final String NL = "\n"; // $NON-NLS-1$
+
+ public static final Color SERVER_ERROR_COLOR = Color.red;
+
+ public static final Color CLIENT_ERROR_COLOR = Color.blue;
+
+ public static final Color REDIRECT_COLOR = Color.green;
+
+ protected static final String TEXT_COMMAND = "text"; // $NON-NLS-1$
+
+ private static final String STYLE_SERVER_ERROR = "ServerError"; // $NON-NLS-1$
+
+ private static final String STYLE_CLIENT_ERROR = "ClientError"; // $NON-NLS-1$
+
+ private static final String STYLE_REDIRECT = "Redirect"; // $NON-NLS-1$
+
+ protected JEditorPane results;
+
+ private JTextPane stats;
+
+ protected JScrollPane resultsScrollPane;
+
+ private JPanel resultsPane;
+
+ private JLabel imageLabel;
+
+ private JPanel requestPane;
+
+ private JTextArea sampleDataField;
+
+ protected JTabbedPane rightSide;
+
+ private int lastSelectedTab;
+
+ private Object userObject = null; // Could be SampleResult or AssertionResult
+
+ private SampleResult sampleResult = null;
+
+ private AssertionResult assertionResult = null;
+
+ protected SearchTextExtension searchTextExtension;
+
+ private JPanel searchPanel = null;
+
+ protected boolean activateSearchExtension = true; // most current subclasses can process text
+
+ private Color backGround;
+
+ public void clearData() {
+ results.setText("");// Response Data // $NON-NLS-1$
+ sampleDataField.setText("");// 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();
+ resultsPane = createResponseDataPanel();
+ }
+
+ public void setupTabPane() {
+ StyledDocument statsDoc = stats.getStyledDocument();
+ try {
+ statsDoc.remove(0, statsDoc.getLength());
+ sampleDataField.setText(""); // $NON-NLS-1$
+ results.setText(""); // $NON-NLS-1$
+ if (userObject instanceof SampleResult) {
+ sampleResult = (SampleResult) userObject;
+ // We are displaying a SampleResult
+ setupTabPaneForSampleResult();
+
+ // load time label
+ log.debug("valueChanged1 : load time - " + sampleResult.getTime());
+ String sd = sampleResult.getSamplerData();
+ if (sd != null) {
+ String rh = sampleResult.getRequestHeaders();
+ if (rh != null) {
+ StringBuffer sb = new StringBuffer(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);
+ }
+
+ StringBuffer statsBuff = new StringBuffer(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()));
+ statsBuff.append(JMeterUtils.getResString("view_results_sample_start")).append(startTime).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_load_time")).append(sampleResult.getTime()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_latency")).append(sampleResult.getLatency()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_size_in_bytes")).append(sampleResult.getBytes()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_sample_count")).append(sampleResult.getSampleCount()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_error_count")).append(sampleResult.getErrorCount()).append(NL); //$NON-NLS-1$
+ statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
+ statsBuff = new StringBuffer(); // reset for reuse
+
+ String responseCode = sampleResult.getResponseCode();
+ log.debug("valueChanged1 : response code - " + responseCode);
+
+ int responseLevel = 0;
+ if (responseCode != null) {
+ try {
+ responseLevel = Integer.parseInt(responseCode) / 100;
+ } catch (NumberFormatException numberFormatException) {
+ // no need to change the foreground color
+ }
+ }
+
+ Style style = null;
+ switch (responseLevel) {
+ case 3:
+ style = statsDoc.getStyle(STYLE_REDIRECT);
+ break;
+ case 4:
+ style = statsDoc.getStyle(STYLE_CLIENT_ERROR);
+ break;
+ case 5:
+ style = statsDoc.getStyle(STYLE_SERVER_ERROR);
+ break;
+ }
+
+ statsBuff.append(JMeterUtils.getResString("view_results_response_code")).append(responseCode).append(NL); //$NON-NLS-1$
+ statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), style);
+ statsBuff = new StringBuffer(100); // reset for reuse
+
+ // response message label
+ String responseMsgStr = sampleResult.getResponseMessage();
+
+ log.debug("valueChanged1 : response message - " + responseMsgStr);
+ 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);
+ statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
+ statsBuff = null; // Done
+
+ // Reset search
+ if (activateSearchExtension) {
+ searchTextExtension.resetTextToFind();
+ }
+
+ } else if (userObject instanceof AssertionResult) {
+ assertionResult = (AssertionResult) userObject;
+
+ // We are displaying an AssertionResult
+ setupTabPaneForAssertionResult();
+
+ if (log.isDebugEnabled()) {
+ log.debug("valueChanged1 : sample result - " + assertionResult);
+ }
+
+ StringBuffer statsBuff = new StringBuffer(100);
+ statsBuff.append(JMeterUtils.getResString("view_results_assertion_error")).append(assertionResult.isError()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_assertion_failure")).append(assertionResult.isFailure()).append(NL); //$NON-NLS-1$
+ statsBuff.append(JMeterUtils.getResString("view_results_assertion_failure_message")).append(assertionResult.getFailureMessage()).append(NL); //$NON-NLS-1$
+ statsDoc.insertString(statsDoc.getLength(), statsBuff.toString(), null);
+ statsBuff = null;
+ }
+ } catch (BadLocationException exc) {
+ log.error("Error setting statistics text", exc);
+ stats.setText("");
+ }
+ }
+
+ private void setupTabPaneForSampleResult() {
+ // 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
+ 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$
+ }
+ 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$
+ }
+ // restore last selected tab
+ if (lastSelectedTab < rightSide.getTabCount()) {
+ rightSide.setSelectedIndex(lastSelectedTab);
+ }
+ }
+
+ private void setupTabPaneForAssertionResult() {
+ // 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
+ int requestTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_request")); // $NON-NLS-1$
+ if(requestTabIndex >= 0) {
+ rightSide.removeTabAt(requestTabIndex);
+ }
+ int responseTabIndex = rightSide.indexOfTab(JMeterUtils.getResString("view_results_tab_response")); // $NON-NLS-1$
+ if(responseTabIndex >= 0) {
+ rightSide.removeTabAt(responseTabIndex);
+ }
+ }
+
+ private Component createResponseMetadataPanel() {
+ stats = new JTextPane();
+ stats.setEditable(false);
+ stats.setBackground(backGround);
+
+ // Add styles to use for different types of status messages
+ StyledDocument doc = (StyledDocument) stats.getDocument();
+
+ Style style = doc.addStyle(STYLE_REDIRECT, null);
+ StyleConstants.setForeground(style, REDIRECT_COLOR);
+
+ style = doc.addStyle(STYLE_CLIENT_ERROR, null);
+ StyleConstants.setForeground(style, CLIENT_ERROR_COLOR);
+
+ 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;
+ }
+
+ 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);
+
+ resultsScrollPane = GuiUtils.makeScrollPane(results);
+ imageLabel = new JLabel();
+
+ JPanel panel = new JPanel(new BorderLayout());
+ panel.add(resultsScrollPane, BorderLayout.CENTER);
+
+ if (activateSearchExtension) {
+ // Add search text extension
+ searchTextExtension = new SearchTextExtension();
+ searchTextExtension.init(panel);
+ searchPanel = searchTextExtension.createSearchTextExtensionPane();
+ searchTextExtension.setResults(results);
+ searchPanel.setVisible(true);
+ panel.add(searchPanel, BorderLayout.PAGE_END);
+ }
+
+ return panel;
+ }
+
+ private void showImage(Icon image) {
+ imageLabel.setIcon(image);
+ resultsScrollPane.setViewportView(imageLabel);
+ }
+
+ public synchronized void setSamplerResult(Object sample) {
+ userObject = sample;
+ }
+
+ public synchronized void setRightSide(JTabbedPane side) {
+ rightSide = side;
+ }
+
+ public void setLastSelectedTab(int index) {
+ lastSelectedTab = index;
+ }
+
+ public void renderImage(SampleResult sampleResult) {
+ byte[] responseBytes = sampleResult.getResponseData();
+ if (responseBytes != null) {
+ showImage(new ImageIcon(responseBytes)); //TODO implement other non-text types
+ }
+ }
+
+ public void setBackgroundColor(Color backGround){
+ this.backGround = backGround;
+ }
+}
\ No newline at end of file
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SamplerResultTab.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SearchTextExtension.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SearchTextExtension.java?rev=885648&r1=885647&r2=885648&view=diff
==============================================================================
--- jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SearchTextExtension.java (original)
+++ jakarta/jmeter/trunk/src/components/org/apache/jmeter/visualizers/SearchTextExtension.java Tue Dec 1 01:51:15 2009
@@ -1,18 +1,18 @@
-/*
+/*
* 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.
*/
@@ -24,8 +24,6 @@
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -56,30 +54,21 @@
import org.apache.log.Logger;
public class SearchTextExtension implements ActionListener, DocumentListener {
-
+
private static final Logger log = LoggingManager.getLoggerForClass();
-
- public static final String SEARCH_TEXT_COMMAND = "search_text"; // $NON-NLS-1$
-
- public static final String DIALOG_SEARCH_SHOW_COMMAND = "show_search_dialog"; // $NON-NLS-1$
-
- public static final String DIALOG_SEARCH_HIDE_COMMAND = "close_search_dialog"; // $NON-NLS-1$
-
- private static final String SEARCH_SHOW_COMMAND = "show_search_text"; // $NON-NLS-1$
-
- // set default command to Text
- private String command = DIALOG_SEARCH_SHOW_COMMAND;
-
+
+ private static final String SEARCH_TEXT_COMMAND = "search_text"; // $NON-NLS-1$
+
private static int LAST_POSITION_DEFAULT = 0;
private int lastPosition = LAST_POSITION_DEFAULT;
-
+
private final static Color HILIT_COLOR = Color.LIGHT_GRAY;
-
+
private Highlighter selection;
-
+
private Highlighter.HighlightPainter painter;
-
+
private JLabel label;
private JButton findButton;
@@ -93,26 +82,15 @@
private String lastTextTofind;
private boolean newSearch = false;
-
+
private JEditorPane results;
-
+
private JPanel searchPanel;
- private boolean enabled = true;
-
- private JCheckBox showSearch;
-
public void init(JPanel resultsPane) {
- // when CTRL-T is pressed, (un-)show search dialog box (only in results pane)
- InputMap im = resultsPane
- .getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
- im.put(KeyStroke.getKeyStroke(KeyEvent.VK_T,
- InputEvent.CTRL_MASK), SEARCH_SHOW_COMMAND);
- ActionMap am = resultsPane.getActionMap();
- am.put(SEARCH_SHOW_COMMAND, new DisplaySearchAction());
}
-
+
public void setResults(JEditorPane results) {
if (this.results != null) {
newSearch = true;
@@ -128,10 +106,10 @@
/**
* Launch find text engine on response text
*/
- public void executeAndShowTextFind() {
+ private void executeAndShowTextFind() {
+ String textToFind = textToFindField.getText();
if (results != null && results.getText().length() > 0
- && this.textToFindField.getText().length() > 0) {
- String textToFind = textToFindField.getText();
+ && textToFind.length() > 0) {
// new search?
if (lastTextTofind != null && !lastTextTofind.equals(textToFind)) {
@@ -153,7 +131,7 @@
selection.removeAllHighlights();
selection.addHighlight(lastPosition + matcher.start(),
lastPosition + matcher.end(), painter);
- results.setCaretPosition(lastPosition + matcher.end());
+ results.setCaretPosition(lastPosition + matcher.end());
// save search position
lastPosition = lastPosition + matcher.end();
@@ -180,12 +158,12 @@
/**
* Create the text find task pane
- *
+ *
* @return Text find task pane
*/
- public JPanel createSearchTextPanel() {
+ private JPanel createSearchTextPanel() {
Font font = new Font("SansSerif", Font.PLAIN, 10);
-
+
// Search field
searchPanel = new JPanel();
searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.X_AXIS));
@@ -224,34 +202,18 @@
im.put(KeyStroke.getKeyStroke("ENTER"), SEARCH_TEXT_COMMAND);
ActionMap am = textToFindField.getActionMap();
am.put(SEARCH_TEXT_COMMAND, new EnterAction());
-
+
+ // default not visible
+ searchPanel.setVisible(true);
return searchPanel;
}
-
- public JPanel createSearchTextExtensionPane() {
+
+ JPanel createSearchTextExtensionPane() {
JPanel pane = new JPanel();
pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
- pane.add(createShowSearchPanel());
pane.add(createSearchTextPanel());
return pane;
}
-
- public JPanel createShowSearchPanel() {
- Font fontBold = new Font("SansSerif", Font.BOLD, 10);
-
- showSearch = new JCheckBox();
- showSearch.setFont(fontBold);
- showSearch.setAction(new DisplaySearchAction());
- showSearch.setText(JMeterUtils
- .getResString("view_results_search_pane")); // $NON-NLS-1$
-
- JPanel pane = new JPanel();
- pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
- pane.add(showSearch);
-
- return pane;
- }
-
/**
* Display the response as text or as rendered HTML. Change the text on the
@@ -261,18 +223,12 @@
* the ActionEvent being processed
*/
public void actionPerformed(ActionEvent e) {
- command = e.getActionCommand();
+ String command = e.getActionCommand();
// Search text in response data
- if (command != null
- && (command.equals(SearchTextExtension.SEARCH_TEXT_COMMAND))) {
+ if (SEARCH_TEXT_COMMAND.equals(command)) {
executeAndShowTextFind();
}
- // hide search dialog box
- else if (command != null && command.equals(
- SearchTextExtension.DIALOG_SEARCH_HIDE_COMMAND)) {
- hideSearchBox();
- }
}
private class EnterAction extends AbstractAction {
@@ -282,22 +238,6 @@
}
}
- private class DisplaySearchAction extends AbstractAction {
- private static final long serialVersionUID = 1L;
- public void actionPerformed(ActionEvent ev) {
- if (searchPanel != null) {
- resetTextToFind();
- if (searchPanel.isVisible()) {
- searchPanel.setVisible(false);
- showSearch.setSelected(false);
- } else {
- searchPanel.setVisible(true);
- showSearch.setSelected(true);
- }
- }
- }
- }
-
// DocumentListener method
public void changedUpdate(DocumentEvent e) {
// do nothing
@@ -313,11 +253,7 @@
resetTextToFind();
}
- public void hideSearchBox() {
- searchPanel.setVisible(false);
- }
-
- public void resetTextToFind() {
+ void resetTextToFind() {
if (newSearch) {
log.debug("reset pass");
// Reset search
@@ -330,22 +266,9 @@
newSearch = false;
}
}
-
- public boolean isEnabled() {
- return enabled ;
- }
-
- public void setEnabled(boolean b) {
- this.enabled = b;
- label.setEnabled(b);
- textToFindField.setEnabled(b);
- findButton.setEnabled(b);
- caseChkBox.setEnabled(b);
- regexpChkBox.setEnabled(b);
- }
-
+
private Pattern createPattern(String textToFind) {
- // desactivate or not specials regexp char
+ // desactivate or not specials regexp char
String textToFindQ = Pattern.quote(textToFind);
if (regexpChkBox.isSelected()) {
textToFindQ = textToFind;
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.