Java tutorial
/* * 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.config.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.config.ConfigTestElement; import org.apache.jmeter.gui.util.HorizontalPanel; import org.apache.jmeter.gui.util.VerticalPanel; import org.apache.jmeter.protocol.http.gui.HTTPArgumentsPanel; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBaseClassifier; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory; import org.apache.jmeter.protocol.http.util.HTTPArgument; import org.apache.jmeter.testelement.TestElement; import org.apache.jmeter.testelement.property.BooleanProperty; import org.apache.jmeter.testelement.property.PropertyIterator; import org.apache.jmeter.testelement.property.TestElementProperty; import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.gui.JLabeledChoice; import org.apache.jorphan.gui.JLabeledTextArea; /** * Basic URL / HTTP Request configuration: * - host and port * - connect and response timeouts * - path, method, encoding, parameters * - redirects & keepalive */ public class UrlConfigGuiClassifier extends JPanel implements ChangeListener { private static final long serialVersionUID = 240L; private static final int TAB_PARAMETERS = 0; private static final int TAB_RAW_BODY = 1; private HTTPArgumentsPanel argsPanel; private JTextField type; private JTextField domain; private JTextField port; private JTextField proxyHost; private JTextField proxyPort; private JTextField proxyUser; private JPasswordField proxyPass; private JTextField connectTimeOut; private JTextField responseTimeOut; private JTextField protocol; private JTextField contentEncoding; private JTextField path; private JCheckBox followRedirects; private JCheckBox autoRedirects; private JCheckBox useKeepAlive; private JCheckBox useMultipartForPost; private JCheckBox useBrowserCompatibleMultipartMode; private JLabeledChoice method; private JLabeledChoice httpImplementation; private final boolean notConfigOnly; // set this false to suppress some items for use in HTTP Request defaults private final boolean showImplementation; // Set false for AJP // Raw POST Body private JLabeledTextArea postBodyContent; // Tabbed pane that contains parameters and raw body private ValidationTabbedPane postContentTabbedPane; private boolean showRawBodyPane; public UrlConfigGuiClassifier() { this(true); } /** * @param showSamplerFields */ public UrlConfigGuiClassifier(boolean showSamplerFields) { this(showSamplerFields, true, true); } /** * @param showSamplerFields * @param showImplementation Show HTTP Implementation * @param showRawBodyPane */ public UrlConfigGuiClassifier(boolean showSamplerFields, boolean showImplementation, boolean showRawBodyPane) { notConfigOnly = showSamplerFields; this.showImplementation = showImplementation; this.showRawBodyPane = showRawBodyPane; init(); } public void clear() { domain.setText(""); // $NON-NLS-1$ if (notConfigOnly) { followRedirects.setSelected(true); autoRedirects.setSelected(false); method.setText(HTTPSamplerBase.DEFAULT_METHOD); useKeepAlive.setSelected(true); useMultipartForPost.setSelected(false); useBrowserCompatibleMultipartMode .setSelected(HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT); } if (showImplementation) { httpImplementation.setText(""); // $NON-NLS-1$ } path.setText(""); // $NON-NLS-1$ port.setText(""); // $NON-NLS-1$ proxyHost.setText(""); // $NON-NLS-1$ proxyPort.setText(""); // $NON-NLS-1$ proxyUser.setText(""); // $NON-NLS-1$ proxyPass.setText(""); // $NON-NLS-1$ connectTimeOut.setText(""); // $NON-NLS-1$ responseTimeOut.setText(""); // $NON-NLS-1$ protocol.setText(""); // $NON-NLS-1$ contentEncoding.setText(""); // $NON-NLS-1$ type.setText(""); argsPanel.clear(); if (showRawBodyPane) { postBodyContent.setText("");// $NON-NLS-1$ } postContentTabbedPane.setSelectedIndex(TAB_PARAMETERS, false); } public TestElement createTestElement() { ConfigTestElement element = new ConfigTestElement(); element.setName(this.getName()); element.setProperty(TestElement.GUI_CLASS, this.getClass().getName()); element.setProperty(TestElement.TEST_CLASS, element.getClass().getName()); modifyTestElement(element); return element; } /** * Save the GUI values in the sampler. * * @param element */ public void modifyTestElement(TestElement element) { boolean useRaw = postContentTabbedPane.getSelectedIndex() == TAB_RAW_BODY; Arguments args; if (useRaw) { args = new Arguments(); String text = postBodyContent.getText(); /* * Textfield uses \n (LF) to delimit lines; we need to send CRLF. * Rather than change the way that arguments are processed by the * samplers for raw data, it is easier to fix the data. * On retrival, CRLF is converted back to LF for storage in the text field. * See */ HTTPArgument arg = new HTTPArgument("", text.replaceAll("\n", "\r\n"), false); arg.setAlwaysEncoded(false); args.addArgument(arg); } else { args = (Arguments) argsPanel.createTestElement(); HTTPArgument.convertArgumentsToHTTP(args); } element.setProperty(HTTPSamplerBaseClassifier.POST_BODY_RAW, useRaw, HTTPSamplerBase.POST_BODY_RAW_DEFAULT); element.setProperty(new TestElementProperty(HTTPSamplerBase.ARGUMENTS, args)); element.setProperty(HTTPSamplerBaseClassifier.DOMAIN, domain.getText()); element.setProperty(HTTPSamplerBaseClassifier.PORT, port.getText()); element.setProperty(HTTPSamplerBaseClassifier.PROXYHOST, proxyHost.getText(), ""); element.setProperty(HTTPSamplerBaseClassifier.PROXYPORT, proxyPort.getText(), ""); element.setProperty(HTTPSamplerBaseClassifier.PROXYUSER, proxyUser.getText(), ""); element.setProperty(HTTPSamplerBaseClassifier.PROXYPASS, String.valueOf(proxyPass.getPassword()), ""); element.setProperty(HTTPSamplerBaseClassifier.CONNECT_TIMEOUT, connectTimeOut.getText()); element.setProperty(HTTPSamplerBaseClassifier.RESPONSE_TIMEOUT, responseTimeOut.getText()); element.setProperty(HTTPSamplerBaseClassifier.PROTOCOL, protocol.getText()); element.setProperty(HTTPSamplerBaseClassifier.CONTENT_ENCODING, contentEncoding.getText()); element.setProperty(HTTPSamplerBaseClassifier.PATH, path.getText()); if (notConfigOnly) { element.setProperty(HTTPSamplerBaseClassifier.METHOD, method.getText()); element.setProperty( new BooleanProperty(HTTPSamplerBaseClassifier.FOLLOW_REDIRECTS, followRedirects.isSelected())); element.setProperty( new BooleanProperty(HTTPSamplerBaseClassifier.AUTO_REDIRECTS, autoRedirects.isSelected())); element.setProperty( new BooleanProperty(HTTPSamplerBaseClassifier.USE_KEEPALIVE, useKeepAlive.isSelected())); element.setProperty(new BooleanProperty(HTTPSamplerBaseClassifier.DO_MULTIPART_POST, useMultipartForPost.isSelected())); element.setProperty(HTTPSamplerBaseClassifier.BROWSER_COMPATIBLE_MULTIPART, useBrowserCompatibleMultipartMode.isSelected(), HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT); } if (showImplementation) { element.setProperty(HTTPSamplerBaseClassifier.IMPLEMENTATION, httpImplementation.getText(), ""); } } // FIXME FACTOR WITH HTTPHC4Impl, HTTPHC3Impl // Just append all the parameter values, and use that as the post body /** * Compute Post body from arguments * @param arguments {@link Arguments} * @return {@link String} */ private static final String computePostBody(Arguments arguments) { return computePostBody(arguments, false); } /** * Compute Post body from arguments * @param arguments {@link Arguments} * @param crlfToLF whether to convert CRLF to LF * @return {@link String} */ private static final String computePostBody(Arguments arguments, boolean crlfToLF) { StringBuilder postBody = new StringBuilder(); PropertyIterator args = arguments.iterator(); while (args.hasNext()) { HTTPArgument arg = (HTTPArgument) args.next().getObjectValue(); String value = arg.getValue(); if (crlfToLF) { value = value.replaceAll("\r\n", "\n"); // See modifyTestElement } postBody.append(value); } return postBody.toString(); } /** * Set the text, etc. in the UI. * * @param el * contains the data to be displayed */ public void configure(TestElement el) { setName(el.getName()); Arguments arguments = (Arguments) el.getProperty(HTTPSamplerBaseClassifier.ARGUMENTS).getObjectValue(); boolean useRaw = el.getPropertyAsBoolean(HTTPSamplerBaseClassifier.POST_BODY_RAW, HTTPSamplerBaseClassifier.POST_BODY_RAW_DEFAULT); if (useRaw) { String postBody = computePostBody(arguments, true); // Convert CRLF to CR, see modifyTestElement postBodyContent.setText(postBody); postContentTabbedPane.setSelectedIndex(TAB_RAW_BODY, false); } else { argsPanel.configure(arguments); postContentTabbedPane.setSelectedIndex(TAB_PARAMETERS, false); } domain.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.DOMAIN)); String portString = el.getPropertyAsString(HTTPSamplerBaseClassifier.PORT); // Only display the port number if it is meaningfully specified if (portString.equals(HTTPSamplerBaseClassifier.UNSPECIFIED_PORT_AS_STRING)) { port.setText(""); // $NON-NLS-1$ } else { port.setText(portString); } proxyHost.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PROXYHOST)); proxyPort.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PROXYPORT)); proxyUser.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PROXYUSER)); proxyPass.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PROXYPASS)); connectTimeOut.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.CONNECT_TIMEOUT)); responseTimeOut.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.RESPONSE_TIMEOUT)); protocol.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PROTOCOL)); contentEncoding.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.CONTENT_ENCODING)); path.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.PATH)); if (notConfigOnly) { method.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.METHOD)); followRedirects.setSelected(el.getPropertyAsBoolean(HTTPSamplerBaseClassifier.FOLLOW_REDIRECTS)); autoRedirects.setSelected(el.getPropertyAsBoolean(HTTPSamplerBaseClassifier.AUTO_REDIRECTS)); useKeepAlive.setSelected(el.getPropertyAsBoolean(HTTPSamplerBaseClassifier.USE_KEEPALIVE)); useMultipartForPost.setSelected(el.getPropertyAsBoolean(HTTPSamplerBaseClassifier.DO_MULTIPART_POST)); useBrowserCompatibleMultipartMode .setSelected(el.getPropertyAsBoolean(HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART, HTTPSamplerBaseClassifier.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT)); } if (showImplementation) { httpImplementation.setText(el.getPropertyAsString(HTTPSamplerBaseClassifier.IMPLEMENTATION)); } } private void init() {// called from ctor, so must not be overridable this.setLayout(new BorderLayout()); // WEB REQUEST PANEL JPanel webRequestPanel = new JPanel(); webRequestPanel.setLayout(new BorderLayout()); webRequestPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), JMeterUtils.getResString("web_request"))); // $NON-NLS-1$ JPanel northPanel = new JPanel(); northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.Y_AXIS)); northPanel.add(getProtocolAndMethodPanel()); northPanel.add(getPathPanel()); northPanel.add(getClassifierPanel()); webRequestPanel.add(northPanel, BorderLayout.NORTH); webRequestPanel.add(getParameterPanel(), BorderLayout.CENTER); this.add(getWebServerTimeoutPanel(), BorderLayout.NORTH); this.add(webRequestPanel, BorderLayout.CENTER); this.add(getProxyServerPanel(), BorderLayout.SOUTH); } /** * Create a panel containing the webserver (domain+port) and timeouts (connect+request). * * @return the panel */ protected final JPanel getWebServerTimeoutPanel() { // WEB SERVER PANEL JPanel webServerPanel = new HorizontalPanel(); webServerPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), JMeterUtils.getResString("web_server"))); // $NON-NLS-1$ final JPanel domainPanel = getDomainPanel(); final JPanel portPanel = getPortPanel(); webServerPanel.add(domainPanel, BorderLayout.CENTER); webServerPanel.add(portPanel, BorderLayout.EAST); JPanel timeOut = new HorizontalPanel(); timeOut.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), JMeterUtils.getResString("web_server_timeout_title"))); // $NON-NLS-1$ final JPanel connPanel = getConnectTimeOutPanel(); final JPanel reqPanel = getResponseTimeOutPanel(); timeOut.add(connPanel); timeOut.add(reqPanel); JPanel webServerTimeoutPanel = new VerticalPanel(); webServerTimeoutPanel.add(webServerPanel, BorderLayout.CENTER); webServerTimeoutPanel.add(timeOut, BorderLayout.EAST); JPanel bigPanel = new VerticalPanel(); bigPanel.add(webServerTimeoutPanel); return bigPanel; } /** * Create a panel containing the proxy server details * * @return the panel */ protected final JPanel getProxyServerPanel() { JPanel proxyServer = new HorizontalPanel(); proxyServer.add(getProxyHostPanel(), BorderLayout.CENTER); proxyServer.add(getProxyPortPanel(), BorderLayout.EAST); JPanel proxyLogin = new HorizontalPanel(); proxyLogin.add(getProxyUserPanel()); proxyLogin.add(getProxyPassPanel()); JPanel proxyServerPanel = new HorizontalPanel(); proxyServerPanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), JMeterUtils.getResString("web_proxy_server_title"))); // $NON-NLS-1$ proxyServerPanel.add(proxyServer, BorderLayout.CENTER); proxyServerPanel.add(proxyLogin, BorderLayout.EAST); return proxyServerPanel; } private JPanel getPortPanel() { port = new JTextField(4); JLabel label = new JLabel(JMeterUtils.getResString("web_server_port")); // $NON-NLS-1$ label.setLabelFor(port); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(port, BorderLayout.CENTER); return panel; } private JPanel getProxyPortPanel() { proxyPort = new JTextField(4); JLabel label = new JLabel(JMeterUtils.getResString("web_server_port")); // $NON-NLS-1$ label.setLabelFor(proxyPort); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(proxyPort, BorderLayout.CENTER); return panel; } private JPanel getConnectTimeOutPanel() { connectTimeOut = new JTextField(4); JLabel label = new JLabel(JMeterUtils.getResString("web_server_timeout_connect")); // $NON-NLS-1$ label.setLabelFor(connectTimeOut); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(connectTimeOut, BorderLayout.CENTER); return panel; } private JPanel getResponseTimeOutPanel() { responseTimeOut = new JTextField(4); JLabel label = new JLabel(JMeterUtils.getResString("web_server_timeout_response")); // $NON-NLS-1$ label.setLabelFor(responseTimeOut); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(responseTimeOut, BorderLayout.CENTER); return panel; } private JPanel getClassifierPanel() { type = new JTextField(20); JLabel label = new JLabel("Type"); // $NON-NLS-1$ label.setLabelFor(type); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(type, BorderLayout.CENTER); return panel; } private JPanel getDomainPanel() { domain = new JTextField(20); JLabel label = new JLabel(JMeterUtils.getResString("web_server_domain")); // $NON-NLS-1$ label.setLabelFor(domain); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(domain, BorderLayout.CENTER); return panel; } private JPanel getProxyHostPanel() { proxyHost = new JTextField(20); JLabel label = new JLabel(JMeterUtils.getResString("web_server_domain")); // $NON-NLS-1$ label.setLabelFor(proxyHost); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(proxyHost, BorderLayout.CENTER); return panel; } private JPanel getProxyUserPanel() { proxyUser = new JTextField(5); JLabel label = new JLabel(JMeterUtils.getResString("username")); // $NON-NLS-1$ label.setLabelFor(proxyUser); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(proxyUser, BorderLayout.CENTER); return panel; } private JPanel getProxyPassPanel() { proxyPass = new JPasswordField(5); JLabel label = new JLabel(JMeterUtils.getResString("password")); // $NON-NLS-1$ label.setLabelFor(proxyPass); JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.add(label, BorderLayout.WEST); panel.add(proxyPass, BorderLayout.CENTER); return panel; } /** * This method defines the Panel for the HTTP path, 'Follow Redirects' * 'Use KeepAlive', and 'Use multipart for HTTP POST' elements. * * @return JPanel The Panel for the path, 'Follow Redirects' and 'Use * KeepAlive' elements. */ protected Component getPathPanel() { path = new JTextField(15); JLabel label = new JLabel(JMeterUtils.getResString("path")); //$NON-NLS-1$ label.setLabelFor(path); if (notConfigOnly) { followRedirects = new JCheckBox(JMeterUtils.getResString("follow_redirects")); // $NON-NLS-1$ followRedirects.setSelected(true); followRedirects.addChangeListener(this); autoRedirects = new JCheckBox(JMeterUtils.getResString("follow_redirects_auto")); //$NON-NLS-1$ autoRedirects.addChangeListener(this); autoRedirects.setSelected(false);// Default changed in 2.3 and again in 2.4 useKeepAlive = new JCheckBox(JMeterUtils.getResString("use_keepalive")); // $NON-NLS-1$ useKeepAlive.setSelected(true); useMultipartForPost = new JCheckBox(JMeterUtils.getResString("use_multipart_for_http_post")); // $NON-NLS-1$ useMultipartForPost.setSelected(false); useBrowserCompatibleMultipartMode = new JCheckBox( JMeterUtils.getResString("use_multipart_mode_browser")); // $NON-NLS-1$ useBrowserCompatibleMultipartMode .setSelected(HTTPSamplerBase.BROWSER_COMPATIBLE_MULTIPART_MODE_DEFAULT); } JPanel pathPanel = new JPanel(new BorderLayout(5, 0)); pathPanel.add(label, BorderLayout.WEST); pathPanel.add(path, BorderLayout.CENTER); pathPanel.setMinimumSize(pathPanel.getPreferredSize()); JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(pathPanel); if (notConfigOnly) { JPanel optionPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); optionPanel.add(autoRedirects); optionPanel.add(followRedirects); optionPanel.add(useKeepAlive); optionPanel.add(useMultipartForPost); optionPanel.add(useBrowserCompatibleMultipartMode); optionPanel.setMinimumSize(optionPanel.getPreferredSize()); panel.add(optionPanel); } return panel; } protected JPanel getProtocolAndMethodPanel() { // Implementation if (showImplementation) { httpImplementation = new JLabeledChoice(JMeterUtils.getResString("http_implementation"), // $NON-NLS-1$ HTTPSamplerFactory.getImplementations()); httpImplementation.addValue(""); } // PROTOCOL protocol = new JTextField(4); JLabel protocolLabel = new JLabel(JMeterUtils.getResString("protocol")); // $NON-NLS-1$ protocolLabel.setLabelFor(protocol); // CONTENT_ENCODING contentEncoding = new JTextField(10); JLabel contentEncodingLabel = new JLabel(JMeterUtils.getResString("content_encoding")); // $NON-NLS-1$ contentEncodingLabel.setLabelFor(contentEncoding); if (notConfigOnly) { method = new JLabeledChoice(JMeterUtils.getResString("method"), // $NON-NLS-1$ HTTPSamplerBase.getValidMethodsAsArray()); } JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); if (showImplementation) { panel.add(httpImplementation); } panel.add(protocolLabel); panel.add(protocol); panel.add(Box.createHorizontalStrut(5)); if (notConfigOnly) { panel.add(method); } panel.setMinimumSize(panel.getPreferredSize()); panel.add(Box.createHorizontalStrut(5)); panel.add(contentEncodingLabel); panel.add(contentEncoding); panel.setMinimumSize(panel.getPreferredSize()); return panel; } protected JTabbedPane getParameterPanel() { postContentTabbedPane = new ValidationTabbedPane(); argsPanel = new HTTPArgumentsPanel(); postContentTabbedPane.add(JMeterUtils.getResString("post_as_parameters"), argsPanel);// $NON-NLS-1$ if (showRawBodyPane) { postBodyContent = new JLabeledTextArea(JMeterUtils.getResString("post_body_raw"));// $NON-NLS-1$ postContentTabbedPane.add(JMeterUtils.getResString("post_body"), postBodyContent);// $NON-NLS-1$ } return postContentTabbedPane; } /** * */ class ValidationTabbedPane extends JTabbedPane { /** * */ private static final long serialVersionUID = 7014311238367882880L; /* (non-Javadoc) * @see javax.swing.JTabbedPane#setSelectedIndex(int) */ @Override public void setSelectedIndex(int index) { setSelectedIndex(index, true); } /** * Apply some check rules if check is true */ public void setSelectedIndex(int index, boolean check) { int oldSelectedIndex = getSelectedIndex(); if (!check || oldSelectedIndex == -1) { super.setSelectedIndex(index); } else if (index != this.getSelectedIndex()) { if (noData(getSelectedIndex())) { // If there is no data, then switching between Parameters and Raw should be // allowed with no further user interaction. argsPanel.clear(); postBodyContent.setText(""); super.setSelectedIndex(index); } else { if (oldSelectedIndex == TAB_RAW_BODY) { // If RAW data and Parameters match we allow switching if (postBodyContent.getText() .equals(computePostBody((Arguments) argsPanel.createTestElement()).trim())) { super.setSelectedIndex(index); } else { // If there is data in the Raw panel, then the user should be // prevented from switching (that would be easy to track). JOptionPane.showConfirmDialog(this, JMeterUtils.getResString("web_cannot_switch_tab"), // $NON-NLS-1$ JMeterUtils.getResString("warning"), // $NON-NLS-1$ JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); return; } } else { // If the Parameter data can be converted (i.e. no names), we // warn the user that the Parameter data will be lost. if (canConvertParameters()) { Object[] options = { JMeterUtils.getResString("confirm"), JMeterUtils.getResString("cancel") }; int n = JOptionPane.showOptionDialog(this, JMeterUtils.getResString("web_parameters_lost_message"), JMeterUtils.getResString("warning"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]); if (n == JOptionPane.YES_OPTION) { convertParametersToRaw(); super.setSelectedIndex(index); } else { return; } } else { // If the Parameter data cannot be converted to Raw, then the user should be // prevented from doing so raise an error dialog JOptionPane.showConfirmDialog(this, JMeterUtils.getResString("web_cannot_convert_parameters_to_raw"), // $NON-NLS-1$ JMeterUtils.getResString("warning"), // $NON-NLS-1$ JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); return; } } } } } } // autoRedirects and followRedirects cannot both be selected public void stateChanged(ChangeEvent e) { if (e.getSource() == autoRedirects) { if (autoRedirects.isSelected()) { followRedirects.setSelected(false); } } if (e.getSource() == followRedirects) { if (followRedirects.isSelected()) { autoRedirects.setSelected(false); } } } /** * Convert Parameters to Raw Body */ void convertParametersToRaw() { postBodyContent.setText(computePostBody((Arguments) argsPanel.createTestElement())); } /** * * @return true if no argument has a name */ boolean canConvertParameters() { Arguments arguments = (Arguments) argsPanel.createTestElement(); for (int i = 0; i < arguments.getArgumentCount(); i++) { if (!StringUtils.isEmpty(arguments.getArgument(i).getName())) { return false; } } return true; } /** * @return true if neither Parameters tab nor Raw Body tab contain data */ boolean noData(int oldSelectedIndex) { if (oldSelectedIndex == TAB_RAW_BODY) { return StringUtils.isEmpty(postBodyContent.getText().trim()); } else { Arguments element = (Arguments) argsPanel.createTestElement(); return StringUtils.isEmpty(computePostBody(element)); } } }