diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java index fdfa451d7..2e274d0a3 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Property.java +++ b/src/main/org/apache/tools/ant/taskdefs/Property.java @@ -184,43 +184,46 @@ public class Property extends Task { } private void resolveAllProperties(Hashtable props) { - Hashtable toResolve = new Hashtable(); - Enumeration e = props.keys(); - boolean more = true; - - while (more) { - while (e.hasMoreElements()) { - Vector propsInValue = new Vector(); - String name = (String) e.nextElement(); - String value = (String) props.get(name); + Hashtable unresolvableProperties = new Hashtable(); + for (Enumeration e = props.keys(); e.hasMoreElements(); ) { + String name = (String) e.nextElement(); + String value = (String) props.get(name); + boolean resolved = false; + while (!resolved) { + Vector propsInValue = new Vector(); + + // assume it will be resolved + resolved = true; + boolean unresolvable = false; if (extractProperties(value, propsInValue)) { for (int i=0; i < propsInValue.size(); i++) { String elem = (String) propsInValue.elementAt(i); + if (elem.equals(name) || unresolvableProperties.containsKey(elem)) { + // we won't try further resolving elements with circular + // property dependencies or dependencies on unresolvable elements + unresolvable = true; + break; + } + if (project.getProperties().containsKey(elem) || props.containsKey(elem)) { - toResolve.put(name, value); - break; + resolved = false; } } } - - if (toResolve.size() > 0) { - Enumeration tre = toResolve.keys(); - while (tre.hasMoreElements()) { - String name2 = (String) tre.nextElement(); - String value2 = (String) toResolve.get(name2); - String v = ProjectHelper.replaceProperties(value2, - project.getProperties()); - v = ProjectHelper.replaceProperties(v, props); - props.put(name, v); - } - - toResolve.clear(); - e = props.keys(); - } else { - more = false; + + if (unresolvable) { + unresolvableProperties.put(name, value); + resolved = true; } + + if (!resolved) { + value = ProjectHelper.replaceProperties(value, + project.getProperties()); + value = ProjectHelper.replaceProperties(value, props); + props.put(name, value); + } } } }