mbenson 2004/03/11 15:40:59
Modified: . WHATSNEW
src/etc/testcases/taskdefs/optional echoproperties.xml
src/main/org/apache/tools/ant/types PropertySet.java
src/testcases/org/apache/tools/ant/taskdefs/optional
EchoPropertiesTest.java
docs/manual/CoreTypes propertyset.html
Log:
Add "negate" attribute to <propertyset>s.
Revision Changes Path
1.570 +2 -0 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.569
retrieving revision 1.570
diff -u -r1.569 -r1.570
--- WHATSNEW 11 Mar 2004 19:25:48 -0000 1.569
+++ WHATSNEW 11 Mar 2004 23:40:59 -0000 1.570
@@ -46,6 +46,8 @@
nested FileNameMapper implementations directly, allowing a usage
comparable to those of <condition>, <filter>, and <selector>.
+* New attribute "negate" on <propertyset> to invert selection criteria.
+
Changes from Ant 1.6.1 to current Ant 1.6 CVS version
=============================================
1.4 +18 -0
ant/src/etc/testcases/taskdefs/optional/echoproperties.xml
Index: echoproperties.xml
===================================================================
RCS file:
/home/cvs/ant/src/etc/testcases/taskdefs/optional/echoproperties.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- echoproperties.xml 14 May 2003 12:40:18 -0000 1.3
+++ echoproperties.xml 11 Mar 2004 23:40:59 -0000 1.4
@@ -72,6 +72,24 @@
</echoproperties>
</target>
+ <target name="testEchoPrefixAsNegatedPropertyset" depends="setup">
+ <echoproperties destfile="test-prefix.properties">
+ <propertyset negate="true">
+ <propertyref prefix="b."/>
+ </propertyset>
+ </echoproperties>
+ </target>
+
+ <target name="testEchoPrefixAsDoublyNegatedPropertyset" depends="setup">
+ <echoproperties destfile="test-prefix.properties">
+ <propertyset negate="true">
+ <propertyset negate="true">
+ <propertyref prefix="a."/>
+ </propertyset>
+ </propertyset>
+ </echoproperties>
+ </target>
+
<target name="cleanup">
<delete file="test.properties" failonerror="no" />
<delete file="test-prefix.properties" failonerror="no" />
1.14 +34 -26 ant/src/main/org/apache/tools/ant/types/PropertySet.java
Index: PropertySet.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/PropertySet.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- PropertySet.java 9 Mar 2004 16:48:41 -0000 1.13
+++ PropertySet.java 11 Mar 2004 23:40:59 -0000 1.14
@@ -18,6 +18,9 @@
package org.apache.tools.ant.types;
import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.HashSet;
+import java.util.Set;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Stack;
@@ -25,6 +28,7 @@
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
+import org.apache.tools.ant.PropertyHelper;
import org.apache.tools.ant.util.FileNameMapper;
import org.apache.tools.ant.util.regexp.RegexpMatcher;
import org.apache.tools.ant.util.regexp.RegexpMatcherFactory;
@@ -37,7 +41,8 @@
public class PropertySet extends DataType {
private boolean dynamic = true;
- private Vector cachedNames;
+ private boolean negate = false;
+ private Set cachedNames;
private Vector ptyRefs = new Vector();
private Vector setRefs = new Vector();
private Mapper _mapper;
@@ -145,6 +150,11 @@
this.dynamic = dynamic;
}
+ public void setNegate(boolean negate) {
+ assertNotReference();
+ this.negate = negate;
+ }
+
public boolean getDynamic() {
return isReference() ? getRef().dynamic : dynamic;
}
@@ -154,19 +164,29 @@
}
public Properties getProperties() {
- Vector names = null;
+ Set names = null;
Project prj = getProject();
Hashtable props =
prj == null ? System.getProperties() : prj.getProperties();
if (getDynamic() || cachedNames == null) {
- names = new Vector(); // :TODO: should be a Set!
+ names = new HashSet();
if (isReference()) {
getRef().addPropertyNames(names, props);
} else {
addPropertyNames(names, props);
}
-
+ // Add this PropertySet's nested PropertySets' property names.
+ for (Enumeration e = setRefs.elements(); e.hasMoreElements();) {
+ PropertySet set = (PropertySet) e.nextElement();
+ names.addAll(set.getProperties().keySet());
+ }
+ if (negate) {
+ //make a copy...
+ HashSet complement = new HashSet(props.keySet());
+ complement.removeAll(names);
+ names = complement;
+ }
if (!getDynamic()) {
cachedNames = names;
}
@@ -180,8 +200,8 @@
mapper = myMapper.getImplementation();
}
Properties properties = new Properties();
- for (Enumeration e = names.elements(); e.hasMoreElements();) {
- String name = (String) e.nextElement();
+ for (Iterator iter = names.iterator(); iter.hasNext();) {
+ String name = (String) iter.next();
String value = (String) props.get(name);
if (mapper != null) {
String[] newname = mapper.mapFileName(name);
@@ -195,12 +215,12 @@
}
/**
- * @param names the output vector to fill with the property names
+ * @param names the output Set to fill with the property names
* matching this PropertySet selection criteria.
* @param properties the current Project properties, passed in to
* avoid needless duplication of the Hashtable during recursion.
*/
- private void addPropertyNames(Vector names, Hashtable properties) {
+ private void addPropertyNames(Set names, Hashtable properties) {
Project prj = getProject();
// Add this PropertySet's property names.
@@ -208,13 +228,13 @@
PropertyRef ref = (PropertyRef) e.nextElement();
if (ref.name != null) {
if (prj != null && prj.getProperty(ref.name) != null) {
- names.addElement(ref.name);
+ names.add(ref.name);
}
} else if (ref.prefix != null) {
for (Enumeration p = properties.keys();
p.hasMoreElements();) {
String name = (String) p.nextElement();
if (name.startsWith(ref.prefix)) {
- names.addElement(name);
+ names.add(name);
}
}
} else if (ref.regex != null) {
@@ -224,37 +244,25 @@
for (Enumeration p = properties.keys();
p.hasMoreElements();) {
String name = (String) p.nextElement();
if (matcher.matches(name)) {
- names.addElement(name);
+ names.add(name);
}
}
} else if (ref.builtin != null) {
- Enumeration e2 = null;
if (ref.builtin.equals(BuiltinPropertySetName.ALL)) {
- e2 = properties.keys();
+ names.addAll(properties.keySet());
} else if
(ref.builtin.equals(BuiltinPropertySetName.SYSTEM)) {
- e2 = System.getProperties().keys();
+ names.addAll(System.getProperties().keySet());
} else if (ref.builtin.equals(BuiltinPropertySetName
.COMMANDLINE)) {
- e2 = getProject().getUserProperties().keys();
+ names.addAll(getProject().getUserProperties().keySet());
} else {
throw new BuildException("Impossible: Invalid builtin "
+ "attribute!");
}
-
- while (e2.hasMoreElements()) {
- names.addElement(e2.nextElement());
- }
-
} else {
throw new BuildException("Impossible: Invalid PropertyRef!");
}
- }
-
- // Add this PropertySet's nested PropertySets' property names.
- for (Enumeration e = setRefs.elements(); e.hasMoreElements();) {
- PropertySet set = (PropertySet) e.nextElement();
- set.addPropertyNames(names, properties);
}
}
1.11 +18 -10
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java
Index: EchoPropertiesTest.java
===================================================================
RCS file:
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/EchoPropertiesTest.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- EchoPropertiesTest.java 9 Mar 2004 16:49:01 -0000 1.10
+++ EchoPropertiesTest.java 11 Mar 2004 23:40:59 -0000 1.11
@@ -141,20 +141,28 @@
public void testEchoPrefix() throws Exception {
- executeTarget( "testEchoPrefix" );
- Properties props=loadPropFile(PREFIX_OUTFILE);
-// props.list(System.out);
- assertEquals("prefix didn't include 'a.set'
property","true",props.getProperty("a.set"));
- assertNull("prefix failed to filter out property 'b.set'",
- props.getProperty("b.set"));
+ testEchoPrefixVarious("testEchoPrefix");
}
public void testEchoPrefixAsPropertyset() throws Exception {
- executeTarget( "testEchoPrefixAsPropertyset" );
- Properties props=loadPropFile(PREFIX_OUTFILE);
- assertEquals("prefix didn't include 'a.set'
property","true",props.getProperty("a.set"));
+ testEchoPrefixVarious("testEchoPrefixAsPropertyset");
+ }
+
+ public void testEchoPrefixAsNegatedPropertyset() throws Exception {
+ testEchoPrefixVarious("testEchoPrefixAsNegatedPropertyset");
+ }
+
+ public void testEchoPrefixAsDoublyNegatedPropertyset() throws Exception {
+ testEchoPrefixVarious("testEchoPrefixAsDoublyNegatedPropertyset");
+ }
+
+ private void testEchoPrefixVarious(String target) throws Exception {
+ executeTarget(target);
+ Properties props = loadPropFile(PREFIX_OUTFILE);
+ assertEquals("prefix didn't include 'a.set' property",
+ "true", props.getProperty("a.set"));
assertNull("prefix failed to filter out property 'b.set'",
- props.getProperty("b.set"));
+ props.getProperty("b.set"));
}
protected Properties loadPropFile(String relativeFilename)
1.6 +11 -0 ant/docs/manual/CoreTypes/propertyset.html
Index: propertyset.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/CoreTypes/propertyset.html,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- propertyset.html 9 Feb 2004 21:50:07 -0000 1.5
+++ propertyset.html 11 Mar 2004 23:40:59 -0000 1.6
@@ -25,6 +25,14 @@
is used. Default is "<code>true</code>".</td>
<td valign="top" align="center">No</td>
</tr>
+ <tr>
+ <td valign="top">negate</td>
+ <td valign="top">Whether to negate results. If
+ "<code>true</code>", all properties <i>not</i>
+ selected by nested elements will be returned.
+ Default is "<code>false</code>".</td>
+ <td valign="top" align="center">No</td>
+ </tr>
</table>
<h3>Parameters specified as nested elements</h3>
@@ -106,6 +114,9 @@
<p>collects all properties whose name starts with "foo", but
changes the names to start with "bar" instead.</p>
+
+<p>If supplied, the nested mapper will be applied
+subsequent to any negation of matched properties.</p>
<hr>
<p align="center">Copyright © 2003-2004 The Apache Software Foundation.
All rights
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]