You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2006/06/02 21:14:53 UTC

svn commit: r411255 - in /jakarta/jmeter/branches/rel-2-1: src/components/org/apache/jmeter/extractor/ src/components/org/apache/jmeter/extractor/gui/ test/src/org/apache/jmeter/extractor/ xdocs/ xdocs/images/screenshots/

Author: sebb
Date: Fri Jun  2 12:14:53 2006
New Revision: 411255

URL: http://svn.apache.org/viewvc?rev=411255&view=rev
Log:
Bug 39707 - allow Regex match against URL

Modified:
    jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/RegexExtractor.java
    jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/gui/RegexExtractorGui.java
    jakarta/jmeter/branches/rel-2-1/test/src/org/apache/jmeter/extractor/TestRegexExtractor.java
    jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml
    jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/regex_extractor.png

Modified: jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/RegexExtractor.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/RegexExtractor.java?rev=411255&r1=411254&r2=411255&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/RegexExtractor.java (original)
+++ jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/RegexExtractor.java Fri Jun  2 12:14:53 2006
@@ -50,24 +50,39 @@
  */
 public class RegexExtractor extends AbstractTestElement implements PostProcessor, Serializable {
 
-    private static final Logger log = LoggingManager.getLoggerForClass();
 
-	public static final String USEHEADERS = "RegexExtractor.useHeaders"; // $NON-NLS-1$
+	private static final Logger log = LoggingManager.getLoggerForClass();
 
-	public static final String REGEX = "RegexExtractor.regex"; // $NON-NLS-1$
+	// What to match against. N.B. do not change the string value or test plans will break!
+	private static final String MATCH_AGAINST = "RegexExtractor.useHeaders"; // $NON-NLS-1$
+	/*
+	 * Permissible values: 
+	 *  true - match against headers
+	 *  false or absent - match against body (this was the original default)
+	 *  URL - match against URL
+	 *  These are passed to the setUseField() method
+	 *  
+	 *  Do not change these values!
+	*/
+	public static final String USE_HDRS = "true"; // $NON-NLS-1$
+	public static final String USE_BODY = "false"; // $NON-NLS-1$
+    public static final String USE_URL = "URL"; // $NON-NLS-1$
+
+	private static final String REGEX = "RegexExtractor.regex"; // $NON-NLS-1$
 
-	public static final String REFNAME = "RegexExtractor.refname"; // $NON-NLS-1$
+	private static final String REFNAME = "RegexExtractor.refname"; // $NON-NLS-1$
 
-	public static final String MATCH_NUMBER = "RegexExtractor.match_number"; // $NON-NLS-1$
+	private static final String MATCH_NUMBER = "RegexExtractor.match_number"; // $NON-NLS-1$
 
-	public static final String DEFAULT = "RegexExtractor.default"; // $NON-NLS-1$
+	private static final String DEFAULT = "RegexExtractor.default"; // $NON-NLS-1$
 
-	public static final String TEMPLATE = "RegexExtractor.template"; // $NON-NLS-1$
+	private static final String TEMPLATE = "RegexExtractor.template"; // $NON-NLS-1$
 
     private static final String REF_MATCH_NR = "_matchNr"; // $NON-NLS-1$
 
     private static final String UNDERSCORE = "_";  // $NON-NLS-1$
 
+
     private Object[] template = null;
 
 	private static PatternCacheLRU patternCache = new PatternCacheLRU(1000, new Perl5Compiler());
@@ -104,13 +119,22 @@
         }
 
 		Perl5Matcher matcher = (Perl5Matcher) localMatcher.get();
-		PatternMatcherInput input = new PatternMatcherInput(
-                useHeaders() 
-                        ? previousResult.getResponseHeaders()
-                        : previousResult.getResponseDataAsString()); // Bug 36898
-		log.debug("Regex = " + getRegex());
+		String inputString = 
+			useUrl() ? previousResult.getUrlAsString() // Bug 39707 
+			:
+			useHeaders() ? previousResult.getResponseHeaders()
+		    : previousResult.getResponseDataAsString() // Bug 36898
+		    ; 
+   		if (log.isDebugEnabled()) {
+   			log.debug("Input = " + inputString);
+   		}
+		PatternMatcherInput input = new PatternMatcherInput(inputString);
+   		String regex = getRegex();
+		if (log.isDebugEnabled()) {
+			log.debug("Regex = " + regex);
+   		}
 		try {
-			Pattern pattern = patternCache.getPattern(getRegex(), Perl5Compiler.READ_ONLY_MASK);
+			Pattern pattern = patternCache.getPattern(regex, Perl5Compiler.READ_ONLY_MASK);
 			List matches = new ArrayList();
 			int x = 0;
 			boolean done = false;
@@ -168,7 +192,7 @@
 				log.warn("Error while generating result");
 			}
 		} catch (MalformedCachePatternException e) {
-			log.warn("Error in pattern: " + getRegex());
+			log.warn("Error in pattern: " + regex);
 		}
 	}
 
@@ -309,10 +333,18 @@
 		setProperty(new IntegerProperty(MATCH_NUMBER, matchNumber));
 	}
 
+	public void setMatchNumber(String matchNumber) {
+		setProperty(MATCH_NUMBER, matchNumber);
+	}
+
 	public int getMatchNumber() {
 		return getPropertyAsInt(MATCH_NUMBER);
 	}
 
+	public String getMatchNumberAsString() {
+		return getPropertyAsString(MATCH_NUMBER);
+	}
+
 	/**
 	 * Sets the value of the variable if no matches are found
 	 * 
@@ -334,7 +366,23 @@
 		return getPropertyAsString(TEMPLATE);
 	}
 
-	boolean useHeaders() {
-		return "true".equalsIgnoreCase(getPropertyAsString(USEHEADERS));
+	public boolean useHeaders() {
+		return USE_HDRS.equalsIgnoreCase( getPropertyAsString(MATCH_AGAINST));
+	}
+
+	// Allow for property not yet being set (probably only applies to Test cases)
+	public boolean useBody() {
+    	String body = getPropertyAsString(MATCH_AGAINST);
+        return body.length()==0 || USE_BODY.equalsIgnoreCase(body);// $NON-NLS-1$
+    }
+
+	public boolean useUrl() {
+    	String body = getPropertyAsString(MATCH_AGAINST);
+        return USE_URL.equalsIgnoreCase(body);
+    }
+	public void setUseField(String actionCommand) {
+		setProperty(MATCH_AGAINST,actionCommand);
+		// TODO Auto-generated method stub
+		
 	}
 }

Modified: jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/gui/RegexExtractorGui.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/gui/RegexExtractorGui.java?rev=411255&r1=411254&r2=411255&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/gui/RegexExtractorGui.java (original)
+++ jakarta/jmeter/branches/rel-2-1/src/components/org/apache/jmeter/extractor/gui/RegexExtractorGui.java Fri Jun  2 12:14:53 2006
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003-2004 The Apache Software Foundation.
+ * Copyright 2003-2004,2006 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -34,7 +34,6 @@
 import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.gui.JLabeledTextField;
-import org.apache.jorphan.util.JOrphanUtils;
 
 /**
  */
@@ -49,10 +48,13 @@
 
 	private JLabeledTextField refNameField;
 
-	// NOTUSED private JCheckBox scanHeader;
 	private JRadioButton useBody;
 
 	private JRadioButton useHeaders;
+    
+    private JRadioButton useURL;
+
+	private ButtonGroup group;
 
 	public RegexExtractorGui() {
 		super();
@@ -60,18 +62,22 @@
 	}
 
 	public String getLabelResource() {
-		return "regex_extractor_title";
+		return "regex_extractor_title"; //$NON-NLS-1$
 	}
 
 	public void configure(TestElement el) {
 		super.configure(el);
-		useHeaders.setSelected(el.getPropertyAsBoolean(RegexExtractor.USEHEADERS));
-		useBody.setSelected(!el.getPropertyAsBoolean(RegexExtractor.USEHEADERS));
-		regexField.setText(el.getPropertyAsString(RegexExtractor.REGEX));
-		templateField.setText(el.getPropertyAsString(RegexExtractor.TEMPLATE));
-		defaultField.setText(el.getPropertyAsString(RegexExtractor.DEFAULT));
-		matchNumberField.setText(el.getPropertyAsString(RegexExtractor.MATCH_NUMBER));
-		refNameField.setText(el.getPropertyAsString(RegexExtractor.REFNAME));
+		if (el instanceof RegexExtractor){
+			RegexExtractor re = (RegexExtractor) el;
+			useHeaders.setSelected(re.useHeaders());
+			useBody.setSelected(re.useBody());
+	        useURL.setSelected(re.useUrl());
+			regexField.setText(re.getRegex());
+			templateField.setText(re.getTemplate());
+			defaultField.setText(re.getDefaultValue());
+			matchNumberField.setText(re.getMatchNumberAsString());
+			refNameField.setText(re.getRefName());
+		}
 	}
 
 	/**
@@ -90,14 +96,18 @@
 	 */
 	public void modifyTestElement(TestElement extractor) {
 		super.configureTestElement(extractor);
-		extractor.setProperty(RegexExtractor.USEHEADERS, JOrphanUtils.booleanToString(useHeaders.isSelected()));
-		extractor.setProperty(RegexExtractor.MATCH_NUMBER, matchNumberField.getText());
 		if (extractor instanceof RegexExtractor) {
 			RegexExtractor regex = (RegexExtractor) extractor;
+			regex.setUseField(group.getSelection().getActionCommand());
+//			regex.setUseHeaders(useHeaders.isSelected());
+//			regex.setUseBody(useBody.isSelected());
+//			regex.setUseUrl(useURL.isSelected());
+			
 			regex.setRefName(refNameField.getText());
 			regex.setRegex(regexField.getText());
 			regex.setTemplate(templateField.getText());
 			regex.setDefaultValue(defaultField.getText());
+			regex.setMatchNumber(matchNumberField.getText());
 		}
 	}
 
@@ -114,28 +124,35 @@
 
 	private JPanel makeSourcePanel() {
 		JPanel panel = new JPanel();
-		panel.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("regex_source")));
+		panel.setBorder(BorderFactory.createTitledBorder(JMeterUtils.getResString("regex_source"))); //$NON-NLS-1$
 
-		useBody = new JRadioButton(JMeterUtils.getResString("regex_src_body"));
-		useHeaders = new JRadioButton(JMeterUtils.getResString("regex_src_hdrs"));
+		useBody = new JRadioButton(JMeterUtils.getResString("regex_src_body")); //$NON-NLS-1$
+		useHeaders = new JRadioButton(JMeterUtils.getResString("regex_src_hdrs")); //$NON-NLS-1$
+        useURL = new JRadioButton(JMeterUtils.getResString("regex_src_url")); //$NON-NLS-1$
 
-		ButtonGroup group = new ButtonGroup();
+		group = new ButtonGroup();
 		group.add(useBody);
 		group.add(useHeaders);
+        group.add(useURL);
 
 		panel.add(useBody);
 		panel.add(useHeaders);
+        panel.add(useURL);
 
 		useBody.setSelected(true);
+		
+		useBody.setActionCommand(RegexExtractor.USE_BODY);
+		useHeaders.setActionCommand(RegexExtractor.USE_HDRS);
+		useURL.setActionCommand(RegexExtractor.USE_URL);
 		return panel;
 	}
 
 	private JPanel makeParameterPanel() {
-		regexField = new JLabeledTextField(JMeterUtils.getResString("regex_field"));
-		templateField = new JLabeledTextField(JMeterUtils.getResString("template_field"));
-		defaultField = new JLabeledTextField(JMeterUtils.getResString("default_value_field"));
-		refNameField = new JLabeledTextField(JMeterUtils.getResString("ref_name_field"));
-		matchNumberField = new JLabeledTextField(JMeterUtils.getResString("match_num_field"));
+		regexField = new JLabeledTextField(JMeterUtils.getResString("regex_field")); //$NON-NLS-1$
+		templateField = new JLabeledTextField(JMeterUtils.getResString("template_field")); //$NON-NLS-1$
+		defaultField = new JLabeledTextField(JMeterUtils.getResString("default_value_field")); //$NON-NLS-1$
+		refNameField = new JLabeledTextField(JMeterUtils.getResString("ref_name_field")); //$NON-NLS-1$
+		matchNumberField = new JLabeledTextField(JMeterUtils.getResString("match_num_field")); //$NON-NLS-1$
 
 		JPanel panel = new JPanel(new GridBagLayout());
 		GridBagConstraints gbc = new GridBagConstraints();

Modified: jakarta/jmeter/branches/rel-2-1/test/src/org/apache/jmeter/extractor/TestRegexExtractor.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-1/test/src/org/apache/jmeter/extractor/TestRegexExtractor.java?rev=411255&r1=411254&r2=411255&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-1/test/src/org/apache/jmeter/extractor/TestRegexExtractor.java (original)
+++ jakarta/jmeter/branches/rel-2-1/test/src/org/apache/jmeter/extractor/TestRegexExtractor.java Fri Jun  2 12:14:53 2006
@@ -18,6 +18,8 @@
 package org.apache.jmeter.extractor;
 
 
+import java.net.URL;
+
 import junit.framework.TestCase;
 
 import org.apache.jmeter.samplers.SampleResult;
@@ -176,11 +178,38 @@
 			extractor.setRegex("Header1: (\\S+)");
 			extractor.setTemplate("$1$");
 			extractor.setMatchNumber(1);
+			assertTrue("useBody should be true", extractor.useBody());
+			assertFalse("useHdrs should be false", extractor.useHeaders());
+			assertFalse("useURL should be false", extractor.useUrl());
+			extractor.setUseField(RegexExtractor.USE_BODY);
+			assertTrue("useBody should be true", extractor.useBody());
 			assertFalse("useHdrs should be false", extractor.useHeaders());
-			extractor.setProperty(RegexExtractor.USEHEADERS, "true");
+			assertFalse("useURL should be false", extractor.useUrl());
+			extractor.setUseField(RegexExtractor.USE_HDRS);
 			assertTrue("useHdrs should be true", extractor.useHeaders());
+			assertFalse("useBody should be false", extractor.useBody());
+			assertFalse("useURL should be false", extractor.useUrl());
 			extractor.process();
 			assertEquals("Value1", vars.get("regVal"));
+			extractor.setUseField(RegexExtractor.USE_URL);
+			assertFalse("useHdrs should be false", extractor.useHeaders());
+			assertFalse("useBody should be false", extractor.useBody());
+			assertTrue("useURL should be true", extractor.useUrl());
+		}
+
+		public void testVariableExtraction8() throws Exception {
+			extractor.setRegex("http://jakarta\\.apache\\.org/(\\w+)");
+			extractor.setTemplate("$1$");
+			extractor.setMatchNumber(1);
+			extractor.setUseField(RegexExtractor.USE_URL);
+			assertFalse("useHdrs should be false", extractor.useHeaders());
+			assertFalse("useBody should be false", extractor.useBody());
+			assertTrue("useURL should be true", extractor.useUrl());
+			extractor.process();
+			assertNull(vars.get("regVal"));
+			result.setURL(new URL("http://jakarta.apache.org/index.html?abcd"));
+			extractor.process();
+			assertEquals("index",vars.get("regVal"));
 		}
 
         public void testNoDefault() throws Exception {

Modified: jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml?rev=411255&r1=411254&r2=411255&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml Fri Jun  2 12:14:53 2006
@@ -109,6 +109,7 @@
 <li>Automatically include properties from user.properties file</li>
 <li>Add __jexl() function - evaluates Commons JEXL expressions</li>
 <li>Optionally load JMeter properties from user.properties and system properties from system.properties.</li>
+<li>Bug 39707 - allow Regex match against URL</li>
 </ul>
 
 <h4>Bug fixes:</h4>

Modified: jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/regex_extractor.png
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-1/xdocs/images/screenshots/regex_extractor.png?rev=411255&r1=411254&r2=411255&view=diff
==============================================================================
Binary files - no diff available.



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