Browse Source

reinstate prefix handling of property task at the expense of even more state in a thread-unfriendly class and with a new attribute on two tasks to make everybody happy. PR 49373.

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@959019 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 15 years ago
parent
commit
f67b8649e8
8 changed files with 127 additions and 28 deletions
  1. +8
    -0
      WHATSNEW
  2. +12
    -4
      docs/manual/Tasks/loadproperties.html
  3. +15
    -3
      docs/manual/Tasks/property.html
  4. +1
    -1
      src/main/org/apache/tools/ant/Main.java
  5. +54
    -16
      src/main/org/apache/tools/ant/property/ResolvePropertyMap.java
  6. +12
    -0
      src/main/org/apache/tools/ant/taskdefs/LoadProperties.java
  7. +22
    -1
      src/main/org/apache/tools/ant/taskdefs/Property.java
  8. +3
    -3
      src/tests/antunit/taskdefs/property-test.xml

+ 8
- 0
WHATSNEW View File

@@ -32,6 +32,14 @@ Changes that could break older environments:
onMissingExtensionPoint attribute.
Bugzilla Report 49473.

* When using <property file="..." prefix="..."/> properties defined
inside the same file will only get used in expansions if the ${}
reference uses the same prefix. This is different from Ant 1.8.1
but is the same behavior Ant 1.8.0 and earlier exhibited.
A new attribute prefixValues can be used to re-enable the behavior
of Ant 1.8.1.
Bugzilla Report 49373.

Fixed bugs:
-----------



+ 12
- 4
docs/manual/Tasks/loadproperties.html View File

@@ -33,10 +33,11 @@ Also if the file is missing, the build is halted with an error, rather
than a warning being printed.
</p>

<p>If you want to simulate <a href="property.html">property</a>'s
prefix attribute, please use <a
href="../Types/filterchain.html#prefixlines">prefixlines</a>
filter.</p>
<p><strong>Note:</strong> the default value of this
task's <code>prefixValues</code> attribute is different from the
default value of the same attribute in
the <a href="property.html"><code>&lt;property&gt;</code></a>
task.</p>

<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -78,6 +79,13 @@ filter.</p>
a "." is appended to the prefix if not specified. <em>Since Ant 1.8.1</em></td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">prefixValues</td>
<td valign="top">Whether to apply the prefix when expanding the
right hand side of the properties.
<em>Since Ant 1.8.2</em></td>
<td align="center" valign="top">No (default=<tt>true</tt>)</td>
</tr>
</table>

<h3>Parameters specified as nested elements</h3>


+ 15
- 3
docs/manual/Tasks/property.html View File

@@ -154,6 +154,14 @@ SYSTEM).
A "." is appended to the prefix if not specified.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">prefixValues</td>
<td valign="top">Whether to apply the prefix when expanding the
right hand side of properties loaded using <code>file</code>,
<code>resource</code>, or <code>url</code>.
<em>Since Ant 1.8.2</em></td>
<td align="center" valign="top">No (default=<tt>false</tt>)</td>
</tr>
<tr>
<td valign="top">relative</td>
<td valign="top">If set to <tt>true</tt> the relative path
@@ -198,7 +206,7 @@ to be your home directory. Where the &quot;user.home&quot; property resolves to
the file system depends on the operating system version and the JVM implementation.
On Unix based systems, this will map to the user's home directory. On modern Windows
variants, this will most likely resolve to the user's directory in the &quot;Documents
and Settings&quot; folder. Older windows variants such as Windows 98/ME are less
and Settings&quot; or &quot;Users&quot; folder. Older windows variants such as Windows 98/ME are less
predictable, as are other operating system/JVM combinations.</p>

<pre>
@@ -247,8 +255,12 @@ project, that team members can customize.
<a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/Properties.html#load(java.io.InputStream)">by Sun</a>.
This makes it hard for Team Ant to field bug reports about it.
<li>Trailing spaces are not stripped. It may have been what you wanted.
<li>Want unusual characters? Escape them \u0456 or \" style.
<li>Ant Properties are expanded in the file.
<li>Want unusual characters? Escape them \u0456 or \&quot; style.
<li>Ant Properties are expanded in the file
<li>If you want to expand properties defined inside the same file and
you use the prefix attribute of the task, you must use the same
prefix when expanding the properties or
set <code>prefixValues</code> to true.</li>
</ol>
In-file property expansion is very cool. Learn to use it.
<p>


+ 1
- 1
src/main/org/apache/tools/ant/Main.java View File

@@ -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(); ) {


+ 54
- 16
src/main/org/apache/tools/ant/property/ResolvePropertyMap.java View File

@@ -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);
}


+ 12
- 0
src/main/org/apache/tools/ant/taskdefs/LoadProperties.java View File

@@ -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) {


+ 22
- 1
src/main/org/apache/tools/ant/taskdefs/Property.java View File

@@ -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());
}

}

+ 3
- 3
src/tests/antunit/taskdefs/property-test.xml View File

@@ -93,7 +93,7 @@ y=$${x}
]]></echo>
<property file="${input}/y.properties" prefix="foo"/>
<!-- passes in Ant 1.8.0 and 1.7.1, fails in 1.8.1 -->
<!--au:assertPropertyEquals name="foo.y" value="x"/-->
<au:assertPropertyEquals name="foo.y" value="x"/>
<echo file="${input}/z.properties"><![CDATA[
x=y
y=$${bar.x}
@@ -121,8 +121,8 @@ x=3
<au:assertPropertyEquals name="foo.x" value="3"/>
</target>

<!-- passes in Ant 1.7.1 and 1.8.0, fails in 1.8.1 -->
<target name="NOtestNestedExpansionDoesntUsePrefix"
<!-- passes in Ant 1.7.1 and 1.8.0, fails in 1.8.1 -->
<target name="testNestedExpansionDoesntUsePrefix"
description="https://issues.apache.org/bugzilla/show_bug.cgi?id=49373">
<mkdir dir="${input}"/>
<property name="x" value="x"/>


Loading…
Cancel
Save