mbenson 2004/04/23 08:41:39 Modified: . Tag: ANT_16_BRANCH WHATSNEW docs/manual/CoreTypes Tag: ANT_16_BRANCH propertyset.html src/etc/testcases/taskdefs/optional Tag: ANT_16_BRANCH echoproperties.xml src/main/org/apache/tools/ant/types Tag: ANT_16_BRANCH PropertySet.java src/testcases/org/apache/tools/ant/taskdefs/optional Tag: ANT_16_BRANCH EchoPropertiesTest.java Log: merge <propertyset negate> to 1.6 branch. Revision Changes Path No revision No revision 1.503.2.84 +2 -1 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.503.2.83 retrieving revision 1.503.2.84 diff -u -r1.503.2.83 -r1.503.2.84 --- WHATSNEW 23 Apr 2004 15:32:13 -0000 1.503.2.83 +++ WHATSNEW 23 Apr 2004 15:41:38 -0000 1.503.2.84 @@ -4,7 +4,6 @@ Changes that could break older environments: -------------------------------------------- - Fixed bugs: ----------- @@ -107,6 +106,8 @@ * <nice> task lets you set the priority of the current thread; non-forking <java> code will inherit this priority in their main thread. + +* New attribute "negate" on <propertyset> to invert selection criteria. Changes from Ant 1.6.0 to Ant 1.6.1 =================================== No revision No revision 1.2.2.5 +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.2.2.4 retrieving revision 1.2.2.5 diff -u -r1.2.2.4 -r1.2.2.5 --- propertyset.html 9 Feb 2004 22:12:10 -0000 1.2.2.4 +++ propertyset.html 23 Apr 2004 15:41:38 -0000 1.2.2.5 @@ -26,6 +26,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> @@ -107,6 +115,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 No revision No revision 1.3.2.1 +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.3.2.1 diff -u -r1.3 -r1.3.2.1 --- echoproperties.xml 14 May 2003 12:40:18 -0000 1.3 +++ echoproperties.xml 23 Apr 2004 15:41:38 -0000 1.3.2.1 @@ -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" /> No revision No revision 1.8.2.5 +40 -30 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.8.2.4 retrieving revision 1.8.2.5 diff -u -r1.8.2.4 -r1.8.2.5 --- PropertySet.java 9 Mar 2004 17:01:55 -0000 1.8.2.4 +++ PropertySet.java 23 Apr 2004 15:41:38 -0000 1.8.2.5 @@ -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,17 +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, prj.getProperties()); + getRef().addPropertyNames(names, props); } else { - addPropertyNames(names, prj.getProperties()); + 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; } @@ -178,9 +200,9 @@ mapper = myMapper.getImplementation(); } Properties properties = new Properties(); - for (Enumeration e = names.elements(); e.hasMoreElements();) { - String name = (String) e.nextElement(); - String value = prj.getProperty(name); + 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); if (newname != null) { @@ -193,26 +215,26 @@ } /** - * @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. for (Enumeration e = ptyRefs.elements(); e.hasMoreElements();) { PropertyRef ref = (PropertyRef) e.nextElement(); if (ref.name != null) { - if (prj.getProperty(ref.name) != null) { - names.addElement(ref.name); + if (prj != null && prj.getProperty(ref.name) != null) { + 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) { @@ -222,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); } } No revision No revision 1.6.2.5 +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.6.2.4 retrieving revision 1.6.2.5 diff -u -r1.6.2.4 -r1.6.2.5 --- EchoPropertiesTest.java 9 Mar 2004 17:02:05 -0000 1.6.2.4 +++ EchoPropertiesTest.java 23 Apr 2004 15:41:38 -0000 1.6.2.5 @@ -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)
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]