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]