Author: bodewig Date: Wed Aug 26 14:14:12 2009 New Revision: 808018 URL: http://svn.apache.org/viewvc?rev=808018&view=rev Log: Now that we have sort, throw in uniq as well
Added: ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java (with props) ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt (with props) ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt (with props) ant/core/trunk/src/tests/antunit/filters/input/uniq.txt (with props) ant/core/trunk/src/tests/antunit/filters/uniq-test.xml (with props) Modified: ant/core/trunk/WHATSNEW ant/core/trunk/docs/manual/CoreTypes/filterchain.html ant/core/trunk/src/main/org/apache/tools/ant/antlib.xml Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=808018&r1=808017&r2=808018&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Wed Aug 26 14:14:12 2009 @@ -927,6 +927,9 @@ added. Bugzilla Report 40504. + * A new filterreader <uniqfilter> that suppresses lines that match + their ancestor line has been added. + Changes from Ant 1.7.0 TO Ant 1.7.1 ============================================= Modified: ant/core/trunk/docs/manual/CoreTypes/filterchain.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTypes/filterchain.html?rev=808018&r1=808017&r2=808018&view=diff ============================================================================== --- ant/core/trunk/docs/manual/CoreTypes/filterchain.html (original) +++ ant/core/trunk/docs/manual/CoreTypes/filterchain.html Wed Aug 26 14:14:12 2009 @@ -125,6 +125,7 @@ <a href="#tokenfilter">TokenFilter</a><br> <a href="../CoreTasks/fixcrlf.html">FixCRLF</a><br> <a href="#sortfilter">SortFilter</a><br> +<a href="#sortfilter">UniqFilter</a><br> <h3><a name="filterreader">FilterReader</a></h3> @@ -1494,97 +1495,21 @@ </copy> </pre></blockquote> -<h3><a name="sortfilter">SortFilter</a></h3> +<h3><a name="uniqfilter">UniqFilter</a></h3> -<p>This filter sorts lines lexicographically but you can specifiy a - custom comparator as well.</p> +<p>Suppresses all lines that match their ancestor line. It is most + useful if combined with a sort filter.</p> -<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>reverse</td> - <td vAlign=top align="center">Whether to reverse the sort order - (boolean). Will be ignored if a custom comparator has been - specified.</td> - <td vAlign=top align="center">No</td> - </tr> - <tr> - <td vAlign=top>comparator</td> - <td vAlign=top align="center">Classname of a class - implementing <code>java.util.Comparator</code> an instance of - which will be used when comparing lines.</td> - <td vAlign=top align="center">No</td> - </tr> -</table> -<p> <h4>Example:</h4> -This will sort the lines. +This suppresses duplicate lines. <blockquote><pre> -<filterreader classname="org.apache.tools.ant.filters.SortFilter"/> +<filterreader classname="org.apache.tools.ant.filters.UniqFilter"/> </pre></blockquote> Convenience method: <blockquote><pre> -<sortfilter/> -</pre></blockquote> - -This will reverse the sort order. - -<blockquote><pre> -<filterreader classname="org.apache.tools.ant.filters.SortFilter"> - <param name="reverse" value="true"/> -</filterreader> -</pre></blockquote> - -Convenience method: -<blockquote><pre> -<sortfilter reverse="true"/> -</pre></blockquote> - -You can use your own comparator, the easiest way is by using typedef -and the convenience method which allows to specify the comparator as a -nested element: -<blockquote><pre> -public final class EvenFirstCmp implements Comparator { - - public int compare(Object o1, Object o2) { - String s1 = ((String) o1).substring(5).trim(); - String s2 = ((String) o2).substring(5).trim(); - int n1 = Integer.parseInt(s1); - int n2 = Integer.parseInt(s2); - if (n1 % 2 == 0) { - if (n2 % 2 == 0) { - return n1 - n2; - } else { - return -1; - } - } else { - if (n2 % 2 == 0) { - return 1; - } else { - return n1 - n2; - } - } - } -} -</pre></blockquote> - -and used as - -<blockquote><pre> -<typedef classname="org.apache.tools.ant.filters.EvenFirstCmp" - name="evenfirst"/> -... - <filterchain> - <sortfilter> - <evenfirst/> - </sortfilter> - </filterchain> +<uniqfilter/> </pre></blockquote> </body></html> Modified: ant/core/trunk/src/main/org/apache/tools/ant/antlib.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/antlib.xml?rev=808018&r1=808017&r2=808018&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/antlib.xml (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/antlib.xml Wed Aug 26 14:14:12 2009 @@ -138,5 +138,7 @@ <!-- filters --> <componentdef name="sortfilter" onerror="ignore" classname="org.apache.tools.ant.filters.SortFilter"/> + <componentdef name="uniqfilter" onerror="ignore" + classname="org.apache.tools.ant.filters.UniqFilter"/> </antlib> Added: ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java?rev=808018&view=auto ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java (added) +++ ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java Wed Aug 26 14:14:12 2009 @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.filters; + +import java.io.IOException; +import java.io.Reader; + +/** + * Like the Unix uniq(1) command, only returns lines that are + * different from their ancestor line. + * + * <p>This filter is probably most useful if used together with a sortfilter.</p> + * + * @since Ant 1.8.0 + */ +public class UniqFilter extends BaseFilterReader implements ChainableReader { + + private String lastLine = null; + private String currentLine = null; + + public UniqFilter() { } + + public UniqFilter(Reader rdr) { + super(rdr); + } + + public int read() throws IOException { + int ch = -1; + if (currentLine != null) { + ch = currentLine.charAt(0); + if (currentLine.length() == 1) { + currentLine = null; + } else { + currentLine = currentLine.substring(1); + } + } else { + do { + currentLine = readLine(); + } while (lastLine != null && currentLine != null + && lastLine.equals(currentLine)); + lastLine = currentLine; + if (currentLine != null) { + return read(); + } + } + return ch; + } + + public Reader chain(final Reader rdr) { + UniqFilter newFilter = new UniqFilter(rdr); + newFilter.setInitialized(true); + return newFilter; + } +} Propchange: ant/core/trunk/src/main/org/apache/tools/ant/filters/UniqFilter.java ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt?rev=808018&view=auto ============================================================================== --- ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt (added) +++ ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt Wed Aug 26 14:14:12 2009 @@ -0,0 +1,4 @@ +A +AA +B +C Propchange: ant/core/trunk/src/tests/antunit/filters/expected/sortuniq.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt?rev=808018&view=auto ============================================================================== --- ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt (added) +++ ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt Wed Aug 26 14:14:12 2009 @@ -0,0 +1,5 @@ +A +AA +B +C +B Propchange: ant/core/trunk/src/tests/antunit/filters/expected/uniq.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/core/trunk/src/tests/antunit/filters/input/uniq.txt URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/filters/input/uniq.txt?rev=808018&view=auto ============================================================================== --- ant/core/trunk/src/tests/antunit/filters/input/uniq.txt (added) +++ ant/core/trunk/src/tests/antunit/filters/input/uniq.txt Wed Aug 26 14:14:12 2009 @@ -0,0 +1,6 @@ +A +AA +AA +B +C +B Propchange: ant/core/trunk/src/tests/antunit/filters/input/uniq.txt ------------------------------------------------------------------------------ svn:eol-style = native Added: ant/core/trunk/src/tests/antunit/filters/uniq-test.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/filters/uniq-test.xml?rev=808018&view=auto ============================================================================== --- ant/core/trunk/src/tests/antunit/filters/uniq-test.xml (added) +++ ant/core/trunk/src/tests/antunit/filters/uniq-test.xml Wed Aug 26 14:14:12 2009 @@ -0,0 +1,49 @@ +<?xml version="1.0"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> + <import file="../antunit-base.xml" /> + + <target name="setUp"> + <mkdir dir="${output}"/> + </target> + + <target name="testUniqFilter" depends="setUp"> + <copy file="input/uniq.txt" + tofile="${output}/uniq.txt"> + <filterchain> + <uniqfilter/> + </filterchain> + </copy> + <au:assertFilesMatch + expected="expected/uniq.txt" + actual="${output}/uniq.txt"/> + </target> + + <target name="testSortUniq" depends="setUp"> + <copy file="input/uniq.txt" + tofile="${output}/uniq.txt"> + <filterchain> + <sortfilter/> + <uniqfilter/> + </filterchain> + </copy> + <au:assertFilesMatch + expected="expected/sortuniq.txt" + actual="${output}/uniq.txt"/> + </target> +</project> Propchange: ant/core/trunk/src/tests/antunit/filters/uniq-test.xml ------------------------------------------------------------------------------ svn:eol-style = native