diff --git a/WHATSNEW b/WHATSNEW index 6622d420a..d29f3ccc4 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -21,6 +21,8 @@ Fixed bugs: * The ExpandProperties filter threw NPEs when defined using the format. +* If a task got redefined via , it lost its child elements. + Other changes: -------------- diff --git a/src/main/org/apache/tools/ant/RuntimeConfigurable.java b/src/main/org/apache/tools/ant/RuntimeConfigurable.java index a0a05ce14..20a2a062d 100644 --- a/src/main/org/apache/tools/ant/RuntimeConfigurable.java +++ b/src/main/org/apache/tools/ant/RuntimeConfigurable.java @@ -148,6 +148,15 @@ public class RuntimeConfigurable { return (RuntimeConfigurable) children.elementAt(index); } + /** + * Returns an enumeration of all child wrappers. + * + * @since Ant 1.6 + */ + Enumeration getChildren() { + return children.elements(); + } + /** * Adds characters from #PCDATA areas to the wrapped element. * diff --git a/src/main/org/apache/tools/ant/Task.java b/src/main/org/apache/tools/ant/Task.java index 2f2ea1121..16e131478 100644 --- a/src/main/org/apache/tools/ant/Task.java +++ b/src/main/org/apache/tools/ant/Task.java @@ -54,6 +54,8 @@ package org.apache.tools.ant; +import java.util.Enumeration; + /** * Base class for all tasks. * @@ -372,9 +374,31 @@ public abstract class Task extends ProjectComponent { replacement.setOwningTarget(target); replacement.setRuntimeConfigurableWrapper(wrapper); wrapper.setProxy(replacement); + replaceChildren(wrapper, replacement); target.replaceChild(this, replacement); replacement.maybeConfigure(); } return replacement; } + + /** + * Recursively adds an UnknownElement instances for each child + * element of replacement. + * + * @since Ant 1.6 + */ + private void replaceChildren(RuntimeConfigurable wrapper, + UnknownElement parentElement) { + Enumeration enum = wrapper.getChildren(); + while (enum.hasMoreElements()) { + RuntimeConfigurable childWrapper = + (RuntimeConfigurable) enum.nextElement(); + UnknownElement childElement = + new UnknownElement(childWrapper.getElementTag()); + parentElement.addChild(childElement); + childElement.setRuntimeConfigurableWrapper(childWrapper); + childWrapper.setProxy(childElement); + replaceChildren(childWrapper, childElement); + } + } }