git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@959019 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -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: | |||
| ----------- | |||
| @@ -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><property></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> | |||
| @@ -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 "user.home" 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 "Documents | |||
| and Settings" folder. Older windows variants such as Windows 98/ME are less | |||
| and Settings" or "Users" 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 \" 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> | |||
| @@ -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(); ) { | |||
| @@ -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); | |||
| } | |||
| @@ -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) { | |||
| @@ -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()); | |||
| } | |||
| } | |||
| @@ -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"/> | |||