git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@806154 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -857,6 +857,8 @@ Other changes: | |||
| * It is now possible to suppress the "FAILED" lines sent to Ant's | |||
| logging system via <junit>'s new logFailedTests attribute. | |||
| Bugzilla Report 35073. | |||
| * <propertyfile> now can delete entries. | |||
| Changes from Ant 1.7.0 TO Ant 1.7.1 | |||
| ============================================= | |||
| @@ -24,26 +24,12 @@ | |||
| <body> | |||
| <h1>PropertyFile</h1> | |||
| <p>by</p> | |||
| <!-- Names are in alphabetical order, on last name --> | |||
| <ul> | |||
| <li>Thomas Christen (<a href="mailto:chr@active.ch">chr@active.ch</a>)</li> | |||
| <li>Jeremy Mawson (<a href="mailto:jem@loftinspace.com.au">jem@loftinspace.com/au</a>)</li> | |||
| </ul> | |||
| <hr> | |||
| <h2>Table of Contents</h2> | |||
| <ul> | |||
| <li><a href="#introduction">Introduction</a></li> | |||
| <li><a href="#proptask">PropertyFile Task</a></li> | |||
| <li><a href="#entryElement">Entry Task</a></li> | |||
| </ul> | |||
| <hr> | |||
| <h2><a name="introduction">Introduction</a></h2> | |||
| <p>Ant provides an optional task for editing property files. This is very useful | |||
| <p>Ant provides an optional task for editing property files. This is very useful | |||
| when wanting to make unattended modifications to configuration files for application | |||
| servers and applications. Currently, the task maintains a working property file with | |||
| servers and applications. Currently, the task maintains a working property file with | |||
| the ability to add properties or make changes to existing ones. Comments and layout | |||
| of the original properties file are preserved.</p> | |||
| @@ -93,7 +79,7 @@ elements to specify actual modifications to the property file itself.</p> | |||
| <tr> | |||
| <td valign="top">value</td> | |||
| <td valign="top">Value to set (=), to add (+) or subtract (-)</td> | |||
| <td valign="top" align="center" rowspan="2">At least one must be specified</td> | |||
| <td valign="top" align="center" rowspan="2">At least one must be specified, if <i>operation</i> is not <i>delete</i></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">default</td> | |||
| @@ -108,7 +94,14 @@ elements to specify actual modifications to the property file itself.</p> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">operation</td> | |||
| <td valign="top">"+" or "=" (default) for all datatypes<br>"-" (for date and int only).<br> | |||
| <td valign="top">One of the following operations:<br><br> | |||
| <b>for all datatypes:</b><ul> | |||
| <li>"del" : deletes an entry</li> | |||
| <li>"+" : adds a value to the existing value</li> | |||
| <li>"=" : sets a value instead of the existing value (default)</li> | |||
| </ul><br><b>for date and int only:</b><ul> | |||
| <li>"-" : subtracts a value from the existing value</li> | |||
| </ul> | |||
| </td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| @@ -38,7 +38,15 @@ | |||
| <entry key="age" default="${age}" type="int"/> | |||
| <entry key="date" default="${date}" type="date"/> | |||
| </propertyfile> | |||
| </target> | |||
| <target name="delete-properties"> | |||
| <echoproperties/> | |||
| <propertyfile | |||
| file="${test.propertyfile}" | |||
| comment="unit test for the property file task..." > | |||
| <entry key="firstname" operation="del" /> | |||
| </propertyfile> | |||
| </target> | |||
| <target name="exercise"> | |||
| @@ -85,15 +93,19 @@ | |||
| </propertyfile> | |||
| <property file="${test.propertyfile}"/> | |||
| </target> | |||
| <target name="createfile"> | |||
| <echo file="${overwrite.test.propertyfile}"> | |||
| foo=3 | |||
| </echo> | |||
| </target> | |||
| <target name="bugDemo1" depends="createfile,bugDemoInit"/> | |||
| <target name="bugDemo2" depends="bugDemoInit"> | |||
| <property file="${overwrite.test.propertyfile}"/> | |||
| </target> | |||
| <target name="bugDemoInit"> | |||
| <propertyfile file="${overwrite.test.propertyfile}"> | |||
| <entry key="foo" default="0" value="1" operation="+" type="int"/> | |||
| @@ -347,6 +347,11 @@ public class PropertyFile extends Task { | |||
| */ | |||
| protected void executeOn(Properties props) throws BuildException { | |||
| checkParameters(); | |||
| if (operation == Operation.DELETE_OPER) { | |||
| props.remove(key); | |||
| return; | |||
| } | |||
| // type may be null because it wasn't set | |||
| String oldValue = (String) props.get(key); | |||
| @@ -508,7 +513,7 @@ public class PropertyFile extends Task { | |||
| throw new BuildException("- is not supported for string " | |||
| + "properties (key:" + key + ")"); | |||
| } | |||
| if (value == null && defaultValue == null) { | |||
| if (value == null && defaultValue == null && operation != Operation.DELETE_OPER) { | |||
| throw new BuildException("\"value\" and/or \"default\" " | |||
| + "attribute must be specified (key:" + key + ")"); | |||
| } | |||
| @@ -574,10 +579,12 @@ public class PropertyFile extends Task { | |||
| public static final int DECREMENT_OPER = 1; | |||
| /** = */ | |||
| public static final int EQUALS_OPER = 2; | |||
| /** del */ | |||
| public static final int DELETE_OPER = 3; | |||
| /** {@inheritDoc}. */ | |||
| public String[] getValues() { | |||
| return new String[] {"+", "-", "="}; | |||
| return new String[] {"+", "-", "=", "del"}; | |||
| } | |||
| /** | |||
| @@ -590,6 +597,8 @@ public class PropertyFile extends Task { | |||
| return INCREMENT_OPER; | |||
| } else if ("-".equals(oper)) { | |||
| return DECREMENT_OPER; | |||
| } else if ("del".equals(oper)) { | |||
| return DELETE_OPER; | |||
| } | |||
| return EQUALS_OPER; | |||
| } | |||
| @@ -93,6 +93,22 @@ public class PropertyFileTest extends BuildFileTest { | |||
| assertEquals(NEW_AGE, afterUpdate.getProperty(AGE_KEY)); | |||
| assertEquals(NEW_DATE, afterUpdate.getProperty(DATE_KEY)); | |||
| } | |||
| public void testDeleteProperties() throws Exception { | |||
| Properties beforeUpdate = getTestProperties(); | |||
| assertEquals("Property '" + FNAME_KEY + "' should exist before deleting", | |||
| FNAME, beforeUpdate.getProperty(FNAME_KEY)); | |||
| assertEquals("Property '" + LNAME_KEY + "' should exist before deleting", | |||
| LNAME, beforeUpdate.getProperty(LNAME_KEY)); | |||
| executeTarget("delete-properties"); | |||
| Properties afterUpdate = getTestProperties(); | |||
| assertEquals("Property '" + LNAME_KEY + "' should exist after deleting", | |||
| LNAME, afterUpdate.getProperty(LNAME_KEY)); | |||
| assertNull("Property '" + FNAME_KEY + "' should be deleted", | |||
| afterUpdate.getProperty(FNAME_KEY)); | |||
| } | |||
| public void testExerciseDefaultAndIncrement() throws Exception { | |||
| executeTarget("exercise"); | |||