New optional replaceregexp tasks that takes advantage of it. Submitted by: Matthew Inger <matti@sedonacorp.com> This doesn't really work (but doesn't break anything either), but I wanted to get the stuff committed now, I will put work into it tomorrow. See mail to the list for details. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269820 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -17,6 +17,8 @@ Fixed bugs: | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| * New task replaceregexp | |||||
| * The attributes zipfile, jarfile, warfile and earfile (from the Zip, | * The attributes zipfile, jarfile, warfile and earfile (from the Zip, | ||||
| Jar, War and Ear tasks) have been deprecated and superseded by a | Jar, War and Ear tasks) have been deprecated and superseded by a | ||||
| new attribute "file". | new attribute "file". | ||||
| @@ -174,6 +174,14 @@ | |||||
| classpathref="classpath"/> | classpathref="classpath"/> | ||||
| </and> | </and> | ||||
| </condition> | </condition> | ||||
| <condition property="some.regexp.support"> | |||||
| <or> | |||||
| <isset property="jdk1.4+" /> | |||||
| <isset property="jakarta.regexp.present" /> | |||||
| <isset property="jakarta.oro.present" /> | |||||
| </or> | |||||
| </condition> | |||||
| </target> | </target> | ||||
| <!-- | <!-- | ||||
| @@ -210,11 +218,11 @@ | |||||
| deprecation="${deprecation}" | deprecation="${deprecation}" | ||||
| optimize="${optimize}" > | optimize="${optimize}" > | ||||
| <classpath refid="classpath" /> | <classpath refid="classpath" /> | ||||
| <exclude name="${ant.package}/util/regexp/JakartaRegexpMatcher.java" | |||||
| <exclude name="${ant.package}/util/regexp/JakartaRegexp*.java" | |||||
| unless="jakarta.regexp.present" /> | unless="jakarta.regexp.present" /> | ||||
| <exclude name="${ant.package}/util/regexp/JakartaOroMatcher.java" | |||||
| <exclude name="${ant.package}/util/regexp/JakartaOro*.java" | |||||
| unless="jakarta.oro.present" /> | unless="jakarta.oro.present" /> | ||||
| <exclude name="${ant.package}/util/regexp/Jdk14RegexpMatcher.java" | |||||
| <exclude name="${ant.package}/util/regexp/Jdk14Regexp*.java" | |||||
| unless="jdk1.4+" /> | unless="jdk1.4+" /> | ||||
| <exclude name="${ant.package}/AntSecurityManager.java" | <exclude name="${ant.package}/AntSecurityManager.java" | ||||
| unless="jdk1.2+" /> | unless="jdk1.2+" /> | ||||
| @@ -642,11 +650,11 @@ | |||||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | ||||
| unless="antlr.present" /> | unless="antlr.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexpMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexp*Test.java" | |||||
| unless="jakarta.regexp.present" /> | unless="jakarta.regexp.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOroMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOro*Test.java" | |||||
| unless="jakarta.oro.present" /> | unless="jakarta.oro.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14RegexpMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14Regexp*Test.java" | |||||
| unless="jdk1.4+" /> | unless="jdk1.4+" /> | ||||
| <exclude name="org/apache/tools/ant/taskdefs/optional/sitraka/*.java" | <exclude name="org/apache/tools/ant/taskdefs/optional/sitraka/*.java" | ||||
| unless="jakarta.oro.present" /> | unless="jakarta.oro.present" /> | ||||
| @@ -712,11 +720,11 @@ | |||||
| <!-- only run these tests if their required libraries are installed --> | <!-- only run these tests if their required libraries are installed --> | ||||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" | ||||
| unless="antlr.present" /> | unless="antlr.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexpMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaRegexp*Test.java" | |||||
| unless="jakarta.regexp.present" /> | unless="jakarta.regexp.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOroMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/JakartaOro*Test.java" | |||||
| unless="jakarta.oro.present" /> | unless="jakarta.oro.present" /> | ||||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14RegexpMatcherTest.java" | |||||
| <exclude name="org/apache/tools/ant/util/regexp/Jdk14Regexp*Test.java" | |||||
| unless="jdk1.4+" /> | unless="jdk1.4+" /> | ||||
| <exclude name="${optional.package}/ide/VAJExportTest.java" unless="vaj.present" /> | <exclude name="${optional.package}/ide/VAJExportTest.java" unless="vaj.present" /> | ||||
| <exclude name="${optional.package}/sitraka/*.java" unless="jakarta.oro.present" /> | <exclude name="${optional.package}/sitraka/*.java" unless="jakarta.oro.present" /> | ||||
| @@ -0,0 +1,2 @@ | |||||
| OldAbc=Def | |||||
| @@ -0,0 +1,19 @@ | |||||
| <project name="test" default="def" basedir="."> | |||||
| <target name="setup"> | |||||
| <copy file="replaceregexp.properties" tofile="test.properties" /> | |||||
| </target> | |||||
| <target name="def" depends="setup"> | |||||
| <replaceregexp file="test.properties" byline="true"> | |||||
| <regularexpression pattern="Old(.*)=(.*)" /> | |||||
| <substitution expression="NewProp=\1\2" /> | |||||
| </replaceregexp> | |||||
| </target> | |||||
| <target name="cleanup"> | |||||
| <delete file="test.properties" /> | |||||
| </target> | |||||
| </project> | |||||
| @@ -123,6 +123,7 @@ jpcovmerge=org.apache.tools.ant.taskdefs.optional.sitraka.CovMerge | |||||
| jpcovreport=org.apache.tools.ant.taskdefs.optional.sitraka.CovReport | jpcovreport=org.apache.tools.ant.taskdefs.optional.sitraka.CovReport | ||||
| p4add=org.apache.tools.ant.taskdefs.optional.perforce.P4Add | p4add=org.apache.tools.ant.taskdefs.optional.perforce.P4Add | ||||
| jspc=org.apache.tools.ant.taskdefs.optional.jsp.JspC | jspc=org.apache.tools.ant.taskdefs.optional.jsp.JspC | ||||
| replaceregexp=org.apache.tools.ant.taskdefs.optional.ReplaceRegExp | |||||
| # deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
| javadoc2=org.apache.tools.ant.taskdefs.Javadoc | javadoc2=org.apache.tools.ant.taskdefs.Javadoc | ||||
| @@ -0,0 +1,423 @@ | |||||
| /* | |||||
| * 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.BuildException; | |||||
| import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.Task; | |||||
| import org.apache.tools.ant.util.regexp.Regexp; | |||||
| import org.apache.tools.ant.types.RegularExpression; | |||||
| import org.apache.tools.ant.types.Substitution; | |||||
| import org.apache.tools.ant.types.FileSet; | |||||
| import java.io.BufferedReader; | |||||
| import java.io.BufferedWriter; | |||||
| import java.io.File; | |||||
| import java.io.FileReader; | |||||
| import java.io.FileWriter; | |||||
| import java.io.IOException; | |||||
| import java.io.LineNumberReader; | |||||
| import java.io.PrintWriter; | |||||
| import java.util.Vector; | |||||
| /*** | |||||
| * <pre> | |||||
| * Task to do regular expression string replacements in a text | |||||
| * file. The input file(s) must be able to be properly processed by | |||||
| * a Reader instance. That is, they must be text only, no binary. | |||||
| * | |||||
| * The syntax of the regular expression depends on the implemtation that | |||||
| * you choose to use. The system property <code>ant.regexp.regexpimpl</code> | |||||
| * will be the classname of the implementation that will be used (the default | |||||
| * is <code>org.apache.tools.ant.util.regexp.JakartaOroRegexp</code> and | |||||
| * requires the Jakarta Oro Package). | |||||
| * | |||||
| * <pre> | |||||
| * For jdk <= 1.3, there are two available implementations: | |||||
| * org.apache.tools.ant.util.regexp.JakartaOroRegexp (the default) | |||||
| * Requires the jakarta-oro package | |||||
| * | |||||
| * org.apache.tools.ant.util.regexp.JakartaRegexpRegexp | |||||
| * Requires the jakarta-regexp package | |||||
| * | |||||
| * For jdk <= 1.4, and additional implementation is available: | |||||
| * org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp | |||||
| * Requires the jdk 1.4 built in regular expression package. | |||||
| * </pre> | |||||
| * | |||||
| * Usage: | |||||
| * | |||||
| * Task declaration in the project: | |||||
| * | |||||
| * <taskdef name="replaceregexp" class="com.sedona.ant.taskdef.ReplaceRegExp" /> | |||||
| * | |||||
| * Call Syntax: | |||||
| * | |||||
| * <replaceregexp file="file" | |||||
| * match="pattern" | |||||
| * replace="pattern" | |||||
| * flags="options"? | |||||
| * byline="true|false"? > | |||||
| * regularexpression? | |||||
| * substitution? | |||||
| * fileset* | |||||
| * </replaceregexp> | |||||
| * | |||||
| * NOTE: You must have either the file attribute specified, or at least one fileset subelement | |||||
| * to operation on. You may not have the file attribute specified if you nest fileset elements | |||||
| * inside this task. Also, you cannot specify both match and a regular expression subelement at | |||||
| * the same time, nor can you specify the replace attribute and the substitution subelement at | |||||
| * the same time. | |||||
| * | |||||
| * Attributes: | |||||
| * | |||||
| * file --> A single file to operation on (mutually exclusive with the fileset subelements) | |||||
| * match --> The Perl5 Regular expression to match (see perl5 documentation) | |||||
| * replace --> The Perl5 Expression replacement string (see perl5 documentation) | |||||
| * flags --> The Perl5 options to give to the replacement (see perl5 documentation for full list) | |||||
| * g = Substitute all occurrences. default is to replace only the first one | |||||
| * i = Case insensitive match | |||||
| * | |||||
| * byline --> Should this file be processed a single line at a time (default is false) | |||||
| * "true" indicates to perform replacement on a line by line basis | |||||
| * "false" indicates to perform replacement on the whole file at once. | |||||
| * | |||||
| * Example: | |||||
| * | |||||
| * The following call could be used to replace an old property name in a ".properties" | |||||
| * file with a new name. In the replace attribute, you can refer to any part of the | |||||
| * match expression in parenthesis using the syntax appropriate for the specified | |||||
| * implementation ('$$1' for org.apache.tools.ant.util.regexp.JakartaOroRegexp). | |||||
| * | |||||
| * <replaceregexp file="test.properties" | |||||
| * match="MyProperty=(.*)" | |||||
| * replace="NewProperty=$$1" | |||||
| * byline="true" /> | |||||
| * | |||||
| * </pre> | |||||
| * | |||||
| * @author <a href="mailto:mattinger@mindless.com">Matthew Inger</a> | |||||
| */ | |||||
| public class ReplaceRegExp extends Task | |||||
| { | |||||
| // Don't extend SedonaTaskContainer until we can delay building of | |||||
| // the subtasks so variable of the current token works. | |||||
| private File file; | |||||
| private String flags; | |||||
| private boolean byline; | |||||
| private Vector filesets; // Keep jdk 1.1 compliant so others can use this | |||||
| private RegularExpression regex; | |||||
| private Substitution subs; | |||||
| /*** | |||||
| * Default Constructor | |||||
| */ | |||||
| public ReplaceRegExp() | |||||
| { | |||||
| super(); | |||||
| this.file = null; | |||||
| this.filesets = new Vector(); | |||||
| this.flags = ""; | |||||
| this.byline = false; | |||||
| this.regex = null; | |||||
| this.subs = null; | |||||
| } | |||||
| public void setFile(File file) | |||||
| { | |||||
| this.file = file; | |||||
| } | |||||
| public void setMatch(String match) | |||||
| { | |||||
| if (regex != null) | |||||
| throw new BuildException("Only one regular expression is allowed"); | |||||
| regex = new RegularExpression(); | |||||
| regex.setPattern(match); | |||||
| } | |||||
| public void setReplace(String replace) | |||||
| { | |||||
| if (subs != null) | |||||
| throw new BuildException("Only one substitution expression is allowed"); | |||||
| subs = new Substitution(); | |||||
| subs.setExpression(replace); | |||||
| } | |||||
| public void setFlags(String flags) | |||||
| { | |||||
| this.flags = flags; | |||||
| } | |||||
| public void setByLine(String byline) | |||||
| { | |||||
| Boolean res = Boolean.valueOf(byline); | |||||
| if (res == null) | |||||
| res = Boolean.FALSE; | |||||
| this.byline = res.booleanValue(); | |||||
| } | |||||
| public void addFileset(FileSet set) | |||||
| { | |||||
| filesets.add(set); | |||||
| } | |||||
| public RegularExpression createRegularExpression() | |||||
| { | |||||
| if (regex != null) | |||||
| throw new BuildException("Only one regular expression is allowed."); | |||||
| regex = new RegularExpression(); | |||||
| return regex; | |||||
| } | |||||
| public Substitution createSubstitution() | |||||
| { | |||||
| if (subs != null) | |||||
| throw new BuildException("Only one substitution expression is allowed"); | |||||
| subs = new Substitution(); | |||||
| return subs; | |||||
| } | |||||
| protected String doReplace(RegularExpression r, | |||||
| Substitution s, | |||||
| String input, | |||||
| int options) | |||||
| { | |||||
| String res = input; | |||||
| Regexp regexp = r.getRegexp(project); | |||||
| if (regexp.matches(input, options)) | |||||
| { | |||||
| res = regexp.substitute(input, s.getExpression(project), options); | |||||
| } | |||||
| return res; | |||||
| } | |||||
| /*** | |||||
| * Perform the replace on the entire file | |||||
| */ | |||||
| protected void doReplace(File f, int options) | |||||
| throws IOException | |||||
| { | |||||
| File parentDir = new File(f.getAbsolutePath()).getParentFile(); | |||||
| File temp = File.createTempFile("replace", ".txt", parentDir); | |||||
| FileReader r = null; | |||||
| FileWriter w = null; | |||||
| try | |||||
| { | |||||
| r = new FileReader(f); | |||||
| w = new FileWriter(temp); | |||||
| BufferedReader br = new BufferedReader(r); | |||||
| BufferedWriter bw = new BufferedWriter(w); | |||||
| PrintWriter pw = new PrintWriter(bw); | |||||
| boolean changes = false; | |||||
| log("Replacing pattern '" + regex.getPattern(project) + "' with '" + subs.getExpression(project) + | |||||
| "' in '" + f.getPath() + "'" + | |||||
| (byline ? " by line" : "") + | |||||
| (flags.length() > 0 ? " with flags: '" + flags + "'" : "") + | |||||
| ".", | |||||
| Project.MSG_WARN); | |||||
| if (byline) | |||||
| { | |||||
| LineNumberReader lnr = new LineNumberReader(br); | |||||
| String line = null; | |||||
| while ((line = lnr.readLine()) != null) | |||||
| { | |||||
| String res = doReplace(regex, subs, line, options); | |||||
| if (! res.equals(line)) | |||||
| changes = true; | |||||
| pw.println(res); | |||||
| } | |||||
| pw.flush(); | |||||
| } | |||||
| else | |||||
| { | |||||
| int flen = (int)(f.length()); | |||||
| char tmpBuf[] = new char[flen]; | |||||
| int numread = 0; | |||||
| int totread = 0; | |||||
| while (numread != -1 && totread < flen) | |||||
| { | |||||
| numread = br.read(tmpBuf, totread, flen); | |||||
| totread += numread; | |||||
| } | |||||
| String buf = new String(tmpBuf); | |||||
| String res = doReplace(regex, subs, buf, options); | |||||
| if (! res.equals(buf)) | |||||
| changes = true; | |||||
| pw.println(res); | |||||
| pw.flush(); | |||||
| } | |||||
| r.close(); | |||||
| r = null; | |||||
| w.close(); | |||||
| w = null; | |||||
| if (changes) | |||||
| { | |||||
| f.delete(); | |||||
| temp.renameTo(f); | |||||
| } | |||||
| else | |||||
| { | |||||
| temp.delete(); | |||||
| } | |||||
| } | |||||
| finally | |||||
| { | |||||
| try { if (r != null) r.close(); } | |||||
| catch (Exception e) { }; | |||||
| try { if (w != null) r.close(); } | |||||
| catch (Exception e) { }; | |||||
| } | |||||
| } | |||||
| public void execute() | |||||
| throws BuildException | |||||
| { | |||||
| if (regex == null) | |||||
| throw new BuildException("No expression to match."); | |||||
| if (subs == null) | |||||
| throw new BuildException("Nothing to replace expression with."); | |||||
| if (file != null && filesets.size() > 0) | |||||
| throw new BuildException("You cannot supply the 'file' attribute and filesets at the same time."); | |||||
| int options = 0; | |||||
| if (flags.indexOf('g') != -1) | |||||
| options |= Regexp.REPLACE_ALL; | |||||
| if (flags.indexOf('i') != -1) | |||||
| options |= Regexp.MATCH_CASE_INSENSITIVE; | |||||
| if (flags.indexOf('m') != -1) | |||||
| options |= Regexp.MATCH_MULTILINE; | |||||
| if (flags.indexOf('s') != -1) | |||||
| options |= Regexp.MATCH_SINGLELINE; | |||||
| if (file != null && file.exists()) | |||||
| { | |||||
| try | |||||
| { | |||||
| doReplace(file, options); | |||||
| } | |||||
| catch (IOException e) | |||||
| { | |||||
| log("An error occurred processing file: '" + file.getAbsolutePath() + "': " + e.toString(), | |||||
| Project.MSG_ERR); | |||||
| } | |||||
| } | |||||
| else if (file != null) | |||||
| { | |||||
| log("The following file is missing: '" + file.getAbsolutePath() + "'", | |||||
| Project.MSG_ERR); | |||||
| } | |||||
| int sz = filesets.size(); | |||||
| for (int i=0;i<sz;i++) | |||||
| { | |||||
| FileSet fs = (FileSet)(filesets.elementAt(i)); | |||||
| DirectoryScanner ds = fs.getDirectoryScanner(getProject()); | |||||
| String files[] = ds.getIncludedFiles(); | |||||
| for (int j=0;j<files.length;j++) | |||||
| { | |||||
| File f = new File(files[j]); | |||||
| if (f.exists()) | |||||
| { | |||||
| try | |||||
| { | |||||
| doReplace(f, options); | |||||
| } | |||||
| catch (Exception e) | |||||
| { | |||||
| log("An error occurred processing file: '" + f.getAbsolutePath() + "': " + e.toString(), | |||||
| Project.MSG_ERR); | |||||
| } | |||||
| } | |||||
| else | |||||
| { | |||||
| log("The following file is missing: '" + file.getAbsolutePath() + "'", | |||||
| Project.MSG_ERR); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,161 @@ | |||||
| /* | |||||
| * 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.types; | |||||
| import java.util.Hashtable; | |||||
| import java.util.Stack; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.util.regexp.Regexp; | |||||
| import org.apache.tools.ant.util.regexp.RegexpFactory; | |||||
| /*** | |||||
| * A regular expression datatype. Keeps an instance of the | |||||
| * compiled expression for speed purposes. This compiled | |||||
| * expression is lazily evaluated (it is compiled the first | |||||
| * time it is needed). The syntax is the dependent on which | |||||
| * regular expression type you are using. The system property | |||||
| * "ant.regexp.regexpimpl" will be the classname of the implementation | |||||
| * that will be used. | |||||
| * | |||||
| * <pre> | |||||
| * For jdk <= 1.3, there are two available implementations: | |||||
| * org.apache.tools.ant.util.regexp.JakartaOroRegexp (the default) | |||||
| * Based on the jakarta-oro package | |||||
| * | |||||
| * org.apache.tools.ant.util.regexp.JakartaRegexpRegexp | |||||
| * Based on the jakarta-regexp package | |||||
| * | |||||
| * For jdk <= 1.4, and additional implementation is available: | |||||
| * org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp | |||||
| * Based on the jdk 1.4 built in regular expression package. | |||||
| * </pre> | |||||
| * | |||||
| * @see org.apache.oro.regex.Perl5Compiler | |||||
| * @see org.apache.regexp.RE | |||||
| * @see java.util.regex.Pattern | |||||
| * | |||||
| * <pre> | |||||
| * <regularexpression [ [id="id"] pattern="expression" | refid="id" ] | |||||
| * /> | |||||
| * </pre> | |||||
| * | |||||
| * @see org.apache.tools.ant.util.regexp.Regexp | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class RegularExpression extends DataType | |||||
| { | |||||
| public static final String DATA_TYPE_NAME = "regularexpression"; | |||||
| // The regular expression factory | |||||
| private static final RegexpFactory factory = new RegexpFactory(); | |||||
| private Regexp regexp; | |||||
| public RegularExpression() | |||||
| { | |||||
| this.regexp = factory.newRegexp(); | |||||
| } | |||||
| public void setPattern(String pattern) | |||||
| { | |||||
| this.regexp.setPattern(pattern); | |||||
| } | |||||
| /*** | |||||
| * Gets the pattern string for this RegularExpression in the | |||||
| * given project. | |||||
| */ | |||||
| public String getPattern(Project p) | |||||
| { | |||||
| if (isReference()) | |||||
| return getRef(p).getPattern(p); | |||||
| return regexp.getPattern(); | |||||
| } | |||||
| public Regexp getRegexp(Project p) | |||||
| { | |||||
| if (isReference()) | |||||
| return getRef(p).getRegexp(p); | |||||
| return this.regexp; | |||||
| } | |||||
| /*** | |||||
| * Get the RegularExpression this reference refers to in | |||||
| * the given project. Check for circular references too | |||||
| */ | |||||
| public RegularExpression getRef(Project p) | |||||
| { | |||||
| if (!checked) | |||||
| { | |||||
| Stack stk = new Stack(); | |||||
| stk.push(this); | |||||
| dieOnCircularReference(stk, p); | |||||
| } | |||||
| Object o = ref.getReferencedObject(p); | |||||
| if (!(o instanceof RegularExpression)) | |||||
| { | |||||
| String msg = ref.getRefId() + " doesn\'t denote a regularexpression"; | |||||
| throw new BuildException(msg); | |||||
| } | |||||
| else | |||||
| { | |||||
| return (RegularExpression) o; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,129 @@ | |||||
| /* | |||||
| * 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.types; | |||||
| import java.util.Hashtable; | |||||
| import java.util.Stack; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.types.DataType; | |||||
| /*** | |||||
| * A regular expression substitution datatype. It is an expression | |||||
| * that is meant to replace a regular expression. The syntax is the | |||||
| * same as Perl5. | |||||
| * @see org.apache.oro.text.regex.Perl5Substitition | |||||
| * | |||||
| * <pre> | |||||
| * <substitition [ [id="id"] expression="expression" | refid="id" ] | |||||
| * /> | |||||
| * </pre> | |||||
| * | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class Substitution extends DataType | |||||
| { | |||||
| public static final String DATA_TYPE_NAME = "substitition"; | |||||
| private String expression; | |||||
| public Substitution() | |||||
| { | |||||
| this.expression = null; | |||||
| } | |||||
| public void setExpression(String expression) | |||||
| { | |||||
| this.expression = expression; | |||||
| } | |||||
| /*** | |||||
| * Gets the pattern string for this RegularExpression in the | |||||
| * given project. | |||||
| */ | |||||
| public String getExpression(Project p) | |||||
| { | |||||
| if (isReference()) | |||||
| return getRef(p).getExpression(p); | |||||
| return expression; | |||||
| } | |||||
| /*** | |||||
| * Get the RegularExpression this reference refers to in | |||||
| * the given project. Check for circular references too | |||||
| */ | |||||
| public Substitution getRef(Project p) | |||||
| { | |||||
| if (!checked) | |||||
| { | |||||
| Stack stk = new Stack(); | |||||
| stk.push(this); | |||||
| dieOnCircularReference(stk, p); | |||||
| } | |||||
| Object o = ref.getReferencedObject(p); | |||||
| if (!(o instanceof Substitution)) | |||||
| { | |||||
| String msg = ref.getRefId() + " doesn\'t denote a substitution"; | |||||
| throw new BuildException(msg); | |||||
| } | |||||
| else | |||||
| { | |||||
| return (Substitution) o; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -54,45 +54,77 @@ | |||||
| package org.apache.tools.ant.util.regexp; | package org.apache.tools.ant.util.regexp; | ||||
| import org.apache.oro.text.regex.*; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.oro.text.regex.MatchResult; | |||||
| import org.apache.oro.text.regex.Pattern; | |||||
| import org.apache.oro.text.regex.Perl5Compiler; | |||||
| import org.apache.oro.text.regex.Perl5Matcher; | |||||
| import org.apache.oro.text.regex.Perl5Pattern; | |||||
| import org.apache.oro.text.regex.Util; | |||||
| import java.util.Vector; | import java.util.Vector; | ||||
| /** | /** | ||||
| * Implementation of RegexpMatcher for Jakarta-ORO. | * Implementation of RegexpMatcher for Jakarta-ORO. | ||||
| * | * | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| * @author <a href="mailto:mattinger@mindless.com">Matthew Inger</a> | |||||
| */ | */ | ||||
| public class JakartaOroMatcher implements RegexpMatcher { | public class JakartaOroMatcher implements RegexpMatcher { | ||||
| protected Perl5Matcher reg = new Perl5Matcher(); | |||||
| protected Perl5Compiler comp = new Perl5Compiler(); | |||||
| private Pattern pattern; | |||||
| private String pattern; | |||||
| protected final Perl5Compiler compiler = new Perl5Compiler(); | |||||
| protected final Perl5Matcher matcher = new Perl5Matcher(); | |||||
| public JakartaOroMatcher() {} | |||||
| /** | /** | ||||
| * Set the regexp pattern from the String description. | * Set the regexp pattern from the String description. | ||||
| */ | */ | ||||
| public void setPattern(String pattern) throws BuildException { | |||||
| try { | |||||
| this.pattern = comp.compile(pattern); | |||||
| } catch (MalformedPatternException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| public void setPattern(String pattern) { | |||||
| this.pattern = pattern; | |||||
| } | } | ||||
| /** | /** | ||||
| * Get a String representation of the regexp pattern | * Get a String representation of the regexp pattern | ||||
| */ | */ | ||||
| public String getPattern() { | public String getPattern() { | ||||
| return pattern.getPattern(); | |||||
| return this.pattern; | |||||
| } | |||||
| /** | |||||
| * Get a compiled representation of the regexp pattern | |||||
| */ | |||||
| protected Pattern getCompiledPattern(int options) | |||||
| throws BuildException | |||||
| { | |||||
| try | |||||
| { | |||||
| // compute the compiler options based on the input options first | |||||
| Pattern p = compiler.compile(pattern, getCompilerOptions(options)); | |||||
| return p; | |||||
| } | |||||
| catch (Exception e) | |||||
| { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| * Does the given argument match the pattern? | * Does the given argument match the pattern? | ||||
| */ | */ | ||||
| public boolean matches(String argument) { | |||||
| return reg.contains(argument, pattern); | |||||
| public boolean matches(String argument) throws BuildException { | |||||
| return matches(argument, MATCH_DEFAULT); | |||||
| } | |||||
| /** | |||||
| * Does the given argument match the pattern? | |||||
| */ | |||||
| public boolean matches(String input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| Pattern p = getCompiledPattern(options); | |||||
| return matcher.contains(input, p); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -101,16 +133,46 @@ public class JakartaOroMatcher implements RegexpMatcher { | |||||
| * <p>Group 0 will be the full match, the rest are the | * <p>Group 0 will be the full match, the rest are the | ||||
| * parenthesized subexpressions</p>. | * parenthesized subexpressions</p>. | ||||
| */ | */ | ||||
| public Vector getGroups(String argument) { | |||||
| if (!matches(argument)) { | |||||
| public Vector getGroups(String argument) throws BuildException { | |||||
| return getGroups(argument, MATCH_DEFAULT); | |||||
| } | |||||
| /** | |||||
| * 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 input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| if (!matches(input, options)) { | |||||
| return null; | return null; | ||||
| } | } | ||||
| Vector v = new Vector(); | Vector v = new Vector(); | ||||
| MatchResult mr = reg.getMatch(); | |||||
| for (int i=0; i<mr.groups(); i++) { | |||||
| MatchResult mr = matcher.getMatch(); | |||||
| int cnt = mr.groups(); | |||||
| for (int i=0; i<cnt; i++) { | |||||
| v.addElement(mr.group(i)); | v.addElement(mr.group(i)); | ||||
| } | } | ||||
| return v; | return v; | ||||
| } | } | ||||
| protected int getCompilerOptions(int options) | |||||
| { | |||||
| int cOptions = Perl5Compiler.DEFAULT_MASK; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_CASE_INSENSITIVE)) { | |||||
| cOptions |= Perl5Compiler.CASE_INSENSITIVE_MASK; | |||||
| } | |||||
| if (RegexpUtil.hasFlag(options, MATCH_MULTILINE)) { | |||||
| cOptions |= Perl5Compiler.MULTILINE_MASK; | |||||
| } | |||||
| if (RegexpUtil.hasFlag(options, MATCH_SINGLELINE)) { | |||||
| cOptions |= Perl5Compiler.SINGLELINE_MASK; | |||||
| } | |||||
| return cOptions; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,99 @@ | |||||
| /* | |||||
| * 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 org.apache.oro.text.regex.Perl5Substitution; | |||||
| import org.apache.oro.text.regex.Substitution; | |||||
| import org.apache.oro.text.regex.Util; | |||||
| import java.util.Vector; | |||||
| /*** | |||||
| * Regular expression implementation using the Jakarta Oro package | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class JakartaOroRegexp extends JakartaOroMatcher implements Regexp | |||||
| { | |||||
| public JakartaOroRegexp() | |||||
| { | |||||
| super(); | |||||
| } | |||||
| public String substitute(String input, String argument, int options) | |||||
| throws BuildException | |||||
| { | |||||
| // Determine replacement Type | |||||
| int sOptions = getSubsOptions(options); | |||||
| // Do the substitution | |||||
| Substitution s = new Perl5Substitution(argument, sOptions); | |||||
| return Util.substitute(matcher, | |||||
| getCompiledPattern(options), | |||||
| s, | |||||
| input); | |||||
| } | |||||
| protected int getSubsOptions(int options) | |||||
| { | |||||
| boolean replaceAll = RegexpUtil.hasFlag(options, REPLACE_ALL); | |||||
| int subsOptions = 1; | |||||
| if (replaceAll) { | |||||
| subsOptions = Util.SUBSTITUTE_ALL; | |||||
| } | |||||
| return subsOptions; | |||||
| } | |||||
| } | |||||
| @@ -63,22 +63,17 @@ import java.util.Vector; | |||||
| * Implementation of RegexpMatcher for Jakarta-Regexp. | * Implementation of RegexpMatcher for Jakarta-Regexp. | ||||
| * | * | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | */ | ||||
| public class JakartaRegexpMatcher implements RegexpMatcher { | public class JakartaRegexpMatcher implements RegexpMatcher { | ||||
| protected RE reg = null; | |||||
| private String pattern; | private String pattern; | ||||
| /** | /** | ||||
| * Set the regexp pattern from the String description. | * Set the regexp pattern from the String description. | ||||
| */ | */ | ||||
| public void setPattern(String pattern) throws BuildException { | |||||
| try { | |||||
| this.pattern = pattern; | |||||
| reg = new RE(pattern); | |||||
| } catch (RESyntaxException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| public void setPattern(String pattern) { | |||||
| this.pattern = pattern; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -88,11 +83,40 @@ public class JakartaRegexpMatcher implements RegexpMatcher { | |||||
| return pattern; | return pattern; | ||||
| } | } | ||||
| protected RE getCompiledPattern(int options) | |||||
| throws BuildException | |||||
| { | |||||
| int cOptions = getCompilerOptions(options); | |||||
| try | |||||
| { | |||||
| RE reg = new RE(pattern); | |||||
| reg.setMatchFlags(cOptions); | |||||
| return reg; | |||||
| } | |||||
| catch (RESyntaxException e) | |||||
| { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Does the given argument match the pattern? | |||||
| */ | |||||
| public boolean matches(String argument) throws BuildException { | |||||
| return matches(argument, MATCH_DEFAULT); | |||||
| } | |||||
| /** | /** | ||||
| * Does the given argument match the pattern? | * Does the given argument match the pattern? | ||||
| */ | */ | ||||
| public boolean matches(String argument) { | |||||
| return reg.match(argument); | |||||
| public boolean matches(String input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| return matches(input, getCompiledPattern(options)); | |||||
| } | |||||
| private boolean matches(String input, RE reg) { | |||||
| return reg.match(input); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -101,15 +125,37 @@ public class JakartaRegexpMatcher implements RegexpMatcher { | |||||
| * <p>Group 0 will be the full match, the rest are the | * <p>Group 0 will be the full match, the rest are the | ||||
| * parenthesized subexpressions</p>. | * parenthesized subexpressions</p>. | ||||
| */ | */ | ||||
| public Vector getGroups(String argument) { | |||||
| if (!matches(argument)) { | |||||
| public Vector getGroups(String argument) throws BuildException { | |||||
| return getGroups(argument, MATCH_DEFAULT); | |||||
| } | |||||
| public Vector getGroups(String input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| RE reg = getCompiledPattern(options); | |||||
| if (!matches(input, reg)) { | |||||
| return null; | return null; | ||||
| } | } | ||||
| Vector v = new Vector(); | Vector v = new Vector(); | ||||
| for (int i=0; i<reg.getParenCount(); i++) { | |||||
| int cnt = reg.getParenCount(); | |||||
| for (int i=0; i<cnt; i++) { | |||||
| v.addElement(reg.getParen(i)); | v.addElement(reg.getParen(i)); | ||||
| } | } | ||||
| return v; | return v; | ||||
| } | } | ||||
| protected int getCompilerOptions(int options) | |||||
| { | |||||
| int cOptions = RE.MATCH_NORMAL; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_CASE_INSENSITIVE)) | |||||
| cOptions |= RE.MATCH_CASEINDEPENDENT; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_MULTILINE)) | |||||
| cOptions |= RE.MATCH_MULTILINE; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_SINGLELINE)) | |||||
| cOptions |= RE.MATCH_SINGLELINE; | |||||
| return cOptions; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,88 @@ | |||||
| /* | |||||
| * 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 org.apache.regexp.*; | |||||
| import java.util.Vector; | |||||
| /*** | |||||
| * Regular expression implementation using the Jakarta Regexp package | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class JakartaRegexpRegexp extends JakartaRegexpMatcher implements Regexp | |||||
| { | |||||
| public JakartaRegexpRegexp() | |||||
| { | |||||
| super(); | |||||
| } | |||||
| protected int getSubsOptions(int options) | |||||
| { | |||||
| int subsOptions = RE.REPLACE_FIRSTONLY; | |||||
| if (RegexpUtil.hasFlag(options, REPLACE_ALL)) | |||||
| subsOptions = RE.REPLACE_ALL; | |||||
| return subsOptions; | |||||
| } | |||||
| public String substitute(String input, String argument, int options) | |||||
| throws BuildException | |||||
| { | |||||
| int sOptions = getSubsOptions(options); | |||||
| RE reg = getCompiledPattern(options); | |||||
| return reg.subst(input, argument, sOptions); | |||||
| } | |||||
| } | |||||
| @@ -54,46 +54,77 @@ | |||||
| package org.apache.tools.ant.util.regexp; | package org.apache.tools.ant.util.regexp; | ||||
| import java.util.Vector; | |||||
| import java.util.regex.Matcher; | import java.util.regex.Matcher; | ||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||
| import java.util.regex.PatternSyntaxException; | import java.util.regex.PatternSyntaxException; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import java.util.Vector; | |||||
| /** | /** | ||||
| * Implementation of RegexpMatcher for the built-in regexp matcher of | * Implementation of RegexpMatcher for the built-in regexp matcher of | ||||
| * JDK 1.4. | * JDK 1.4. | ||||
| * | * | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | */ | ||||
| public class Jdk14RegexpMatcher implements RegexpMatcher { | public class Jdk14RegexpMatcher implements RegexpMatcher { | ||||
| private Pattern pattern; | |||||
| private String pattern; | |||||
| public Jdk14RegexpMatcher() {} | |||||
| /** | /** | ||||
| * Set the regexp pattern from the String description. | * Set the regexp pattern from the String description. | ||||
| */ | */ | ||||
| public void setPattern(String pattern) throws BuildException { | |||||
| try { | |||||
| this.pattern = Pattern.compile(pattern); | |||||
| } catch (PatternSyntaxException e) { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| public void setPattern(String pattern) { | |||||
| this.pattern = pattern; | |||||
| } | } | ||||
| /** | /** | ||||
| * Get a String representation of the regexp pattern | * Get a String representation of the regexp pattern | ||||
| */ | */ | ||||
| public String getPattern() { | public String getPattern() { | ||||
| return pattern.pattern(); | |||||
| return pattern; | |||||
| } | |||||
| protected Pattern getCompiledPattern(int options) | |||||
| throws BuildException | |||||
| { | |||||
| int cOptions = getCompilerOptions(options); | |||||
| try | |||||
| { | |||||
| Pattern p = Pattern.compile(this.pattern, cOptions); | |||||
| return p; | |||||
| } | |||||
| catch (PatternSyntaxException e) | |||||
| { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * Does the given argument match the pattern? | |||||
| */ | |||||
| public boolean matches(String argument) throws BuildException { | |||||
| return matches(argument, MATCH_DEFAULT); | |||||
| } | } | ||||
| /** | /** | ||||
| * Does the given argument match the pattern? | * Does the given argument match the pattern? | ||||
| */ | */ | ||||
| public boolean matches(String argument) { | |||||
| return pattern.matcher(argument).find(); | |||||
| public boolean matches(String input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| try | |||||
| { | |||||
| Pattern p = getCompiledPattern(options); | |||||
| return p.matcher(input).find(); | |||||
| } | |||||
| catch (Exception e) | |||||
| { | |||||
| throw new BuildException(e); | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -102,16 +133,44 @@ public class Jdk14RegexpMatcher implements RegexpMatcher { | |||||
| * <p>Group 0 will be the full match, the rest are the | * <p>Group 0 will be the full match, the rest are the | ||||
| * parenthesized subexpressions</p>. | * parenthesized subexpressions</p>. | ||||
| */ | */ | ||||
| public Vector getGroups(String argument) { | |||||
| Matcher matcher = pattern.matcher(argument); | |||||
| public Vector getGroups(String argument) throws BuildException { | |||||
| return getGroups(argument, MATCH_DEFAULT); | |||||
| } | |||||
| /** | |||||
| * 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 input, int options) | |||||
| throws BuildException | |||||
| { | |||||
| Pattern p = getCompiledPattern(options); | |||||
| Matcher matcher = p.matcher(input); | |||||
| if (!matcher.find()) { | if (!matcher.find()) { | ||||
| return null; | return null; | ||||
| } | } | ||||
| Vector v = new Vector(); | Vector v = new Vector(); | ||||
| for (int i=0; i<=matcher.groupCount(); i++) { | |||||
| int cnt = matcher.groupCount(); | |||||
| for (int i=0; i<=cnt; i++) { | |||||
| v.addElement(matcher.group(i)); | v.addElement(matcher.group(i)); | ||||
| } | } | ||||
| return v; | return v; | ||||
| } | } | ||||
| protected int getCompilerOptions(int options) | |||||
| { | |||||
| int cOptions = 0; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_CASE_INSENSITIVE)) | |||||
| cOptions |= Pattern.CASE_INSENSITIVE; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_MULTILINE)) | |||||
| cOptions |= Pattern.MULTILINE; | |||||
| if (RegexpUtil.hasFlag(options, MATCH_SINGLELINE)) | |||||
| cOptions |= Pattern.DOTALL; | |||||
| return cOptions; | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,106 @@ | |||||
| /* | |||||
| * 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; | |||||
| import java.util.regex.Matcher; | |||||
| import java.util.regex.Pattern; | |||||
| import java.util.regex.PatternSyntaxException; | |||||
| /*** | |||||
| * Regular expression implementation using the JDK 1.4 regular expression package | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class Jdk14RegexpRegexp extends Jdk14RegexpMatcher implements Regexp | |||||
| { | |||||
| public Jdk14RegexpRegexp() | |||||
| { | |||||
| super(); | |||||
| } | |||||
| protected int getSubsOptions(int options) | |||||
| { | |||||
| int subsOptions = REPLACE_FIRST; | |||||
| if (RegexpUtil.hasFlag(options, REPLACE_ALL)) | |||||
| subsOptions = REPLACE_ALL; | |||||
| return subsOptions; | |||||
| } | |||||
| public String substitute(String input, String argument, int options) | |||||
| throws BuildException | |||||
| { | |||||
| int sOptions = getSubsOptions(options); | |||||
| Pattern p = getCompiledPattern(options); | |||||
| StringBuffer sb = new StringBuffer(); | |||||
| Matcher m = p.matcher(input); | |||||
| if (RegexpUtil.hasFlag(sOptions, REPLACE_ALL)) | |||||
| { | |||||
| sb.append(m.replaceAll(argument)); | |||||
| } | |||||
| else | |||||
| { | |||||
| boolean res = m.find(); | |||||
| if (res) | |||||
| m.appendReplacement(sb, argument); | |||||
| else | |||||
| sb.append(input); | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,75 @@ | |||||
| /* | |||||
| * 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; | |||||
| /*** | |||||
| * Interface which represents a regular expression, and the operations | |||||
| * that can be performed on it. | |||||
| * | |||||
| * @author <a href="mailto:mattinger@mindless.com">Matthew Inger</a> | |||||
| */ | |||||
| public interface Regexp extends RegexpMatcher | |||||
| { | |||||
| /** | |||||
| * 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. | |||||
| */ | |||||
| String substitute(String input, String argument, int options) | |||||
| throws BuildException; | |||||
| } | |||||
| @@ -0,0 +1,113 @@ | |||||
| /* | |||||
| * 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 org.apache.tools.ant.Project; | |||||
| /*** | |||||
| * Regular expression factory, which will create Regexp objects. The | |||||
| * actual implementation class depends on the System or Ant Property: | |||||
| * <code>ant.regexp.regexpimpl</code>. | |||||
| * | |||||
| * @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a> | |||||
| */ | |||||
| public class RegexpFactory extends RegexpMatcherFactory | |||||
| { | |||||
| public RegexpFactory() | |||||
| { | |||||
| } | |||||
| /*** | |||||
| * Create a new regular expression matcher instance. | |||||
| */ | |||||
| public Regexp newRegexp() throws BuildException { | |||||
| return (Regexp) newRegexp(null); | |||||
| } | |||||
| /*** | |||||
| * Create a new regular expression matcher instance. | |||||
| * | |||||
| * @param p Project whose ant.regexp.regexpimpl property will be used. | |||||
| */ | |||||
| public Regexp newRegexp(Project p) throws BuildException { | |||||
| String systemDefault = null; | |||||
| if (p == null) { | |||||
| systemDefault = System.getProperty("ant.regexp.regexpimpl"); | |||||
| } else { | |||||
| systemDefault = (String) p.getProperties().get("ant.regexp.regexpimpl"); | |||||
| } | |||||
| if (systemDefault != null) { | |||||
| return (Regexp)createInstance(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"); | |||||
| } catch (BuildException be) {} | |||||
| try { | |||||
| return (Regexp)createInstance("org.apache.tools.ant.util.regexp.JakartaOroRegexp"); | |||||
| } catch (BuildException be) {} | |||||
| try { | |||||
| return (Regexp)createInstance("org.apache.tools.ant.util.regexp.JakartaRegexpRegexp"); | |||||
| } catch (BuildException be) {} | |||||
| throw new BuildException("No supported regular expression matcher found"); | |||||
| } | |||||
| } | |||||
| @@ -61,9 +61,42 @@ import java.util.Vector; | |||||
| * Interface describing a regular expression matcher. | * Interface describing a regular expression matcher. | ||||
| * | * | ||||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | ||||
| * @author <a href="mailto:mattinger@mindless.com">Matthew Inger</a> | |||||
| */ | */ | ||||
| public interface RegexpMatcher { | 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). | |||||
| */ | |||||
| int MATCH_DEFAULT = 0x00000000; | |||||
| /*** | |||||
| * Perform a case insenstive match | |||||
| */ | |||||
| int MATCH_CASE_INSENSITIVE = 0x00000100; | |||||
| /*** | |||||
| * Treat the input as a multiline input | |||||
| */ | |||||
| int MATCH_MULTILINE = 0x00001000; | |||||
| /*** | |||||
| * Treat the input as singleline input ('.' matches newline) | |||||
| */ | |||||
| int MATCH_SINGLELINE = 0x00010000; | |||||
| /** | /** | ||||
| * Set the regexp pattern from the String description. | * Set the regexp pattern from the String description. | ||||
| */ | */ | ||||
| @@ -72,12 +105,12 @@ public interface RegexpMatcher { | |||||
| /** | /** | ||||
| * Get a String representation of the regexp pattern | * Get a String representation of the regexp pattern | ||||
| */ | */ | ||||
| String getPattern(); | |||||
| String getPattern() throws BuildException; | |||||
| /** | /** | ||||
| * Does the given argument match the pattern? | * Does the given argument match the pattern? | ||||
| */ | */ | ||||
| boolean matches(String argument); | |||||
| boolean matches(String argument) throws BuildException; | |||||
| /** | /** | ||||
| * Returns a Vector of matched groups found in the argument. | * Returns a Vector of matched groups found in the argument. | ||||
| @@ -85,5 +118,24 @@ public interface RegexpMatcher { | |||||
| * <p>Group 0 will be the full match, the rest are the | * <p>Group 0 will be the full match, the rest are the | ||||
| * parenthesized subexpressions</p>. | * parenthesized subexpressions</p>. | ||||
| */ | */ | ||||
| Vector getGroups(String argument); | |||||
| Vector getGroups(String argument) throws BuildException; | |||||
| /*** | |||||
| * 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. | |||||
| */ | |||||
| boolean matches(String input, int options) throws BuildException; | |||||
| /*** | |||||
| * 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. | |||||
| */ | |||||
| Vector getGroups(String input, int options) throws BuildException; | |||||
| } | } | ||||
| @@ -55,6 +55,7 @@ | |||||
| package org.apache.tools.ant.util.regexp; | package org.apache.tools.ant.util.regexp; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | |||||
| /** | /** | ||||
| * Simple Factory Class that produces an implementation of | * Simple Factory Class that produces an implementation of | ||||
| @@ -71,11 +72,30 @@ public class RegexpMatcherFactory { | |||||
| public RegexpMatcherFactory() {} | public RegexpMatcherFactory() {} | ||||
| /*** | |||||
| * Create a new regular expression instance. | |||||
| */ | |||||
| public RegexpMatcher newRegexpMatcher() throws BuildException { | public RegexpMatcher newRegexpMatcher() throws BuildException { | ||||
| String systemDefault = System.getProperty("ant.regexp.matcherimpl"); | |||||
| return newRegexpMatcher(null); | |||||
| } | |||||
| /*** | |||||
| * Create a new regular expression instance. | |||||
| * | |||||
| * @param p Project whose ant.regexp.regexpimpl property will be used. | |||||
| */ | |||||
| public RegexpMatcher newRegexpMatcher(Project p) | |||||
| throws BuildException { | |||||
| String systemDefault = null; | |||||
| if (p == null) { | |||||
| systemDefault = System.getProperty("ant.regexp.regexpimpl"); | |||||
| } else { | |||||
| systemDefault = (String) p.getProperties().get("ant.regexp.regexpimpl"); | |||||
| } | |||||
| if (systemDefault != null) { | if (systemDefault != null) { | ||||
| return createInstance(systemDefault); | return createInstance(systemDefault); | ||||
| // XXX should we silently possible exceptions and try to | |||||
| // XXX should we silently catch possible exceptions and try to | |||||
| // load a different implementation? | // load a different implementation? | ||||
| } | } | ||||
| @@ -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; | |||||
| /*** | |||||
| * Regular expression utilities class which handles flag operations | |||||
| * | |||||
| * @author <a href="mailto:mattinger@mindless.com">Matthew Inger</a> | |||||
| */ | |||||
| public class RegexpUtil extends Object | |||||
| { | |||||
| public static final boolean hasFlag(int options, int flag) | |||||
| { | |||||
| return ((options & flag) > 0); | |||||
| } | |||||
| public static final int removeFlag(int options, int flag) | |||||
| { | |||||
| return (options & (0xFFFFFFFF - flag)); | |||||
| } | |||||
| } | |||||