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)); | |||||
} | |||||
} |