1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 */ 18 19 package org.apache.jmeter.extractor.gui; 20 21 import java.awt.BorderLayout; 22 import java.awt.Component; 23 import java.awt.GridBagConstraints; 24 import java.awt.GridBagLayout; 25 import java.util.List; 26 27 import javax.swing.BorderFactory; 28 import javax.swing.Box; 29 import javax.swing.ButtonGroup; 30 import javax.swing.JPanel; 31 import javax.swing.JRadioButton; 32 33 import org.apache.jmeter.extractor.RegexExtractor; 34 import org.apache.jmeter.processor.gui.AbstractPostProcessorGui; 35 import org.apache.jmeter.testelement.TestElement; 36 import org.apache.jmeter.util.JMeterUtils; 37 import org.apache.jorphan.gui.JLabeledTextField; 38 39 /** 40 * Regular Expression Extractor Post-Processor GUI 41 */ 42 public class RegexExtractorGui extends AbstractPostProcessorGui { 43 private JLabeledTextField regexField; 44 45 private JLabeledTextField templateField; 46 47 private JLabeledTextField defaultField; 48 49 private JLabeledTextField matchNumberField; 50 51 private JLabeledTextField refNameField; 52 53 private JRadioButton useBody; 54 55 private JRadioButton useUnescapedBody; 56 57 private JRadioButton useHeaders; 58 59 private JRadioButton useURL; 60 61 private JRadioButton useCode; 62 63 private JRadioButton useMessage; 64 65 private ButtonGroup group; 66 67 public RegexExtractorGui() { 68 super(); 69 init(); 70 } 71 72 public String getLabelResource() { 73 return "regex_extractor_title"; //$NON-NLS-1$ 74 } 75 76 public void configure(TestElement el) { 77 super.configure(el); 78 if (el instanceof RegexExtractor){ 79 RegexExtractor re = (RegexExtractor) el; 80 useHeaders.setSelected(re.useHeaders()); 81 useBody.setSelected(re.useBody()); 82 useUnescapedBody.setSelected(re.useUnescapedBody()); 83 useURL.setSelected(re.useUrl()); 84 useCode.setSelected(re.useCode()); 85 useMessage.setSelected(re.useMessage()); 86 regexField.setText(re.getRegex()); 87 templateField.setText(re.getTemplate()); 88 defaultField.setText(re.getDefaultValue()); 89 matchNumberField.setText(re.getMatchNumberAsString()); 90 refNameField.setText(re.getRefName()); 91 } 92 } 93 94 /** 95 * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement() 96 */ 97 public TestElement createTestElement() { 98 RegexExtractor extractor = new RegexExtractor(); 99 modifyTestElement(extractor); 100 return extractor; 101 } 102 103 /** 104 * Modifies a given TestElement to mirror the data in the gui components. 105 * 106 * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement) 107 */ 108 public void modifyTestElement(TestElement extractor) { 109 super.configureTestElement(extractor); 110 if (extractor instanceof RegexExtractor) { 111 RegexExtractor regex = (RegexExtractor) extractor; 112 regex.setUseField(group.getSelection().getActionCommand()); 113 regex.setRefName(refNameField.getText()); 114 regex.setRegex(regexField.getText()); 115 regex.setTemplate(templateField.getText()); 116 regex.setDefaultValue(defaultField.getText()); 117 regex.setMatchNumber(matchNumberField.getText()); 118 } 119 } 120 121 /** 122 * Implements JMeterGUIComponent.clearGui 123 */ 124 public void clearGui() { 125 super.clearGui(); 126 127 useBody.setSelected(true); 128 129 regexField.setText(""); //$NON-NLS-1$ 130 templateField.setText(""); //$NON-NLS-1$ 131 defaultField.setText(""); //$NON-NLS-1$ 132 refNameField.setText(""); //$NON-NLS-1$ 133 matchNumberField.setText(""); //$NON-NLS-1$ 134 } 135 136 private void init() { 137 setLayout(new BorderLayout()); 138 setBorder(makeBorder()); 139 140 Box box = Box.createVerticalBox(); 141 box.add(makeTitlePanel()); 142 box.add(makeSourcePanel()); 143 add(box, BorderLayout.NORTH); 144 add(makeParameterPanel(), BorderLayout.CENTER); 145 } 146 147 private JPanel makeSourcePanel() { 148 JPanel panel = new JPanel(); 149 panel.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("regex_source"))); //$NON-NLS-1$ 150 151 useBody = new JRadioButton(JMeterUtils.getResString("regex_src_body")); //$NON-NLS-1$ 152 useUnescapedBody = new JRadioButton(JMeterUtils.getResString("regex_src_body_unescaped")); //$NON-NLS-1$ 153 useHeaders = new JRadioButton(JMeterUtils.getResString("regex_src_hdrs")); //$NON-NLS-1$ 154 useURL = new JRadioButton(JMeterUtils.getResString("regex_src_url")); //$NON-NLS-1$ 155 useCode = new JRadioButton(JMeterUtils.getResString("assertion_code_resp")); //$NON-NLS-1$ 156 useMessage = new JRadioButton(JMeterUtils.getResString("assertion_message_resp")); //$NON-NLS-1$ 157 158 group = new ButtonGroup(); 159 group.add(useBody); 160 group.add(useUnescapedBody); 161 group.add(useHeaders); 162 group.add(useURL); 163 group.add(useCode); 164 group.add(useMessage); 165 166 panel.add(useBody); 167 panel.add(useUnescapedBody); 168 panel.add(useHeaders); 169 panel.add(useURL); 170 panel.add(useCode); 171 panel.add(useMessage); 172 173 useBody.setSelected(true); 174 175 // So we know which button is selected 176 useBody.setActionCommand(RegexExtractor.USE_BODY); 177 useUnescapedBody.setActionCommand(RegexExtractor.USE_BODY_UNESCAPED); 178 useHeaders.setActionCommand(RegexExtractor.USE_HDRS); 179 useURL.setActionCommand(RegexExtractor.USE_URL); 180 useCode.setActionCommand(RegexExtractor.USE_CODE); 181 useMessage.setActionCommand(RegexExtractor.USE_MESSAGE); 182 183 return panel; 184 } 185 186 private JPanel makeParameterPanel() { 187 regexField = new JLabeledTextField(JMeterUtils.getResString("regex_field")); //$NON-NLS-1$ 188 templateField = new JLabeledTextField(JMeterUtils.getResString("template_field")); //$NON-NLS-1$ 189 defaultField = new JLabeledTextField(JMeterUtils.getResString("default_value_field")); //$NON-NLS-1$ 190 refNameField = new JLabeledTextField(JMeterUtils.getResString("ref_name_field")); //$NON-NLS-1$ 191 matchNumberField = new JLabeledTextField(JMeterUtils.getResString("match_num_field")); //$NON-NLS-1$ 192 193 JPanel panel = new JPanel(new GridBagLayout()); 194 GridBagConstraints gbc = new GridBagConstraints(); 195 initConstraints(gbc); 196 addField(panel, refNameField, gbc); 197 resetContraints(gbc); 198 addField(panel, regexField, gbc); 199 resetContraints(gbc); 200 addField(panel, templateField, gbc); 201 resetContraints(gbc); 202 addField(panel, matchNumberField, gbc); 203 resetContraints(gbc); 204 gbc.weighty = 1; 205 addField(panel, defaultField, gbc); 206 return panel; 207 } 208 209 private void addField(JPanel panel, JLabeledTextField field, GridBagConstraints gbc) { 210 List item = field.getComponentList(); 211 panel.add((Component) item.get(0), gbc.clone()); 212 gbc.gridx++; 213 gbc.weightx = 1; 214 gbc.fill=GridBagConstraints.HORIZONTAL; 215 panel.add((Component) item.get(1), gbc.clone()); 216 } 217 218 // Next line 219 private void resetContraints(GridBagConstraints gbc) { 220 gbc.gridx = 0; 221 gbc.gridy++; 222 gbc.weightx = 0; 223 gbc.fill=GridBagConstraints.NONE; 224 } 225 226 private void initConstraints(GridBagConstraints gbc) { 227 gbc.anchor = GridBagConstraints.NORTHWEST; 228 gbc.fill = GridBagConstraints.NONE; 229 gbc.gridheight = 1; 230 gbc.gridwidth = 1; 231 gbc.gridx = 0; 232 gbc.gridy = 0; 233 gbc.weightx = 0; 234 gbc.weighty = 0; 235 } 236 }