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 @@
   &lt;/copy&gt;
 </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>
-&lt;filterreader 
classname=&quot;org.apache.tools.ant.filters.SortFilter&quot;/&gt;
+&lt;filterreader 
classname=&quot;org.apache.tools.ant.filters.UniqFilter&quot;/&gt;
 </pre></blockquote>
 
 Convenience method:
 <blockquote><pre>
-&lt;sortfilter/&gt;
-</pre></blockquote>
-
-This will reverse the sort order.
-
-<blockquote><pre>
-&lt;filterreader 
classname=&quot;org.apache.tools.ant.filters.SortFilter&quot;&gt;
-  &lt;param name=&quot;reverse&quot; value=&quot;true&quot;/&gt;
-&lt;/filterreader&gt;
-</pre></blockquote>
-
-Convenience method:
-<blockquote><pre>
-&lt;sortfilter reverse="true"/&gt;
-</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>
-&lt;typedef classname="org.apache.tools.ant.filters.EvenFirstCmp"
-         name="evenfirst"/>
-...
-  &lt;filterchain>
-    &lt;sortfilter>
-      &lt;evenfirst/>
-    &lt;/sortfilter>
-  &lt;/filterchain>
+&lt;uniqfilter/&gt;
 </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


Reply via email to