From aa07dd46111d63136bca8100a984722f36e36d41 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Mon, 22 Jul 2002 12:28:57 +0000 Subject: [PATCH] Make task replacements recreate their child elements when they get redefined. PR: 10904 This should also fix the Axis build failure Sam has reported. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273144 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 2 ++ .../apache/tools/ant/RuntimeConfigurable.java | 9 +++++++ src/main/org/apache/tools/ant/Task.java | 24 +++++++++++++++++++ 3 files changed, 35 insertions(+) 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); + } + } }