From f67b8649e8b40f489ea4091276cfffb010beae99 Mon Sep 17 00:00:00 2001
From: Stefan Bodewig
If you want to simulate property's -prefix attribute, please use prefixlines -filter.
+Note: the default value of this
+task's prefixValues
attribute is different from the
+default value of the same attribute in
+the <property>
+task.
No | +||
prefixValues | +Whether to apply the prefix when expanding the + right hand side of the properties. + Since Ant 1.8.2 | +No (default=true) | +
file
,
+ resource
, or url
.
+ Since Ant 1.8.2@@ -247,8 +255,12 @@ project, that team members can customize. by Sun. This makes it hard for Team Ant to field bug reports about it.
prefixValues
to true.
diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java
index 9ffb2629e..ec50d96e6 100644
--- a/src/main/org/apache/tools/ant/Main.java
+++ b/src/main/org/apache/tools/ant/Main.java
@@ -769,7 +769,7 @@ public class Main implements AntMain {
HashMap props = new HashMap(definedProps);
new ResolvePropertyMap(project, propertyHelper,
propertyHelper.getExpanders())
- .resolveAllProperties(props, null);
+ .resolveAllProperties(props, null, false);
// set user-define properties
for (Iterator e = props.entrySet().iterator(); e.hasNext(); ) {
diff --git a/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java b/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java
index ea0caf6e9..c9fdecbc8 100644
--- a/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java
+++ b/src/main/org/apache/tools/ant/property/ResolvePropertyMap.java
@@ -36,6 +36,12 @@ public class ResolvePropertyMap implements GetProperty {
private final GetProperty master;
private Map map;
private String prefix;
+ // whether properties of the value side of the map should be
+ // expanded
+ private boolean prefixValues = false;
+ // whether the current getProperty call is expanding the key side
+ // of the map
+ private boolean expandingLHS = true;
/**
* Constructor with a master getproperty and a collection of expanders.
@@ -59,19 +65,20 @@ public class ResolvePropertyMap implements GetProperty {
"Property " + name + " was circularly " + "defined.");
}
- // if the property has already been set to the name it will
- // have in the end, then return the existing value to ensure
- // properties remain immutable
- String masterPropertyName = name;
- if (prefix != null) {
- masterPropertyName = prefix + name;
- }
- Object masterProperty = master.getProperty(masterPropertyName);
- if (masterProperty != null) {
- return masterProperty;
- }
-
try {
+ String fullKey = name;
+ if (prefix != null && prefixValues) {
+ fullKey = prefix + name;
+ }
+ Object masterValue = expandingLHS
+ ? null : master.getProperty(fullKey);
+ // if the property is defined outside of this map don't
+ // consult the map at all.
+ if (masterValue != null) {
+ return masterValue;
+ }
+
+ expandingLHS = false;
seen.add(name);
return parseProperties.parseProperties((String) map.get(name));
} finally {
@@ -82,10 +89,10 @@ public class ResolvePropertyMap implements GetProperty {
/**
* The action method - resolves all the properties in a map.
* @param map the map to resolve properties in.
- * @deprecated since Ant 1.8.1, use the two-arg method instead.
+ * @deprecated since Ant 1.8.2, use the three-arg method instead.
*/
public void resolveAllProperties(Map map) {
- resolveAllProperties(map, null);
+ resolveAllProperties(map, null, false);
}
/**
@@ -93,13 +100,44 @@ public class ResolvePropertyMap implements GetProperty {
* @param map the map to resolve properties in.
* @param prefix the prefix the properties defined inside the map
* will finally receive - may be null.
+ * @deprecated since Ant 1.8.2, use the three-arg method instead.
*/
public void resolveAllProperties(Map map, String prefix) {
- this.map = map; // The map gets used in the getProperty callback
+ resolveAllProperties(map, null, false);
+ }
+
+ /**
+ * The action method - resolves all the properties in a map.
+ * @param map the map to resolve properties in.
+ * @param prefix the prefix the properties defined inside the map
+ * will finally receive - may be null.
+ * @param prefixValues - whether the prefix will be applied
+ * to properties on the value side of the map as well.
+ */
+ public void resolveAllProperties(Map map, String prefix,
+ boolean prefixValues) {
+ // The map, prefix and prefixValues flag get used in the
+ // getProperty callback
+ this.map = map;
this.prefix = prefix;
+ this.prefixValues = prefixValues;
+
for (Iterator i = map.keySet().iterator(); i.hasNext();) {
+ expandingLHS = true;
String key = (String) i.next();
- Object result = getProperty(key);
+
+ // if the property has already been set to the name it
+ // will have in the end, then return the existing value to
+ // ensure properties remain immutable
+ String fullKey = key;
+ if (prefix != null) {
+ fullKey = prefix + key;
+ }
+ Object result = master.getProperty(fullKey);
+
+ if (result == null) {
+ result = getProperty(key);
+ }
String value = result == null ? "" : result.toString();
map.put(key, value);
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java b/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java
index 044cc0f87..65092c71f 100644
--- a/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java
+++ b/src/main/org/apache/tools/ant/taskdefs/LoadProperties.java
@@ -66,6 +66,7 @@ public class LoadProperties extends Task {
* Prefix for loaded properties.
*/
private String prefix = null;
+ private boolean prefixValues = true;
/**
* Set the file to load.
@@ -141,6 +142,16 @@ public class LoadProperties extends Task {
this.prefix = prefix;
}
+ /**
+ * Whether to apply the prefix when expanding properties on the
+ * right hand side of a properties file as well.
+ *
+ * @since Ant 1.8.2
+ */
+ public void setPrefixValues(boolean b) {
+ prefixValues = b;
+ }
+
/**
* load Ant properties from the source file or resource
*
@@ -189,6 +200,7 @@ public class LoadProperties extends Task {
Property propertyTask = new Property();
propertyTask.bindToOwner(this);
propertyTask.setPrefix(prefix);
+ propertyTask.setPrefixValues(prefixValues);
propertyTask.addProperties(props);
}
} catch (final IOException ioe) {
diff --git a/src/main/org/apache/tools/ant/taskdefs/Property.java b/src/main/org/apache/tools/ant/taskdefs/Property.java
index b0363781b..67dada022 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Property.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Property.java
@@ -94,6 +94,7 @@ public class Property extends Task {
private boolean valueAttributeUsed = false;
private boolean relative = false;
private File basedir;
+ private boolean prefixValues = false;
protected boolean userProperty; // set read-only properties
// CheckStyle:VisibilityModifier ON
@@ -293,6 +294,26 @@ public class Property extends Task {
return prefix;
}
+ /**
+ * Whether to apply the prefix when expanding properties on the
+ * right hand side of a properties file as well.
+ *
+ * @since Ant 1.8.2
+ */
+ public void setPrefixValues(boolean b) {
+ prefixValues = b;
+ }
+
+ /**
+ * Whether to apply the prefix when expanding properties on the
+ * right hand side of a properties file as well.
+ *
+ * @since Ant 1.8.2
+ */
+ public boolean getPrefixValues() {
+ return prefixValues;
+ }
+
/**
* Sets a reference to an Ant datatype
* declared elsewhere.
@@ -716,7 +737,7 @@ public class Property extends Task {
getProject(),
propertyHelper,
propertyHelper.getExpanders())
- .resolveAllProperties(props, prefix);
+ .resolveAllProperties(props, getPrefix(), getPrefixValues());
}
}
diff --git a/src/tests/antunit/taskdefs/property-test.xml b/src/tests/antunit/taskdefs/property-test.xml
index e23a9f1af..1697e7776 100644
--- a/src/tests/antunit/taskdefs/property-test.xml
+++ b/src/tests/antunit/taskdefs/property-test.xml
@@ -93,7 +93,7 @@ y=$${x}
]]>