Add testcase for <replaceregexp>, this task now works with ORO, Jakarta Regexp and JDK 1.4 if you use \1 to refer to parens in the regular expression. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269822 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -4,6 +4,12 @@ Changes from Ant 1.4.1 to current CVS version | |||
| Changes that could break older environments: | |||
| -------------------------------------------- | |||
| * the RegexpMatcher interface has been extended to support case | |||
| insensitive matches and other options - custom implementations of | |||
| this interface won't work any longer. We recommend to use the new | |||
| Regexp interface that also supports substitution instead of the | |||
| RegexpMatcher interface in the future. | |||
| Fixed bugs: | |||
| ----------- | |||
| @@ -36,6 +36,7 @@ | |||
| <property name="ant.package" value="org/apache/tools/ant"/> | |||
| <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||
| <property name="regexp.package" value="${ant.package}/util/regexp"/> | |||
| <property name="manifest" value="src/etc/manifest"/> | |||
| @@ -218,11 +219,11 @@ | |||
| deprecation="${deprecation}" | |||
| optimize="${optimize}" > | |||
| <classpath refid="classpath" /> | |||
| <exclude name="${ant.package}/util/regexp/JakartaRegexp*.java" | |||
| <exclude name="${regexp.package}/JakartaRegexp*.java" | |||
| unless="jakarta.regexp.present" /> | |||
| <exclude name="${ant.package}/util/regexp/JakartaOro*.java" | |||
| <exclude name="${regexp.package}/JakartaOro*.java" | |||
| unless="jakarta.oro.present" /> | |||
| <exclude name="${ant.package}/util/regexp/Jdk14Regexp*.java" | |||
| <exclude name="${regexp.package}/Jdk14Regexp*.java" | |||
| unless="jdk1.4+" /> | |||
| <exclude name="${ant.package}/AntSecurityManager.java" | |||
| unless="jdk1.2+" /> | |||
| @@ -650,11 +651,11 @@ | |||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | |||
| unless="antlr.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexp*Test.java" | |||
| <exclude name="${regexp.package}/JakartaRegexp*Test.java" | |||
| unless="jakarta.regexp.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOro*Test.java" | |||
| <exclude name="${regexp.package}/JakartaOro*Test.java" | |||
| unless="jakarta.oro.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14Regexp*Test.java" | |||
| <exclude name="${regexp.package}/Jdk14Regexp*Test.java" | |||
| unless="jdk1.4+" /> | |||
| <exclude name="org/apache/tools/ant/taskdefs/optional/sitraka/*.java" | |||
| unless="jakarta.oro.present" /> | |||
| @@ -705,7 +706,8 @@ | |||
| <include name="**/*Test*" /> | |||
| <!-- abstract class, not a testcase --> | |||
| <exclude name="org/apache/tools/ant/taskdefs/TaskdefsTest.java" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/RegexpMatcherTest.java" /> | |||
| <exclude name="${regexp.package}/RegexpMatcherTest.java" /> | |||
| <exclude name="${regexp.package}/RegexpTest.java" /> | |||
| <!-- helper classes, not testcases --> | |||
| <exclude name="org/apache/tools/ant/taskdefs/TaskdefTest*Task.java" /> | |||
| @@ -720,14 +722,20 @@ | |||
| <!-- only run these tests if their required libraries are installed --> | |||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | |||
| unless="antlr.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexp*Test.java" | |||
| <exclude name="${regexp.package}/JakartaRegexp*Test.java" | |||
| unless="jakarta.regexp.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOro*Test.java" | |||
| <exclude name="${regexp.package}/JakartaOro*Test.java" | |||
| unless="jakarta.oro.present" /> | |||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14Regexp*Test.java" | |||
| <exclude name="${regexp.package}/Jdk14Regexp*Test.java" | |||
| unless="jdk1.4+" /> | |||
| <exclude name="${optional.package}/ide/VAJExportTest.java" unless="vaj.present" /> | |||
| <exclude name="${optional.package}/sitraka/*.java" unless="jakarta.oro.present" /> | |||
| <exclude name="${optional.package}/ReplaceRegExpTest.java" | |||
| unless="some.regexp.support" /> | |||
| <!-- defer for now --> | |||
| <exclude name="${regexp.package}/MatcherWrappedAsRegexpTest.java" | |||
| unless="invalid-some.regexp.support" /> | |||
| <!-- run when you have the environment setup to support them --> | |||
| <exclude name="org/apache/tools/ant/taskdefs/optional/net/FtpTest.java" /> | |||
| @@ -1,10 +1,14 @@ | |||
| <project name="test" default="def" basedir="."> | |||
| <target name="def"> | |||
| <fail>This build file should only be run from within the testcase</fail> | |||
| </target> | |||
| <target name="setup"> | |||
| <copy file="replaceregexp.properties" tofile="test.properties" /> | |||
| </target> | |||
| <target name="def" depends="setup"> | |||
| <target name="testReplace" depends="setup"> | |||
| <replaceregexp file="test.properties" byline="true"> | |||
| <regularexpression pattern="Old(.*)=(.*)" /> | |||
| <substitution expression="NewProp=\1\2" /> | |||
| @@ -75,15 +75,38 @@ public class JakartaOroRegexp extends JakartaOroMatcher implements Regexp | |||
| public String substitute(String input, String argument, int options) | |||
| throws BuildException | |||
| { | |||
| // Determine replacement Type | |||
| int sOptions = getSubsOptions(options); | |||
| // translate \1 to $1 so that the Perl5Substitution will work | |||
| StringBuffer subst = new StringBuffer(); | |||
| for (int i=0; i<argument.length(); i++) { | |||
| char c = argument.charAt(i); | |||
| if (c == '\\') { | |||
| if (++i < argument.length()) { | |||
| c = argument.charAt(i); | |||
| int value = Character.digit(c, 10); | |||
| if (value > -1) { | |||
| subst.append("$").append(value); | |||
| } else { | |||
| subst.append(c); | |||
| } | |||
| } else { | |||
| // XXX - should throw an exception instead? | |||
| subst.append('\\'); | |||
| } | |||
| } else { | |||
| subst.append(c); | |||
| } | |||
| } | |||
| // Do the substitution | |||
| Substitution s = new Perl5Substitution(argument, sOptions); | |||
| Substitution s = | |||
| new Perl5Substitution(subst.toString(), | |||
| Perl5Substitution.INTERPOLATE_ALL); | |||
| return Util.substitute(matcher, | |||
| getCompiledPattern(options), | |||
| s, | |||
| input); | |||
| input, | |||
| getSubsOptions(options)); | |||
| } | |||
| protected int getSubsOptions(int options) | |||
| @@ -81,8 +81,33 @@ public class JakartaRegexpRegexp extends JakartaRegexpMatcher implements Regexp | |||
| public String substitute(String input, String argument, int options) | |||
| throws BuildException | |||
| { | |||
| int sOptions = getSubsOptions(options); | |||
| Vector v = getGroups(input, options); | |||
| // replace \1 with the corresponding group | |||
| StringBuffer result = new StringBuffer(); | |||
| for (int i=0; i<argument.length(); i++) { | |||
| char c = argument.charAt(i); | |||
| if (c == '\\') { | |||
| if (++i < argument.length()) { | |||
| c = argument.charAt(i); | |||
| int value = Character.digit(c, 10); | |||
| if (value > -1) { | |||
| result.append((String) v.elementAt(value)); | |||
| } else { | |||
| result.append(c); | |||
| } | |||
| } else { | |||
| // XXX - should throw an exception instead? | |||
| result.append('\\'); | |||
| } | |||
| } else { | |||
| result.append(c); | |||
| } | |||
| } | |||
| argument = result.toString(); | |||
| RE reg = getCompiledPattern(options); | |||
| int sOptions = getSubsOptions(options); | |||
| return reg.subst(input, argument, sOptions); | |||
| } | |||
| } | |||
| @@ -83,6 +83,29 @@ public class Jdk14RegexpRegexp extends Jdk14RegexpMatcher implements Regexp | |||
| public String substitute(String input, String argument, int options) | |||
| throws BuildException | |||
| { | |||
| // translate \1 to $(1) so that the Matcher will work | |||
| StringBuffer subst = new StringBuffer(); | |||
| for (int i=0; i<argument.length(); i++) { | |||
| char c = argument.charAt(i); | |||
| if (c == '\\') { | |||
| if (++i < argument.length()) { | |||
| c = argument.charAt(i); | |||
| int value = Character.digit(c, 10); | |||
| if (value > -1) { | |||
| subst.append("$(").append(value).append(")"); | |||
| } else { | |||
| subst.append(c); | |||
| } | |||
| } else { | |||
| // XXX - should throw an exception instead? | |||
| subst.append('\\'); | |||
| } | |||
| } else { | |||
| subst.append(c); | |||
| } | |||
| } | |||
| argument = subst.toString(); | |||
| int sOptions = getSubsOptions(options); | |||
| Pattern p = getCompiledPattern(options); | |||
| StringBuffer sb = new StringBuffer(); | |||
| @@ -95,10 +118,12 @@ public class Jdk14RegexpRegexp extends Jdk14RegexpMatcher implements Regexp | |||
| else | |||
| { | |||
| boolean res = m.find(); | |||
| if (res) | |||
| if (res) { | |||
| m.appendReplacement(sb, argument); | |||
| else | |||
| m.appendTail(sb); | |||
| } else { | |||
| sb.append(input); | |||
| } | |||
| } | |||
| return sb.toString(); | |||
| @@ -0,0 +1,160 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| import org.apache.tools.ant.BuildException; | |||
| import java.util.Vector; | |||
| /** | |||
| * Helper class that adapts a RegexpMatcher to a Regexp. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class MatcherWrappedAsRegexp implements Regexp { | |||
| private RegexpMatcher matcher; | |||
| public MatcherWrappedAsRegexp(RegexpMatcher matcher) { | |||
| this.matcher = matcher; | |||
| } | |||
| /** | |||
| * Set the regexp pattern from the String description. | |||
| */ | |||
| public void setPattern(String pattern) throws BuildException { | |||
| matcher.setPattern(pattern); | |||
| } | |||
| /** | |||
| * Get a String representation of the regexp pattern | |||
| */ | |||
| public String getPattern() throws BuildException { | |||
| return matcher.getPattern(); | |||
| } | |||
| /** | |||
| * Does the given argument match the pattern? | |||
| */ | |||
| public boolean matches(String argument) throws BuildException { | |||
| return matcher.matches(argument); | |||
| } | |||
| /** | |||
| * Returns a Vector of matched groups found in the argument. | |||
| * | |||
| * <p>Group 0 will be the full match, the rest are the | |||
| * parenthesized subexpressions</p>. | |||
| */ | |||
| public Vector getGroups(String argument) throws BuildException { | |||
| return matcher.getGroups(argument); | |||
| } | |||
| /** | |||
| * Does this regular expression match the input, given | |||
| * certain options | |||
| * @param input The string to check for a match | |||
| * @param options The list of options for the match. See the | |||
| * MATCH_ constants above. | |||
| */ | |||
| public boolean matches(String input, int options) throws BuildException { | |||
| return matcher.matches(input, options); | |||
| } | |||
| /** | |||
| * Get the match groups from this regular expression. The return | |||
| * type of the elements is always String. | |||
| * @param input The string to check for a match | |||
| * @param options The list of options for the match. See the | |||
| * MATCH_ constants above. | |||
| */ | |||
| public Vector getGroups(String input, int options) throws BuildException { | |||
| return matcher.getGroups(input, options); | |||
| } | |||
| /** | |||
| * Perform a substitution on the regular expression. | |||
| * @param input The string to substitute on | |||
| * @param argument The string which defines the substitution | |||
| * @param options The list of options for the match and replace. See the | |||
| * MATCH_ and REPLACE_ constants above. | |||
| * REPLACE_ constants will be ignored. | |||
| */ | |||
| public String substitute(String input, String argument, int options) | |||
| throws BuildException { | |||
| Vector v = matcher.getGroups(input, options); | |||
| StringBuffer result = new StringBuffer(); | |||
| char[] to = argument.toCharArray(); | |||
| for (int i=0; i<to.length; i++) { | |||
| if (to[i] == '\\') { | |||
| if (++i < to.length) { | |||
| int value = Character.digit(to[i], 10); | |||
| if (value > -1) { | |||
| result.append((String) v.elementAt(value)); | |||
| } else { | |||
| result.append(to[i]); | |||
| } | |||
| } else { | |||
| // XXX - should throw an exception instead? | |||
| result.append('\\'); | |||
| } | |||
| } else { | |||
| result.append(to[i]); | |||
| } | |||
| } | |||
| return result.toString(); | |||
| } | |||
| } | |||
| @@ -63,6 +63,17 @@ import org.apache.tools.ant.BuildException; | |||
| */ | |||
| public interface Regexp extends RegexpMatcher | |||
| { | |||
| /** | |||
| * Replace only the first occurance of the regular expression | |||
| */ | |||
| int REPLACE_FIRST = 0x00000001; | |||
| /** | |||
| * Replace all occurances of the regular expression | |||
| */ | |||
| int REPLACE_ALL = 0x00000010; | |||
| /** | |||
| * Perform a substitution on the regular expression. | |||
| * @param input The string to substitute on | |||
| @@ -90,24 +90,33 @@ public class RegexpFactory extends RegexpMatcherFactory | |||
| } | |||
| if (systemDefault != null) { | |||
| return (Regexp)createInstance(systemDefault); | |||
| return createRegexpInstance(systemDefault); | |||
| // XXX should we silently catch possible exceptions and try to | |||
| // load a different implementation? | |||
| } | |||
| try { | |||
| return (Regexp)createInstance("org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp"); | |||
| return createRegexpInstance("org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp"); | |||
| } catch (BuildException be) {} | |||
| try { | |||
| return (Regexp)createInstance("org.apache.tools.ant.util.regexp.JakartaOroRegexp"); | |||
| return createRegexpInstance("org.apache.tools.ant.util.regexp.JakartaOroRegexp"); | |||
| } catch (BuildException be) {} | |||
| try { | |||
| return (Regexp)createInstance("org.apache.tools.ant.util.regexp.JakartaRegexpRegexp"); | |||
| return createRegexpInstance("org.apache.tools.ant.util.regexp.JakartaRegexpRegexp"); | |||
| } catch (BuildException be) {} | |||
| throw new BuildException("No supported regular expression matcher found"); | |||
| } | |||
| protected Regexp createRegexpInstance(String classname) { | |||
| RegexpMatcher m = createInstance(classname); | |||
| if (m instanceof Regexp) { | |||
| return (Regexp) m; | |||
| } else { | |||
| return new MatcherWrappedAsRegexp(m); | |||
| } | |||
| } | |||
| } | |||
| @@ -65,16 +65,6 @@ import java.util.Vector; | |||
| */ | |||
| public interface RegexpMatcher { | |||
| /*** | |||
| * Replace only the first occurance of the regular expression | |||
| */ | |||
| int REPLACE_FIRST = 0x00000001; | |||
| /*** | |||
| * Replace all occurances of the regular expression | |||
| */ | |||
| int REPLACE_ALL = 0x00000010; | |||
| /*** | |||
| * Default Mask (case insensitive, neither multiline nor | |||
| * singleline specified). | |||
| @@ -0,0 +1,114 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.optional; | |||
| import org.apache.tools.ant.taskdefs.TaskdefsTest; | |||
| import java.util.Properties; | |||
| import java.io.FileInputStream; | |||
| import java.io.IOException; | |||
| /** | |||
| * JUnit Testcase for the optional replaceregexp task. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class ReplaceRegExpTest extends TaskdefsTest { | |||
| public ReplaceRegExpTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/optional/replaceregexp.xml"); | |||
| } | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||
| public void testReplace() throws IOException { | |||
| Properties original = new Properties(); | |||
| FileInputStream propsFile = null; | |||
| try { | |||
| propsFile = new FileInputStream("src/etc/testcases/taskdefs/optional/replaceregexp.properties"); | |||
| original.load(propsFile); | |||
| } finally { | |||
| if (propsFile != null) { | |||
| propsFile.close(); | |||
| propsFile = null; | |||
| } | |||
| } | |||
| assertEquals("Def", original.get("OldAbc")); | |||
| executeTarget("testReplace"); | |||
| Properties after = new Properties(); | |||
| try { | |||
| propsFile = new FileInputStream("src/etc/testcases/taskdefs/optional/test.properties"); | |||
| after.load(propsFile); | |||
| } finally { | |||
| if (propsFile != null) { | |||
| propsFile.close(); | |||
| propsFile = null; | |||
| } | |||
| } | |||
| assertNull(after.get("OldAbc")); | |||
| assertEquals("AbcDef", after.get("NewProp")); | |||
| } | |||
| }// ReplaceRegExpTest | |||
| @@ -0,0 +1,72 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| /** | |||
| * Tests for the jakarta-oro implementation of the Regexp interface. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class JakartaOroRegexpTest extends RegexpTest { | |||
| public Regexp getRegexpImplementation() { | |||
| return new JakartaOroRegexp(); | |||
| } | |||
| public JakartaOroRegexpTest(String name) { | |||
| super(name); | |||
| } | |||
| } | |||
| @@ -0,0 +1,76 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| /** | |||
| * Tests for the jakarta-regexp implementation of the Regexp interface. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class JakartaRegexpRegexpTest extends RegexpTest { | |||
| public Regexp getRegexpImplementation() { | |||
| return new JakartaRegexpRegexp(); | |||
| } | |||
| public JakartaRegexpRegexpTest(String name) { | |||
| super(name); | |||
| } | |||
| /** | |||
| * Fails for "default" mode. | |||
| */ | |||
| protected void doEndTest2(String text) {} | |||
| } | |||
| @@ -0,0 +1,72 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| /** | |||
| * Tests for the JDK 1.4 implementation of the Regexp interface. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class Jdk14RegexpRegexpTest extends RegexpTest { | |||
| public Regexp getRegexpImplementation() { | |||
| return new Jdk14RegexpRegexp(); | |||
| } | |||
| public Jdk14RegexpRegexpTest(String name) { | |||
| super(name); | |||
| } | |||
| } | |||
| @@ -0,0 +1,85 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| /** | |||
| * Test for the wrapped implementation of the Regexp Interface. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class MatcherWrappedAsRegexpTest extends RegexpTest { | |||
| public MatcherWrappedAsRegexpTest(String name) { | |||
| super(name); | |||
| } | |||
| public Regexp getRegexpImplementation() { | |||
| RegexpMatcherFactory fac = new RegexpMatcherFactory(); | |||
| return new MatcherWrappedAsRegexp(fac.newRegexpMatcher()); | |||
| } | |||
| /** | |||
| * Jakarta Regexp fails for "default" mode. | |||
| */ | |||
| protected void doEndTest2(String text) { | |||
| RegexpMatcherFactory fac = new RegexpMatcherFactory(); | |||
| RegexpMatcher m = fac.newRegexpMatcher(); | |||
| if (m.getClass().getName().equals("org.apache.tools.ant.util.regexp.JakartaRegexpMatcher")) { | |||
| // ignore | |||
| } else { | |||
| super.doEndTest2(text); | |||
| } | |||
| } | |||
| } | |||
| @@ -72,6 +72,8 @@ public abstract class RegexpMatcherTest extends TestCase { | |||
| public abstract RegexpMatcher getImplementation(); | |||
| protected final RegexpMatcher getReg() {return reg;} | |||
| public RegexpMatcherTest(String name) { | |||
| super(name); | |||
| } | |||
| @@ -0,0 +1,100 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2001 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.util.regexp; | |||
| /** | |||
| * Tests for all implementations of the Regexp interface. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public abstract class RegexpTest extends RegexpMatcherTest { | |||
| private static final String test = "abcdefg-abcdefg"; | |||
| private static final String pattern = "ab([^d]*)d([^f]*)f"; | |||
| public RegexpTest(String name) { | |||
| super(name); | |||
| } | |||
| public final RegexpMatcher getImplementation() { | |||
| return getRegexpImplementation(); | |||
| } | |||
| public abstract Regexp getRegexpImplementation(); | |||
| public void testSubstitution() { | |||
| Regexp reg = (Regexp) getReg(); | |||
| reg.setPattern(pattern); | |||
| assertTrue(reg.matches(test)); | |||
| assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f", | |||
| Regexp.MATCH_DEFAULT)); | |||
| } | |||
| public void testReplaceFirstSubstitution() { | |||
| Regexp reg = (Regexp) getReg(); | |||
| reg.setPattern(pattern); | |||
| assertTrue(reg.matches(test)); | |||
| assertEquals("abedcfg-abcdefg", reg.substitute(test, "ab\\2d\\1f", | |||
| Regexp.REPLACE_FIRST)); | |||
| } | |||
| public void testReplaceAllSubstitution() { | |||
| Regexp reg = (Regexp) getReg(); | |||
| reg.setPattern(pattern); | |||
| assertTrue(reg.matches(test)); | |||
| assertEquals("abedcfg-abedcfg", reg.substitute(test, "ab\\2d\\1f", | |||
| Regexp.REPLACE_ALL)); | |||
| } | |||
| } | |||