bodewig 2003/07/24 01:09:34
Modified: src/main/org/apache/tools/ant/taskdefs Property.java
Log:
Resolve properties recursively to get a more robust handle on circular
definitions
Revision Changes Path
1.66 +47 -37 ant/src/main/org/apache/tools/ant/taskdefs/Property.java
Index: Property.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Property.java,v
retrieving revision 1.65
retrieving revision 1.66
diff -u -r1.65 -r1.66
--- Property.java 23 Jul 2003 15:14:19 -0000 1.65
+++ Property.java 24 Jul 2003 08:09:34 -0000 1.66
@@ -61,6 +61,7 @@
import java.net.URL;
import java.util.Enumeration;
import java.util.Properties;
+import java.util.Stack;
import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -570,48 +571,57 @@
private void resolveAllProperties(Properties props) throws
BuildException {
for (Enumeration e = props.keys(); e.hasMoreElements();) {
String name = (String) e.nextElement();
- String value = props.getProperty(name);
+ Stack referencesSeen = new Stack();
+ resolve(props, name, referencesSeen);
+ }
+ }
- boolean resolved = false;
- Vector expandedReferences = new Vector();
- expandedReferences.addElement(name);
- while (!resolved) {
- Vector fragments = new Vector();
- Vector propertyRefs = new Vector();
- ProjectHelper.parsePropertyString(value, fragments,
- propertyRefs);
-
- resolved = true;
- if (propertyRefs.size() != 0) {
- StringBuffer sb = new StringBuffer();
- Enumeration i = fragments.elements();
- Enumeration j = propertyRefs.elements();
- while (i.hasMoreElements()) {
- String fragment = (String) i.nextElement();
- if (fragment == null) {
- String propertyName = (String) j.nextElement();
- 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)) {
- fragment =
props.getProperty(propertyName);
- resolved = false;
- } else {
- fragment = "${" + propertyName + "}";
- }
- }
+ /**
+ * Recursively expand the named property using the project's
+ * reference table and the given set of properties - fail if a
+ * circular definition is detected.
+ *
+ * @param props properties object to resolve
+ * @param name of the property to resolve
+ * @param referencesSeen stack of all property names that have
+ * been tried to expand before coming here.
+ */
+ private void resolve(Properties props, String name, Stack referencesSeen)
+ throws BuildException {
+ if (referencesSeen.contains(name)) {
+ throw new BuildException("Property " + name + " was circularly "
+ + "defined.");
+ }
+
+ String value = props.getProperty(name);
+ Vector fragments = new Vector();
+ Vector propertyRefs = new Vector();
+ ProjectHelper.parsePropertyString(value, fragments, propertyRefs);
+
+ if (propertyRefs.size() != 0) {
+ referencesSeen.push(name);
+ StringBuffer sb = new StringBuffer();
+ Enumeration i = fragments.elements();
+ Enumeration j = propertyRefs.elements();
+ while (i.hasMoreElements()) {
+ String fragment = (String) i.nextElement();
+ if (fragment == null) {
+ String propertyName = (String) j.nextElement();
+ fragment = getProject().getProperty(propertyName);
+ if (fragment == null) {
+ if (props.containsKey(propertyName)) {
+ resolve(props, propertyName, referencesSeen);
+ fragment = props.getProperty(propertyName);
+ } else {
+ fragment = "${" + propertyName + "}";
}
- sb.append(fragment);
}
- value = sb.toString();
- props.put(name, value);
}
+ sb.append(fragment);
}
+ value = sb.toString();
+ props.put(name, value);
+ referencesSeen.pop();
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]