Author: bodewig Date: Wed Apr 21 08:30:59 2010 New Revision: 936200 URL: http://svn.apache.org/viewvc?rev=936200&view=rev Log: Add enableMultipleMappings and cache attributes to mappedresources
Modified: ant/core/trunk/WHATSNEW ant/core/trunk/docs/manual/CoreTypes/resources.html ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResource.java ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml Modified: ant/core/trunk/WHATSNEW URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=936200&r1=936199&r2=936200&view=diff ============================================================================== --- ant/core/trunk/WHATSNEW (original) +++ ant/core/trunk/WHATSNEW Wed Apr 21 08:30:59 2010 @@ -138,6 +138,9 @@ Other changes: * Added SimpleBigProjectLogger, intermediate between NoBannerLogger and BigProjectLogger. + * <mappedresources> supports new attributes enablemultiplemappings + and cache. + Changes from Ant 1.8.0RC1 TO Ant 1.8.0 ====================================== Modified: ant/core/trunk/docs/manual/CoreTypes/resources.html URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/CoreTypes/resources.html?rev=936200&r1=936199&r2=936200&view=diff ============================================================================== --- ant/core/trunk/docs/manual/CoreTypes/resources.html (original) +++ ant/core/trunk/docs/manual/CoreTypes/resources.html Wed Apr 21 08:30:59 2010 @@ -1081,9 +1081,32 @@ larger collection. <strong>Since Ant 1.7 use <em>mappedresources</em> with tasks that only allow file-system based resources.</p> -<p><em>mappedresources</em> doesn't support any attributes.</p> - <blockquote> + <h4>Parameters specified as attributes</h4> + + <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">cache</td> + <td valign="top">Whether to cache results; enabling + may improve performance. <em>Since Ant 1.8.1</em></td> + <td valign="top" align="center">No, default <i>false</i></td> + </tr> + <tr> + <td valign="top">enablemultiplemappings</td> + <td valign="top"> + If true the the collection will use all the mappings for a + given source path. If false the it will only process the first + resource. + <em>since Ant 1.8.1</em>.</td> + <td align="center">No - defaults to false.</td> + </tr> + </table> + <h4>Parameters specified as nested elements</h4> <p>A single resource collection is required.</p> <p>A single <a href="mapper.html">mapper</a> can be used to map Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResource.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResource.java?rev=936200&r1=936199&r2=936200&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResource.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResource.java Wed Apr 21 08:30:59 2010 @@ -75,4 +75,28 @@ public class MappedResource extends Reso ? null : getResource().as(clazz); } + /** + * Get the hash code for this Resource. + * @since Ant 1.8.1 + */ + public int hashCode() { + String n = getName(); + return n == null ? super.hashCode() : n.hashCode(); + } + + /** + * Equality check based on the resource's name in addition to the + * resource itself. + * @since Ant 1.8.1 + */ + public boolean equals(Object other) { + if (other == null || !other.getClass().equals(getClass())) { + return false; + } + MappedResource m = (MappedResource) other; + String myName = getName(); + String otherName = m.getName(); + return (myName == null ? otherName == null : myName.equals(otherName)) + && getResource().equals(m.getResource()); + } } Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java?rev=936200&r1=936199&r2=936200&view=diff ============================================================================== --- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java (original) +++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/MappedResourceCollection.java Wed Apr 21 08:30:59 2010 @@ -17,6 +17,8 @@ */ package org.apache.tools.ant.types.resources; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.Stack; import org.apache.tools.ant.BuildException; @@ -28,6 +30,7 @@ import org.apache.tools.ant.types.Resour import org.apache.tools.ant.types.ResourceCollection; import org.apache.tools.ant.util.FileNameMapper; import org.apache.tools.ant.util.IdentityMapper; +import org.apache.tools.ant.util.MergingMapper; /** * Wrapper around a resource collections that maps the names of the @@ -39,6 +42,9 @@ public class MappedResourceCollection private ResourceCollection nested = null; private Mapper mapper = null; + private boolean enableMultipleMappings = false; + private boolean cache = false; + private Collection cachedColl = null; /** * Adds the required nested ResourceCollection. @@ -55,6 +61,7 @@ public class MappedResourceCollection getLocation()); } setChecked(false); + cachedColl = null; nested = c; } @@ -73,6 +80,7 @@ public class MappedResourceCollection } setChecked(false); mapper = new Mapper(getProject()); + cachedColl = null; return mapper; } @@ -86,6 +94,29 @@ public class MappedResourceCollection } /** + * Set method of handling mappers that return multiple + * mappings for a given source path. + * @param enableMultipleMappings If true the type will + * use all the mappings for a given source path, if + * false, only the first mapped name is + * processed. + * By default, this setting is false to provide backward + * compatibility with earlier releases. + * @since Ant 1.8.1 + */ + public void setEnableMultipleMappings(boolean enableMultipleMappings) { + this.enableMultipleMappings = enableMultipleMappings; + } + + /** + * Set whether to cache collections. + * @since Ant 1.8.1 + */ + public void setCache(boolean cache) { + this.cache = cache; + } + + /** * {...@inheritdoc} */ public boolean isFilesystemOnly() { @@ -105,7 +136,7 @@ public class MappedResourceCollection return ((MappedResourceCollection) getCheckedRef()).size(); } checkInitialized(); - return nested.size(); + return cacheCollection().size(); } /** @@ -116,7 +147,7 @@ public class MappedResourceCollection return ((MappedResourceCollection) getCheckedRef()).iterator(); } checkInitialized(); - return new MappedIterator(nested.iterator(), mapper); + return cacheCollection().iterator(); } /** @@ -140,6 +171,7 @@ public class MappedResourceCollection (MappedResourceCollection) super.clone(); c.nested = nested; c.mapper = mapper; + c.cachedColl = null; return c; } catch (CloneNotSupportedException e) { throw new BuildException(e); @@ -180,30 +212,32 @@ public class MappedResourceCollection dieOnCircularReference(); } - private static class MappedIterator implements Iterator { - private final Iterator sourceIterator; - private final FileNameMapper mapper; - - private MappedIterator(Iterator source, Mapper m) { - sourceIterator = source; - if (m != null) { - mapper = m.getImplementation(); + private synchronized Collection cacheCollection() { + if (cachedColl == null || !cache) { + cachedColl = getCollection(); + } + return cachedColl; + } + + private Collection getCollection() { + Collection collected = new ArrayList(); + FileNameMapper m = + mapper != null ? mapper.getImplementation() : new IdentityMapper(); + for (Iterator iter = nested.iterator(); iter.hasNext(); ) { + Resource r = (Resource) iter.next(); + if (enableMultipleMappings) { + String[] n = m.mapFileName(r.getName()); + if (n != null) { + for (int i = 0; i < n.length; i++) { + collected.add(new MappedResource(r, + new MergingMapper(n[i])) + ); + } + } } else { - mapper = new IdentityMapper(); + collected.add(new MappedResource(r, m)); } } - - public boolean hasNext() { - return sourceIterator.hasNext(); - } - - public Object next() { - return new MappedResource((Resource) sourceIterator.next(), - mapper); - } - - public void remove() { - throw new UnsupportedOperationException(); - } + return collected; } } Modified: ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml?rev=936200&r1=936199&r2=936200&view=diff ============================================================================== --- ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml (original) +++ ant/core/trunk/src/tests/antunit/taskdefs/copy-test.xml Wed Apr 21 08:30:59 2010 @@ -116,6 +116,48 @@ public class NullByteStreamResource exte actual="${output}/bar.txt"/> </target> + <target name="testMappedResourcesMultipleTrue"> + <mkdir dir="${input}"/> + <mkdir dir="${output}"/> + <echo file="${input}/foo.txt">Hello, world!</echo> + <copy todir="${output}"> + <mappedresources enableMultipleMappings="true"> + <fileset dir="${input}"/> + <compositemapper> + <globmapper from="foo.*" to="bar.*"/> + <globmapper from="foo.*" to="baz.*"/> + </compositemapper> + </mappedresources> + </copy> + <au:assertFileDoesntExist file="${output}/foo.txt"/> + <au:assertFileExists file="${output}/bar.txt"/> + <au:assertFileExists file="${output}/baz.txt"/> + <au:assertFilesMatch expected="${input}/foo.txt" + actual="${output}/bar.txt"/> + <au:assertFilesMatch expected="${input}/foo.txt" + actual="${output}/baz.txt"/> + </target> + + <target name="testMappedResourcesMultipleFalse"> + <mkdir dir="${input}"/> + <mkdir dir="${output}"/> + <echo file="${input}/foo.txt">Hello, world!</echo> + <copy todir="${output}"> + <mappedresources enableMultipleMappings="false"> + <fileset dir="${input}"/> + <compositemapper> + <globmapper from="foo.*" to="bar.*"/> + <globmapper from="foo.*" to="baz.*"/> + </compositemapper> + </mappedresources> + </copy> + <au:assertFileDoesntExist file="${output}/foo.txt"/> + <au:assertFileExists file="${output}/bar.txt"/> + <au:assertFileDoesntExist file="${output}/baz.txt"/> + <au:assertFilesMatch expected="${input}/foo.txt" + actual="${output}/bar.txt"/> + </target> + <target name="testIncludeEmptyDirsDefaultsToTrue" description="https://issues.apache.org/bugzilla/show_bug.cgi?id=47168"> <mkdir dir="${input}/foo"/>