diff --git a/src/main/org/apache/tools/ant/taskdefs/PropertyHelperTask.java b/src/main/org/apache/tools/ant/taskdefs/PropertyHelperTask.java index adfe7bb02..138fe9928 100644 --- a/src/main/org/apache/tools/ant/taskdefs/PropertyHelperTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/PropertyHelperTask.java @@ -35,6 +35,39 @@ import org.apache.tools.ant.Task; * @since Ant 1.8 */ public class PropertyHelperTask extends Task { + /** + * Nested delegate for refid usage. + */ + public class DelegateElement { + private String refid; + + private DelegateElement() { + } + + /** + * Get the refid. + * @return String + */ + public String getRefid() { + return refid; + } + + /** + * Set the refid. + * @param refid the String to set + */ + public void setRefid(String refid) { + this.refid = refid; + } + + private PropertyHelper.Delegate resolve() { + if (refid == null) { + throw new BuildException("refid required for generic delegate"); + } + return (PropertyHelper.Delegate) getProject().getReference(refid); + } + } + private PropertyHelper propertyHelper; private List delegates; @@ -65,10 +98,17 @@ public class PropertyHelperTask extends Task { * @param delegate the delegate to add. */ public synchronized void addConfigured(PropertyHelper.Delegate delegate) { - if (delegates == null) { - delegates = new ArrayList(); - } - delegates.add(delegate); + getAddDelegateList().add(delegate); + } + + /** + * Add a nested <delegate refid="foo" /> element. + * @return DelegateElement + */ + public DelegateElement createDelegate() { + DelegateElement result = new DelegateElement(); + getAddDelegateList().add(result); + return result; } /** @@ -89,7 +129,9 @@ public class PropertyHelperTask extends Task { synchronized (ph) { if (delegates != null) { for (Iterator iter = delegates.iterator(); iter.hasNext();) { - PropertyHelper.Delegate delegate = (PropertyHelper.Delegate) iter.next(); + Object o = iter.next(); + PropertyHelper.Delegate delegate = o instanceof DelegateElement + ? ((DelegateElement) o).resolve() : (PropertyHelper.Delegate) o; log("Adding PropertyHelper delegate " + delegate, Project.MSG_DEBUG); ph.add(delegate); } @@ -97,9 +139,15 @@ public class PropertyHelperTask extends Task { } if (propertyHelper != null) { log("Installing PropertyHelper " + propertyHelper, Project.MSG_DEBUG); - //TODO copy existing properties to new PH? + // TODO copy existing properties to new PH? getProject().addReference(MagicNames.REFID_PROPERTY_HELPER, propertyHelper); } } + private synchronized List getAddDelegateList() { + if (delegates == null) { + delegates = new ArrayList(); + } + return delegates; + } } diff --git a/src/tests/antunit/taskdefs/propertyhelper-test.xml b/src/tests/antunit/taskdefs/propertyhelper-test.xml new file mode 100644 index 000000000..67801b3b8 --- /dev/null +++ b/src/tests/antunit/taskdefs/propertyhelper-test.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + +