diff --git a/build.xml b/build.xml index 037fd5310..4f13081b7 100644 --- a/build.xml +++ b/build.xml @@ -1339,6 +1339,13 @@ + + + + + + + diff --git a/src/etc/testcases/taskdefs/antlib.xml b/src/etc/testcases/taskdefs/antlib.xml index cc41acadb..c9ac9863e 100644 --- a/src/etc/testcases/taskdefs/antlib.xml +++ b/src/etc/testcases/taskdefs/antlib.xml @@ -14,6 +14,22 @@ + + + + + + + + + + + + + -and-then- + + + diff --git a/src/etc/testcases/taskdefs/test2.antlib.xml b/src/etc/testcases/taskdefs/test2.antlib.xml new file mode 100644 index 000000000..0e35817c6 --- /dev/null +++ b/src/etc/testcases/taskdefs/test2.antlib.xml @@ -0,0 +1,6 @@ + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Definer.java b/src/main/org/apache/tools/ant/taskdefs/Definer.java index ab16a160f..7ef02c422 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Definer.java +++ b/src/main/org/apache/tools/ant/taskdefs/Definer.java @@ -60,6 +60,7 @@ import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.Locale; +import java.util.NoSuchElementException; import java.util.Properties; import org.apache.tools.ant.AntTypeDefinition; @@ -217,26 +218,40 @@ public abstract class Definer extends DefBase { + "together with file or resource."; throw new BuildException(msg, getLocation()); } - URL url = null; + Enumeration/**/ urls = null; if (file != null) { - url = fileToURL(); - } - if (resource != null) { - url = resourceToURL(al); + final URL url = fileToURL(); + urls = new Enumeration() { + private boolean more = true; + public boolean hasMoreElements() { + return more; + } + public Object nextElement() throws NoSuchElementException { + if (more) { + more = false; + return url; + } else { + throw new NoSuchElementException(); + } + } + }; + } else { + urls = resourceToURLs(al); } - if (url == null) { - return; - } + while (urls.hasMoreElements()) { + URL url = (URL) urls.nextElement(); - if (url.toString().toLowerCase(Locale.US).endsWith(".xml")) { - format = Format.XML; - } + int format = this.format; + if (url.toString().toLowerCase(Locale.US).endsWith(".xml")) { + format = Format.XML; + } - if (format == Format.PROPERTIES) { - loadProperties(al, url); - } else { - loadAntlib(al, url); + if (format == Format.PROPERTIES) { + loadProperties(al, url); + } else { + loadAntlib(al, url); + } } } } @@ -259,9 +274,16 @@ public abstract class Definer extends DefBase { } } - private URL resourceToURL(ClassLoader classLoader) { - URL ret = classLoader.getResource(resource); - if (ret == null) { + private Enumeration/**/ resourceToURLs(ClassLoader classLoader) { + Enumeration ret; + try { + ret = classLoader.getResources(resource); + } catch (IOException e) { + throw new BuildException( + "Could not fetch resources named " + resource, + e, getLocation()); + } + if (!ret.hasMoreElements()) { if (onError != OnError.IGNORE) { log("Could not load definitions from resource " + resource + ". It could not be found.", diff --git a/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java b/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java index 0679ead52..51b4199bb 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/AntlibTest.java @@ -73,6 +73,15 @@ public class AntlibTest extends BuildFileTest { public void testAntlibFile() { expectLog("antlib.file", "MyTask called"); } + + /** + * Confirms that all matching resources will be used, so that you + * can collect several antlibs in one Definer call. + * @see "http://issues.apache.org/bugzilla/show_bug.cgi?id=24024" + */ + public void testAntlibResource() { + expectLog("antlib.resource", "MyTask called-and-then-MyTask2 called"); + } public void testNsCurrent() { expectLog("ns.current", "Echo2 inside a macroHello from x:p"); @@ -84,5 +93,11 @@ public class AntlibTest extends BuildFileTest { } } + public static class MyTask2 extends Task { + public void execute() { + log("MyTask2 called"); + } + } + }