PR: 34374 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278124 13f79535-47bb-0310-9956-ffa450edef68master
@@ -308,6 +308,12 @@ strings. | |||
<td vAlign=top align="center">Substring to be searched for.</td> | |||
<td vAlign=top align="center">Yes</td> | |||
</tr> | |||
<tr> | |||
<td vAlign=top>negate</td> | |||
<td vAlign=top align="center">Whether to select | |||
<i>non-</i>matching lines only. <b>Since Ant 1.7</b></td> | |||
<td vAlign=top align="center">No</td> | |||
</tr> | |||
</table> | |||
<p> | |||
<h4>Example:</h4> | |||
@@ -329,11 +335,46 @@ Convenience method: | |||
</linecontains> | |||
</pre></blockquote> | |||
Negation: | |||
<blockquote><pre> | |||
<filterreader classname="org.apache.tools.ant.filters.LineContains"> | |||
<param type="negate" value="true"/> | |||
<param type="contains" value="foo"/> | |||
<param type="contains" value="bar"/> | |||
</filterreader> | |||
</pre></blockquote> | |||
<i>or</i> | |||
<blockquote><pre> | |||
<linecontains negate="true"> | |||
<contains value="foo"/> | |||
<contains value="bar"/> | |||
</linecontains> | |||
</pre></blockquote> | |||
<h3><a name="linecontainsregexp">LineContainsRegExp</a></h3> | |||
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">Regular expression to be searched for.</td> | |||
<td vAlign=top align="center">Yes</td> | |||
</tr> | |||
<tr> | |||
<td vAlign=top>negate</td> | |||
<td vAlign=top align="center">Whether to select | |||
<i>non-</i>matching lines only. <b>Since Ant 1.7</b></td> | |||
<td vAlign=top align="center">No</td> | |||
</tr> | |||
</table> | |||
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> | |||
@@ -352,6 +393,20 @@ Convenience method: | |||
</linecontainsregexp> | |||
</pre></blockquote> | |||
Negation: | |||
<blockquote><pre> | |||
<filterreader classname="org.apache.tools.ant.filters.LineContainsRegExp"> | |||
<param type="negate" value="true"/> | |||
<param type="regexp" value="foo*"/> | |||
</filterreader> | |||
</pre></blockquote> | |||
<i>or</i> | |||
<blockquote><pre> | |||
<linecontainsregexp negate="true"> | |||
<regexp pattern="foo*"/> | |||
</linecontainsregexp> | |||
</pre></blockquote> | |||
<h3><a name="prefixlines">PrefixLines</a></h3> | |||
Attaches a prefix to every line. | |||
@@ -25,6 +25,26 @@ | |||
</fixcrlf>--> | |||
</target> | |||
<target name="testNegateLineContains" depends="init"> | |||
<copy file="input/linecontains.test" | |||
tofile="result/negatelinecontains.test"> | |||
<filterchain> | |||
<filterreader classname="org.apache.tools.ant.filters.LineContains"> | |||
<param type="negate" value="true"/> | |||
<param type="contains" value="beta"/> | |||
</filterreader> | |||
</filterchain> | |||
</copy> | |||
<fail> | |||
<condition> | |||
<not> | |||
<filesmatch file1="result/negatelinecontains.test" | |||
file2="expected/negatelinecontains.test" /> | |||
</not> | |||
</condition> | |||
</fail> | |||
</target> | |||
<target name="testEscapeUnicode" depends="init"> | |||
<copy todir="result" encoding="UTF-8"> | |||
<fileset dir="input"> | |||
@@ -0,0 +1,3 @@ | |||
This is line 1 with alpha. | |||
This is line 4 with gamma. | |||
This is line 6 with delta. |
@@ -19,6 +19,7 @@ package org.apache.tools.ant.filters; | |||
import java.io.IOException; | |||
import java.io.Reader; | |||
import java.util.Vector; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.types.Parameter; | |||
/** | |||
@@ -49,6 +50,9 @@ public final class LineContains | |||
/** Parameter name for the words to filter on. */ | |||
private static final String CONTAINS_KEY = "contains"; | |||
/** Parameter name for the words to filter on. */ | |||
private static final String NEGATE_KEY = "negate"; | |||
/** Vector that holds the strings that input lines must contain. */ | |||
private Vector contains = new Vector(); | |||
@@ -59,6 +63,8 @@ public final class LineContains | |||
*/ | |||
private String line = null; | |||
private boolean negate = false; | |||
/** | |||
* Constructor for "dummy" instances. | |||
* | |||
@@ -104,31 +110,22 @@ public final class LineContains | |||
line = line.substring(1); | |||
} | |||
} else { | |||
line = readLine(); | |||
final int containsSize = contains.size(); | |||
while (line != null) { | |||
for (int i = 0; i < containsSize; i++) { | |||
for (line = readLine(); line != null; line = readLine()) { | |||
boolean matches = true; | |||
for (int i = 0; matches && i < containsSize; i++) { | |||
String containsStr = (String) contains.elementAt(i); | |||
if (line.indexOf(containsStr) == -1) { | |||
line = null; | |||
break; | |||
} | |||
matches = line.indexOf(containsStr) >= 0; | |||
} | |||
if (line == null) { | |||
// line didn't match | |||
line = readLine(); | |||
} else { | |||
if (matches ^ isNegated()) { | |||
break; | |||
} | |||
} | |||
if (line != null) { | |||
return read(); | |||
} | |||
} | |||
return ch; | |||
} | |||
@@ -142,6 +139,22 @@ public final class LineContains | |||
this.contains.addElement(contains.getValue()); | |||
} | |||
/** | |||
* Set the negation mode. Default false (no negation). | |||
* @param b the boolean negation mode to set. | |||
*/ | |||
public void setNegate(boolean b) { | |||
negate = b; | |||
} | |||
/** | |||
* Find out whether we have been negated. | |||
* @return boolean negation flag. | |||
*/ | |||
public boolean isNegated() { | |||
return negate; | |||
} | |||
/** | |||
* Sets the vector of words which must be contained within a line read | |||
* from the original stream in order for it to match this filter. | |||
@@ -179,7 +192,7 @@ public final class LineContains | |||
public Reader chain(final Reader rdr) { | |||
LineContains newFilter = new LineContains(rdr); | |||
newFilter.setContains(getContains()); | |||
newFilter.setInitialized(true); | |||
newFilter.setNegate(isNegated()); | |||
return newFilter; | |||
} | |||
@@ -192,6 +205,8 @@ public final class LineContains | |||
for (int i = 0; i < params.length; i++) { | |||
if (CONTAINS_KEY.equals(params[i].getType())) { | |||
contains.addElement(params[i].getValue()); | |||
} else if (NEGATE_KEY.equals(params[i].getType())) { | |||
setNegate(Project.toBoolean(params[i].getValue())); | |||
} | |||
} | |||
} | |||
@@ -19,6 +19,7 @@ package org.apache.tools.ant.filters; | |||
import java.io.IOException; | |||
import java.io.Reader; | |||
import java.util.Vector; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.types.Parameter; | |||
import org.apache.tools.ant.types.RegularExpression; | |||
import org.apache.tools.ant.util.regexp.Regexp; | |||
@@ -47,6 +48,9 @@ public final class LineContainsRegExp | |||
/** Parameter name for the regular expression to filter on. */ | |||
private static final String REGEXP_KEY = "regexp"; | |||
/** Parameter name for the words to filter on. */ | |||
private static final String NEGATE_KEY = "negate"; | |||
/** Vector that holds the expressions that input lines must contain. */ | |||
private Vector regexps = new Vector(); | |||
@@ -57,6 +61,8 @@ public final class LineContainsRegExp | |||
*/ | |||
private String line = null; | |||
private boolean negate = false; | |||
/** | |||
* Constructor for "dummy" instances. | |||
* | |||
@@ -103,34 +109,24 @@ public final class LineContainsRegExp | |||
line = line.substring(1); | |||
} | |||
} else { | |||
line = readLine(); | |||
final int regexpsSize = regexps.size(); | |||
while (line != null) { | |||
for (int i = 0; i < regexpsSize; i++) { | |||
RegularExpression regexp = (RegularExpression) | |||
regexps.elementAt(i); | |||
for (line = readLine(); line != null; line = readLine()) { | |||
boolean matches = true; | |||
for (int i = 0; matches && i < regexpsSize; i++) { | |||
RegularExpression regexp | |||
= (RegularExpression) regexps.elementAt(i); | |||
Regexp re = regexp.getRegexp(getProject()); | |||
boolean matches = re.matches(line); | |||
if (!matches) { | |||
line = null; | |||
break; | |||
} | |||
matches = re.matches(line); | |||
} | |||
if (line == null) { | |||
// line didn't match | |||
line = readLine(); | |||
} else { | |||
if (matches ^ isNegated()) { | |||
break; | |||
} | |||
} | |||
if (line != null) { | |||
return read(); | |||
} | |||
} | |||
return ch; | |||
} | |||
@@ -184,10 +180,26 @@ public final class LineContainsRegExp | |||
public Reader chain(final Reader rdr) { | |||
LineContainsRegExp newFilter = new LineContainsRegExp(rdr); | |||
newFilter.setRegexps(getRegexps()); | |||
newFilter.setInitialized(true); | |||
newFilter.setNegate(isNegated()); | |||
return newFilter; | |||
} | |||
/** | |||
* Set the negation mode. Default false (no negation). | |||
* @param b the boolean negation mode to set. | |||
*/ | |||
public void setNegate(boolean b) { | |||
negate = b; | |||
} | |||
/** | |||
* Find out whether we have been negated. | |||
* @return boolean negation flag. | |||
*/ | |||
public boolean isNegated() { | |||
return negate; | |||
} | |||
/** | |||
* Parses parameters to add user defined regular expressions. | |||
*/ | |||
@@ -200,6 +212,8 @@ public final class LineContainsRegExp | |||
RegularExpression regexp = new RegularExpression(); | |||
regexp.setPattern(pattern); | |||
regexps.addElement(regexp); | |||
} else if (NEGATE_KEY.equals(params[i].getType())) { | |||
setNegate(Project.toBoolean(params[i].getValue())); | |||
} | |||
} | |||
} | |||
@@ -48,4 +48,8 @@ public class LineContainsTest extends BuildFileTest { | |||
assertTrue(FILE_UTILS.contentEquals(expected, result)); | |||
} | |||
public void testNegateLineContains() throws IOException { | |||
executeTarget("testNegateLineContains"); | |||
} | |||
} |