diff --git a/src/etc/testcases/taskdefs/property.xml b/src/etc/testcases/taskdefs/property.xml index 75fbe6940..00bfbcdda 100644 --- a/src/etc/testcases/taskdefs/property.xml +++ b/src/etc/testcases/taskdefs/property.xml @@ -36,4 +36,9 @@ + + + + + diff --git a/src/etc/testcases/taskdefs/property4.properties b/src/etc/testcases/taskdefs/property4.properties new file mode 100644 index 000000000..d2af886e5 --- /dev/null +++ b/src/etc/testcases/taskdefs/property4.properties @@ -0,0 +1,2 @@ +a=${a} +b=${a}/b diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java index 2fe2c36aa..ae998571c 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Property.java +++ b/src/main/org/apache/tools/ant/taskdefs/Property.java @@ -573,6 +573,8 @@ public class Property extends Task { String value = props.getProperty(name); boolean resolved = false; + Vector expandedReferences = new Vector(); + expandedReferences.addElement(name); while (!resolved) { Vector fragments = new Vector(); Vector propertyRefs = new Vector(); @@ -588,11 +590,12 @@ public class Property extends Task { String fragment = (String) i.nextElement(); if (fragment == null) { String propertyName = (String) j.nextElement(); - if (propertyName.equals(name)) { + if (expandedReferences.contains(propertyName)) { throw new BuildException("Property " + name + " was circularly " + "defined."); } + expandedReferences.addElement(propertyName); fragment = getProject().getProperty(propertyName); if (fragment == null) { if (props.containsKey(propertyName)) { diff --git a/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java b/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java index 0fe9ea09c..2ba10b657 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java @@ -116,4 +116,16 @@ public class PropertyTest extends BuildFileTest { fail("Did not throw exception on invalid use of prefix"); } + public void testCircularReference() { + try { + executeTarget("testCircularReference"); + } catch (BuildException e) { + assertEquals("Circular definition not detected - ", true, + e.getMessage().indexOf("was circularly defined") + != -1); + return; + } + fail("Did not throw exception on circular exception"); + } + }