Browse Source

Make the choice of regular expression implementation possible with

ant.regexp.regexpimpl as a normal project property
PR: 15390


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275722 13f79535-47bb-0310-9956-ffa450edef68
master
Antoine Levy-Lambert 21 years ago
parent
commit
f073a88c12
5 changed files with 161 additions and 71 deletions
  1. +12
    -21
      docs/manual/CoreTypes/filterchain.html
  2. +98
    -0
      docs/manual/CoreTypes/regexp.html
  3. +4
    -43
      docs/manual/OptionalTasks/replaceregexp.html
  4. +1
    -0
      docs/manual/conceptstypeslist.html
  5. +46
    -7
      src/main/org/apache/tools/ant/types/RegularExpression.java

+ 12
- 21
docs/manual/CoreTypes/filterchain.html View File

@@ -333,19 +333,8 @@ Convenience method:
Filter which includes only those lines that contain the user-specified
regular expression matching strings.

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Parameter Type</B></TD>
<TD vAlign=top><B>Parameter Value</B></TD>
<TD vAlign=top align="center"><B>Required</B></TD>
</TR>
<TR>
<TD vAlign=top>regexp</TD>
<TD vAlign=top align="center">Pattern of the substring to be searched for.</TD>
<TD vAlign=top align="center">Yes</TD>
</TR>
</TABLE>
<P>
See <a href="../CoreTypes/regexp.html">Regexp Type</a> for the description of the nested element regexp and of
the choice of regular expression implementation.
<H4>Example:</H4>

This will fetch all those lines that contain the pattern <code>foo</code>
@@ -1112,10 +1101,12 @@ Include only lines that contain "foo";
</PRE></BLOCKQUOTE>

<p><b><em><a name="replaceregex">ReplaceRegex</a></em></b></p>
This string filter replaces regular expressions. See
<a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a>
for an explanation on regular expressions.
This string filter replaces regular expressions.
This filter may be used directly within a filterchain.
<p>
See <a href="../CoreTypes/regexp.html#implementation">Regexp Type</a>
concerning the choice of the implementation.
</p>

<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
@@ -1143,7 +1134,6 @@ for an explanation of regex flags.</TD>
<TD vAlign=top align="center">No</TD>
</TR>
</TABLE>

<H4>Examples:</H4>

Replace all occurances of "hello" with "world", ignoring case.
@@ -1158,11 +1148,12 @@ Replace all occurances of "hello" with "world", ignoring case.
<p><b><em><a name="containsregex">ContainsRegex</a></em></b></p>
This filters strings that match regular expressions.
The filter may optionally replace the matched regular expression.
See
<a href="../OptionalTasks/replaceregexp.html">ReplaceRegexp</a>
for an explanation on regular expressions.
This filter may be used directly within a filterchain.

<p>
See
<a href="../CoreTypes/regexp.html#implementation">Regexp Type</a>
concerning the choice of regular expression implementation.
</p>
<TABLE cellSpacing=0 cellPadding=2 border=1>
<TR>
<TD vAlign=top><B>Attribute</B></TD>


+ 98
- 0
docs/manual/CoreTypes/regexp.html View File

@@ -0,0 +1,98 @@
<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Regexp Type</title>
</head>

<body>

<h2><a name="regexp">Regexp</a></h2>
<p>
Regexp represents a regular expression.
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
<tr>
<td valign="top"><b>Attribute</b></td>
<td valign="top"><b>Description</b></td>
<td align="center" valign="top"><b>Required</b></td>
</tr>
<tr>
<td valign="top">pattern</td>
<td valign="top">regular expression pattern</td>
<td valign="top" align="center">Yes</td>
</tr>
</table>

<h3>Examples</h3>
<blockquote><pre>
&lt;regexp id="myregexp" pattern="alpha(.+)beta"/&gt;<br />
</pre></blockquote>
<p>
Defines a regular expression for later use with id myregexp.
</p>
<blockquote><pre>
&lt;regexp refid="myregexp"/&gt;<br />
</pre></blockquote>
<p>
Use the regular expression with id myregexp.
</p>
<a name="implementation"/>
<h3>Choice of regular expression implementation</h3>
<p>
Ant comes with
wrappers for
<a href="http://java.sun.com/j2se/1.4/docs/api/java/util/regex/package-summary.html" target="_top">the java.util.regex package of JDK 1.4</a>,
<a href="http://jakarta.apache.org/regexp/" target="_top">jakarta-regexp</a>
and <a href="http://jakarta.apache.org/oro/" target="_top">jakarta-ORO</a>,
See <a href="../install.html#librarydependencies">installation dependencies</a>
concerning the supporting libraries.</p>
<p>
The property <code>ant.regexp.regexpimpl</code> governs which regular expression implementation will be chosen.
Possible values for this property are :
<ul>
<li>
org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp
</li>
<li>
org.apache.tools.ant.util.regexp.JakartaOroRegexp
</li>
<li>
org.apache.tools.ant.util.regexp.JakartaRegexpRegexp
</li>
</ul>
It can also be another implementation of the interface <code>org.apache.tools.ant.util.regexp.Regexp</code>.
If <code>ant.regexp.regexpimpl</code> is not defined, ant checks in the order Jdk14Regexp, JakartaOroRegexp,
JakartaRegexp for the availability of the corresponding library. The first of these 3 which is found will be used.</p>
<p>
There are cross-platform issues for matches related to line terminator.
For example if you use $ to anchor your regular expression on the end of a line
the results might be very different depending on both your platform and the regular
expression library you use. It is 'highly recommended' that you test your pattern on
both Unix and Windows platforms before you rely on it.
<ul>
<li>Jakarta Oro defines a line terminator as '\n' and is consistent with Perl.</li>
<li>Jakarta RegExp uses a system-dependant line terminator.</li>
<li>JDK 1.4 uses '\n', '\r\n', '\u0085', '\u2028', '\u2029' as a default
but is configured in the wrapper to use only '\n' (UNIX_LINE)</li>
</ul>
<em>We <b>strongly</b> recommend that you use Jakarta Oro.</em>
</p>
<h3>Usage</h3>
The following tasks and types use the Regexp type :
<ul>
<li><a href="CoreTasks/replaceregexp.html">ReplaceRegExp task</a></li>
<li><a href="filterchain.html#linecontainsregexp">LineContainsRegexp filter</a></li>
</ul>
<p>
These string filters also use the mechanism of regexp to choose a regular expression implementation :
</p>
<ul>
<li><a href="filterchain.html#containsregex">ContainsRegex string filter</a></li>
<li><a href="filterchain.html#replaceregex">ReplaceRegex string filter</a></li>
</ul>
<hr>
<p align="center">Copyright &copy; 2003 Apache Software Foundation.
All rights Reserved.</p>
</body>
</html>

+ 4
- 43
docs/manual/OptionalTasks/replaceregexp.html View File

@@ -19,7 +19,8 @@ have been regenerated by this task.</p>
<p>Similar to <a href="../CoreTypes/mapper.html#regexp-mapper">regexp
type mappers</a> this task needs a supporting regular expression
library and an implementation of
<code>org.apache.tools.ant.util.regexp.Regexp</code>. See details <a href="#implementation">below</a>. </p>
<code>org.apache.tools.ant.util.regexp.Regexp</code>.
See details in the documentation of the <a href=../CoreTypes/regexp.html#implementation">Regexp Type</a>. </p>

<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -79,51 +80,11 @@ library and an implementation of
<p>replaces occurrences of the property name &quot;OldProperty&quot;
with &quot;NewProperty&quot; in a properties file, preserving the existing
value, in the file <code>${src}/build.properties</code></p>
<a name="implementation"/>
<h3>Choice of regular expression implementation</h3>
<p>
Ant comes with
wrappers for
<a href="http://java.sun.com/j2se/1.4/docs/api/java/util/regex/package-summary.html" target="_top">the java.util.regex package of JDK 1.4</a>,
<a href="http://jakarta.apache.org/regexp/" target="_top">jakarta-regexp</a>
and <a href="http://jakarta.apache.org/oro/" target="_top">jakarta-ORO</a>,
See <a href="../install.html#librarydependencies">installation dependencies</a>
concerning the supporting libraries.</p>
<p>
The system property <code>ant.regexp.regexpimpl</code> governs which regular expression implementation will be chosen.
Possible values for this property are :
<ul>
<li>
org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp
</li>
<li>
org.apache.tools.ant.util.regexp.JakartaOroRegexp
</li>
<li>
org.apache.tools.ant.util.regexp.JakartaRegexpRegexp
</li>
</ul>
It can also be another implementation of the interface <code>org.apache.tools.ant.util.regexp.Regexp</code>.
If <code>ant.regexp.regexpimpl</code> is not defined, ant checks in the order Jdk14Regexp, JakartaOroRegexp,
JakartaRegexp for the availability of the corresponding library. The first of these 3 which is found will be used.</p>
<p>
There are cross-platform issues for matches related to line terminator.
For example if you use $ to anchor your regular expression on the end of a line
the results might be very different depending on both your platform and the regular
expression library you use. It is 'highly recommended' that you test your pattern on
both Unix and Windows platforms before you rely on it.
<ul>
<li>Jakarta Oro defines a line terminator as '\n' and is consistent with Perl.</li>
<li>Jakarta RegExp uses a system-dependant line terminator.</li>
<li>JDK 1.4 uses '\n', '\r\n', '\u0085', '\u2028', '\u2029' as a default
but is configured in the wrapper to use only '\n' (UNIX_LINE)</li>
</ul>
<em>We <b>strongly</b> recommend that you use Jakarta Oro.</em>
</p>

<h3>Parameters specified as nested elements</h3>
<p>This task supports a nested <a href="../CoreTypes/fileset.html">FileSet</a>
element.</p>
<p>This task supports a nested <i>Regexp</i> element to specify
<p>This task supports a nested <i><a href="../CoreTypes/regexp.html">Regexp</a></i> element to specify
the regular expression. You can use this element to refer to a previously
defined regular expression datatype instance.</p>
<blockquote>


+ 1
- 0
docs/manual/conceptstypeslist.html View File

@@ -27,6 +27,7 @@
<a href="using.html#path">Path-like Structures</a><br>
<a href="CoreTypes/permissions.html">Permissions</a><br>
<a href="CoreTypes/propertyset.html">PropertySet</a><br>
<a href="CoreTypes/regexp.html">Regexp</a><br>
<a href="CoreTypes/selectors.html">Selectors</a><br>
<a href="CoreTypes/xmlcatalog.html">XMLCatalog</a><br>
<a href="CoreTypes/zipfileset.html">ZipFileSet</a><br>


+ 46
- 7
src/main/org/apache/tools/ant/types/RegularExpression.java View File

@@ -1,7 +1,7 @@
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -99,42 +99,81 @@ import org.apache.tools.ant.util.regexp.RegexpFactory;
public class RegularExpression extends DataType {
/** Name of this data type */
public static final String DATA_TYPE_NAME = "regexp";
private boolean alreadyInit = false;

// The regular expression factory
private static final RegexpFactory factory = new RegexpFactory();
private static final RegexpFactory FACTORY = new RegexpFactory();

private Regexp regexp;
private Regexp regexp = null;
// temporary variable
private String myPattern;
private boolean setPatternPending = false;

/**
* default constructor
*/
public RegularExpression() {
this.regexp = factory.newRegexp();
}

private void init(Project p) {
if (!alreadyInit) {
this.regexp = FACTORY.newRegexp(p);
alreadyInit = true;
}
}
private void setPattern() {
if (setPatternPending) {
regexp.setPattern(myPattern);
setPatternPending = false;
}
}
/**
* sets the regular expression pattern
* @param pattern regular expression pattern
*/
public void setPattern(String pattern) {
this.regexp.setPattern(pattern);
if (regexp == null) {
myPattern = pattern;
setPatternPending = true;
} else {
regexp.setPattern(pattern);
}
}

/***
* Gets the pattern string for this RegularExpression in the
* given project.
* @param p project
* @return pattern
*/
public String getPattern(Project p) {
init(p);
if (isReference()) {
return getRef(p).getPattern(p);
}

setPattern();
return regexp.getPattern();
}

/**
* provides a reference to the Regexp contained in this
* @param p project
* @return Regexp instance associated with this RegularExpression instance
*/
public Regexp getRegexp(Project p) {
init(p);
if (isReference()) {
return getRef(p).getRegexp(p);
}
setPattern();
return this.regexp;
}

/***
* Get the RegularExpression this reference refers to in
* the given project. Check for circular references too
* @param p project
* @return resolved RegularExpression instance
*/
public RegularExpression getRef(Project p) {
if (!isChecked()) {
@@ -147,7 +186,7 @@ public class RegularExpression extends DataType {
Object o = getRefid().getReferencedObject(p);
if (!(o instanceof RegularExpression)) {
String msg = getRefid().getRefId() + " doesn\'t denote a "
+ DATA_TYPE_NAME;
+ DATA_TYPE_NAME;
throw new BuildException(msg);
} else {
return (RegularExpression) o;


Loading…
Cancel
Save