Index: src/etc/testcases/taskdefs/copy.xml =================================================================== RCS file: /home/cvspublic/jakarta-ant/src/etc/testcases/taskdefs/copy.xml,v retrieving revision 1.8 diff -u -r1.8 copy.xml --- src/etc/testcases/taskdefs/copy.xml 6 Mar 2002 03:25:50 -0000 1.8 +++ src/etc/testcases/taskdefs/copy.xml 26 Sep 2002 21:17:34 -0000 @@ -61,6 +61,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -71,6 +105,8 @@ + + Index: src/main/org/apache/tools/ant/filters/LineContains.java =================================================================== RCS file: /home/cvspublic/jakarta-ant/src/main/org/apache/tools/ant/filters/LineContains.java,v retrieving revision 1.7 diff -u -r1.7 LineContains.java --- src/main/org/apache/tools/ant/filters/LineContains.java 25 Jul 2002 15:21:02 -0000 1.7 +++ src/main/org/apache/tools/ant/filters/LineContains.java 26 Sep 2002 21:17:37 -0000 @@ -86,6 +86,7 @@ implements ChainableReader { /** Parameter name for the words to filter on. */ private static final String CONTAINS_KEY = "contains"; + private static final String CONTAINS_ALL_KEY = "containsAll"; /** Vector that holds the strings that input lines must contain. */ private Vector contains = new Vector(); @@ -97,6 +98,28 @@ */ private String line = null; + private boolean containsAll = true; + + + /** + * Sets whether all the values must be contained in the line + * + * @param whether all the values must be contained in the line + */ + public final void setContainsAll(boolean containsAll) { + this.containsAll = containsAll; + } + + /** + * Returns whether all values must be contained in the line + * + * @return whether all the values must be contained in the line + */ + private final boolean getContainsAll() { + return containsAll; + } + + /** * Constructor for "dummy" instances. * @@ -104,6 +127,7 @@ */ public LineContains() { super(); + } /** @@ -142,22 +166,34 @@ line = line.substring(1); } } else { - String goodLine = null; line = readLine(); - while((line != null) && (goodLine == null)) { - goodLine = line; - int containsSize = contains.size(); - for (int i = 0; i < containsSize; i++) { - String containsStr = (String) contains.elementAt(i); + if(line!=null){ + int containsSize = contains.size(); + boolean foundAtLeastOne =false; + for (int i = 0; i < containsSize; i++) { + String containsStr = (String) contains.elementAt(i); + if(containsAll){ + // if we have to contain all if (line.indexOf(containsStr) == -1) { - goodLine = null; + line=null; break; } - } - return read(); - }; - } + } + else { + // if we don't have to contain all, break as soon as we find one + if (line.indexOf(containsStr) > -1){ + foundAtLeastOne = true; + break; + } + } + } + if(!containsAll && !foundAtLeastOne){ + line=null; + } + return read(); + } + } return ch; } @@ -208,6 +244,7 @@ public final Reader chain(final Reader rdr) { LineContains newFilter = new LineContains(rdr); newFilter.setContains(getContains()); + newFilter.setContainsAll(getContainsAll()); newFilter.setInitialized(true); return newFilter; } @@ -221,6 +258,9 @@ for (int i = 0; i < params.length; i++) { if (CONTAINS_KEY.equals(params[i].getType())) { contains.addElement(params[i].getValue()); + } + if (CONTAINS_ALL_KEY.equals(params[i].getType())) { + containsAll=new Boolean(params[i].getValue()).booleanValue(); } } } Index: src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java =================================================================== RCS file: /home/cvspublic/jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java,v retrieving revision 1.9 diff -u -r1.9 CopyTest.java --- src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java 23 Apr 2002 10:30:12 -0000 1.9 +++ src/testcases/org/apache/tools/ant/taskdefs/CopyTest.java 26 Sep 2002 21:17:48 -0000 @@ -144,6 +144,33 @@ assertTrue(fileUtils.contentEquals(tmp, check)); } + public void testFilterChainContains() throws IOException { + executeTarget("testFilterChainLineContains"); + FileUtils fileUtils = FileUtils.newFileUtils(); + File tmp = new File(getProjectDir(), "copy.filterchain.linecontains.tmp"); + File check = new File(getProjectDir(), "expected/copy.filterchain.linecontains.filtered"); + assertTrue(tmp.exists()); + assertTrue(fileUtils.contentEquals(tmp, check)); + } + + public void testFilterChainContainsMultiple() throws IOException { + executeTarget("testFilterChainLineContainsMultiple"); + FileUtils fileUtils = FileUtils.newFileUtils(); + File tmp = new File(getProjectDir(), "copy.filterchain.linecontains.multiple.tmp"); + File check = new File(getProjectDir(), "expected/copy.filterchain.linecontains.multiple.filtered"); + assertTrue(tmp.exists()); + assertTrue(fileUtils.contentEquals(tmp, check)); + } + + public void testFilterChainContainsAny() throws IOException { + executeTarget("testFilterChainLineContainsAny"); + FileUtils fileUtils = FileUtils.newFileUtils(); + File tmp = new File(getProjectDir(), "copy.filterchain.linecontains.any.tmp"); + File check = new File(getProjectDir(), "expected/copy.filterchain.linecontains.any.filtered"); + assertTrue(tmp.exists()); + assertTrue(fileUtils.contentEquals(tmp, check)); + } + public void testSingleFileFileset() { executeTarget("test_single_file_fileset"); File file = new File(getProjectDir(),