Author: mbenson
Date: Wed Sep 27 15:37:01 2006
New Revision: 450611

URL: http://svn.apache.org/viewvc?view=rev&rev=450611
Log:
add the <tokens> resource collection; tokenizers graduate to free-standing types

Added:
    ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java   
(with props)
    ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml   (with 
props)
    ant/core/trunk/src/tests/antunit/types/resources/utf-16.in   (with props)
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/docs/manual/CoreTypes/resources.html
    ant/core/trunk/src/main/org/apache/tools/ant/types/defaults.properties

Modified: ant/core/trunk/WHATSNEW
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?view=diff&rev=450611&r1=450610&r2=450611
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Wed Sep 27 15:37:01 2006
@@ -36,6 +36,9 @@
 
 * Extending JAR-Task for SPI. Bugzilla report 31520.
 
+* Added <tokens> resource collection for convenient creation of string
+  resources from other resources' content. Inspired by Bugzilla 40504.
+
 
 Changes from Ant 1.7.0Beta1 to Ant 1.7.0Beta2
 =============================================

Modified: ant/core/trunk/docs/manual/CoreTypes/resources.html
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTypes/resources.html?view=diff&rev=450611&r1=450610&r2=450611
==============================================================================
--- ant/core/trunk/docs/manual/CoreTypes/resources.html (original)
+++ ant/core/trunk/docs/manual/CoreTypes/resources.html Wed Sep 27 15:37:01 2006
@@ -317,6 +317,8 @@
   <li><a href="#sort">sort</a> - sorted resource collection</li>
   <li><a href="#first">first</a> - first <i>n</i> resources from a
     nested collection</li>
+  <li><a href="#tokens">tokens</a> - <a href="#string">string</a> tokens
+    gathered from a nested collection</li>
   <li><a href="#union">union</a> - set union of nested resource 
collections</li>
   <li><a href="#intersect">intersect</a> - set intersection
     of nested resource collections</li>
@@ -715,6 +717,36 @@
       <td valign="top">count</td>
       <td valign="top">The number of resources to include</td>
       <td valign="top" align="center">No, default 1</td>
+    </tr>
+    <tr>
+      <td valign="top">cache</td>
+      <td valign="top">Whether to cache results; disabling
+        may seriously impact performance</td>
+      <td valign="top" align="center">No, default <i>true</i></td>
+    </tr>
+  </table>
+  <h4>Parameters specified as nested elements</h4>
+  <p>A single resource collection is required.</p>
+</blockquote>
+
+<h4><a name="tokens">tokens</a></h4>
+<p>Includes the <a href="#string">string</a> tokens gathered from a nested
+ resource collection. Uses the same tokenizers supported by the
+<a href="filterchain.html#tokenfilter">TokenFilter</a>. Hint: imaginative
+  use of this resource collection can implement equivalents for such Unix
+  functions as <code>sort</code>, <code>grep -c</code>, <code>wc</code> and
+  <code>wc -l</code>.</p>
+<blockquote>
+  <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">encoding</td>
+      <td valign="top">The encoding of the nested resources</td>
+      <td valign="top" align="center">No, default is platform default</td>
     </tr>
     <tr>
       <td valign="top">cache</td>

Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/defaults.properties
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/defaults.properties?view=diff&rev=450611&r1=450610&r2=450611
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/defaults.properties 
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/defaults.properties Wed 
Sep 27 15:37:01 2006
@@ -56,6 +56,7 @@
 resources=org.apache.tools.ant.types.resources.Resources
 first=org.apache.tools.ant.types.resources.First
 tarfileset=org.apache.tools.ant.types.TarFileSet
+tokens=org.apache.tools.ant.types.resources.Tokens
 
 #Resources (single-element ResourceCollections):
 resource=org.apache.tools.ant.types.Resource
@@ -68,3 +69,8 @@
 gzipresource=org.apache.tools.ant.types.resources.GZipResource
 bzip2resource=org.apache.tools.ant.types.resources.BZip2Resource
 javaresource=org.apache.tools.ant.types.resources.JavaResource
+
+#tokenizer implementations
+linetokenizer=org.apache.tools.ant.util.LineTokenizer
+stringtokenizer=org.apache.tools.ant.util.StringTokenizer
+filetokenizer=org.apache.tools.ant.util.FileTokenizer

Added: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java?view=auto&rev=450611
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java 
(added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java 
Wed Sep 27 15:37:01 2006
@@ -0,0 +1,129 @@
+/*
+ *  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.types.resources;
+
+import java.io.InputStreamReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Stack;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.DataType;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.StringResource;
+import org.apache.tools.ant.util.ConcatResourceInputStream;
+import org.apache.tools.ant.util.LineTokenizer;
+import org.apache.tools.ant.util.Tokenizer;
+
+/**
+ * ResourceCollection consisting of StringResources gathered from tokenizing
+ * another ResourceCollection with a Tokenizer implementation.
+ * @since Ant 1.7
+ */
+public class Tokens extends BaseResourceCollectionWrapper {
+
+    private Tokenizer tokenizer;
+    private String encoding;
+
+    /**
+     * Sort the contained elements.
+     * @return a Collection of Resources.
+     */
+    protected synchronized Collection getCollection() {
+        ResourceCollection rc = getResourceCollection();
+        if (rc.size() == 0) {
+            return Collections.EMPTY_SET;
+        }
+        if (tokenizer == null) {
+            tokenizer = new LineTokenizer();
+        }
+        ConcatResourceInputStream cat = new ConcatResourceInputStream(rc);
+        cat.setManagingComponent(this);
+
+        InputStreamReader rdr = null;
+        if (encoding == null) {
+            rdr = new InputStreamReader(cat);
+        } else {
+            try {
+                rdr = new InputStreamReader(cat, encoding);
+            } catch (UnsupportedEncodingException e) {
+                throw new BuildException(e);
+            }
+        }
+        ArrayList result = new ArrayList();
+        try {
+            for (String s = tokenizer.getToken(rdr); s != null; s = 
tokenizer.getToken(rdr)) {
+                result.add(new StringResource(s));
+            }
+        } catch (IOException e) {
+            throw new BuildException("Error reading tokens", e);
+        }
+        return result;
+    }
+
+    /**
+     * Set the encoding used to create the tokens.
+     * @param encoding the encoding to use.
+     */
+    public synchronized void setEncoding(String encoding) {
+        this.encoding = encoding;
+    }
+
+    /**
+     * Add the nested Tokenizer to this Tokens ResourceCollection.
+     * A LineTokenizer will be used by default.
+     * @param tokenizer the tokenizer to add.
+     */
+    public synchronized void add(Tokenizer tokenizer) {
+        if (isReference()) {
+            throw noChildrenAllowed();
+        }
+        if (this.tokenizer != null) {
+            throw new BuildException("Only one nested tokenizer allowed.");
+        }
+        this.tokenizer = tokenizer;
+    }
+
+    /**
+     * Overrides the BaseResourceCollectionContainer version
+     * to check the nested Tokenizer.
+     * @param stk the stack of data types to use (recursively).
+     * @param p   the project to use to dereference the references.
+     * @throws BuildException on error.
+     */
+    protected synchronized void dieOnCircularReference(Stack stk, Project p)
+        throws BuildException {
+        if (isChecked()) {
+            return;
+        }
+        if (isReference()) {
+            super.dieOnCircularReference(stk, p);
+        } else {
+            if (tokenizer instanceof DataType) {
+                stk.push(tokenizer);
+                invokeCircularReferenceCheck((DataType) tokenizer, stk, p);
+            }
+            setChecked(true);
+        }
+    }
+
+}

Propchange: 
ant/core/trunk/src/main/org/apache/tools/ant/types/resources/Tokens.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml?view=auto&rev=450611
==============================================================================
--- ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml (added)
+++ ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml Wed Sep 27 
15:37:01 2006
@@ -0,0 +1,111 @@
+<project name="test-tokens" default="antunit"
+         xmlns:au="antlib:org.apache.ant.antunit">
+
+  <property name="eol" value="${line.separator}" />
+
+  <target name="antunit">
+    <au:antunit>
+      <au:plainlistener />
+      <file file="${ant.file}" />
+    </au:antunit>
+  </target>
+
+  <target name="testLines">
+    <au:assertTrue>
+      <resourcecount count="0">
+        <difference>
+          <tokens>
+            <string value="foo${eol}bar${eol}baz" />
+          </tokens>
+          <resources>
+            <string value="foo" />
+            <string value="bar" />
+            <string value="baz" />
+          </resources>
+        </difference>
+      </resourcecount>
+    </au:assertTrue>
+  </target>
+
+  <target name="testExplicitLines">
+    <au:assertTrue>
+      <resourcecount count="0">
+        <difference>
+          <tokens>
+            <string value="foo${eol}bar${eol}baz" />
+            <linetokenizer />
+          </tokens>
+          <resources>
+            <string value="foo" />
+            <string value="bar" />
+            <string value="baz" />
+          </resources>
+        </difference>
+      </resourcecount>
+    </au:assertTrue>
+  </target>
+
+  <target name="testFileTokenizer">
+    <au:assertTrue>
+      <resourcecount count="1">
+        <tokens>
+          <resources>
+            <string value="foo${eol}bar${eol}baz" />
+            <file file="${ant.file}" />
+          </resources>
+          <filetokenizer />
+        </tokens>
+      </resourcecount>
+    </au:assertTrue>
+  </target>
+
+  <target name="testStringTokenizer">
+    <au:assertTrue>
+      <resourcecount count="0">
+        <difference>
+          <tokens>
+            <string value="foo bar baz " />
+            <stringtokenizer />
+          </tokens>
+          <resources>
+            <string value="foo" />
+            <string value="bar" />
+            <string value="baz" />
+          </resources>
+        </difference>
+      </resourcecount>
+    </au:assertTrue>
+  </target>
+
+  <target name="testEncoding">
+    <au:assertTrue>
+      <resourcecount count="0">
+        <difference>
+          <tokens encoding="utf-16">
+            <file file="utf-16.in" />
+          </tokens>
+          <resources>
+            <string value="foo" />
+            <string value="bar" />
+            <string value="baz" />
+          </resources>
+        </difference>
+      </resourcecount>
+    </au:assertTrue>
+  </target>
+
+  <target name="testSort">
+    <pathconvert property="sorted" pathsep="${eol}">
+      <sort>
+        <tokens>
+          <string value="foo bar etc baz" />
+          <stringtokenizer />
+        </tokens>
+    </sort>
+    </pathconvert>
+    <au:assertTrue>
+      <equals arg1="bar${eol}baz${eol}etc${eol}foo" arg2="${sorted}" />
+    </au:assertTrue>
+  </target>
+
+</project>

Propchange: ant/core/trunk/src/tests/antunit/types/resources/tokens-test.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: ant/core/trunk/src/tests/antunit/types/resources/utf-16.in
URL: 
http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/types/resources/utf-16.in?view=auto&rev=450611
==============================================================================
Binary file - no diff available.

Propchange: ant/core/trunk/src/tests/antunit/types/resources/utf-16.in
------------------------------------------------------------------------------
    svn:executable = *

Propchange: ant/core/trunk/src/tests/antunit/types/resources/utf-16.in
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to