You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by mb...@apache.org on 2005/12/27 20:02:47 UTC
svn commit: r359262 - in /ant/core/trunk: ./ docs/manual/CoreTypes/
src/etc/testcases/types/ src/main/org/apache/tools/ant/types/
src/testcases/org/apache/tools/ant/types/
Author: mbenson
Date: Tue Dec 27 11:02:40 2005
New Revision: 359262
URL: http://svn.apache.org/viewcvs?rev=359262&view=rev
Log:
added the onmissingfiltersfile attribute to filterset. Bugzilla report 19845.
Added:
ant/core/trunk/src/etc/testcases/types/filtersetd.txt (with props)
ant/core/trunk/src/etc/testcases/types/filtersfile1
ant/core/trunk/src/etc/testcases/types/filtersfile2
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/docs/manual/CoreTypes/filterset.html
ant/core/trunk/src/etc/testcases/types/filterset.xml
ant/core/trunk/src/main/org/apache/tools/ant/types/FilterSet.java
ant/core/trunk/src/testcases/org/apache/tools/ant/types/FilterSetTest.java
Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewcvs/ant/core/trunk/WHATSNEW?rev=359262&r1=359261&r2=359262&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Tue Dec 27 11:02:40 2005
@@ -337,6 +337,8 @@
* new resourcesmatch condition.
+* added the onmissingfiltersfile attribute to filterset. Bugzilla report 19845.
+
Changes from Ant 1.6.4 to Ant 1.6.5
===================================
Modified: ant/core/trunk/docs/manual/CoreTypes/filterset.html
URL: http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTypes/filterset.html?rev=359262&r1=359261&r2=359262&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/CoreTypes/filterset.html (original)
+++ ant/core/trunk/docs/manual/CoreTypes/filterset.html Tue Dec 27 11:02:40 2005
@@ -62,7 +62,7 @@
<tr>
<td vAlign=top>filtersfile</td>
<td vAlign=top>Specify a single filtersfile.</td>
- <td vAlign=top><i>n/a</i></td>
+ <td vAlign=top><i>none</i></td>
<td vAlign=top align="center">No</td>
</tr>
<tr>
@@ -70,6 +70,13 @@
<td vAlign=top>Indicates whether the replacement text of tokens
should be searched for more tokens. <b>Since Ant 1.6.3</b></td>
<td vAlign=top><i>true</i></td>
+ <td vAlign=top align="center">No</td>
+ </tr>
+ <tr>
+ <td vAlign=top>onmissingfiltersfile</td>
+ <td vAlign=top>Indicate behavior when a nonexistent <i>filtersfile</i>
+ is specified. One of "fail", "warn", "ignore". <b>Since Ant 1.7</b></td>
+ <td vAlign=top>"fail"</td>
<td vAlign=top align="center">No</td>
</tr>
</table>
Modified: ant/core/trunk/src/etc/testcases/types/filterset.xml
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/types/filterset.xml?rev=359262&r1=359261&r2=359262&view=diff
==============================================================================
--- ant/core/trunk/src/etc/testcases/types/filterset.xml (original)
+++ ant/core/trunk/src/etc/testcases/types/filterset.xml Tue Dec 27 11:02:40 2005
@@ -48,10 +48,82 @@
</filterset>
</target>
+ <target name="testFiltersFileElement">
+ <copy file="filtersetd.txt" tofile="dest4.txt">
+ <filterset>
+ <filtersfile file="filtersfile1" />
+ </filterset>
+ </copy>
+ <fail>
+ <condition>
+ <not>
+ <resourcesmatch asText="true">
+ <file file="dest4.txt" />
+ <string value="FOO BAR @baz@ @blah@" />
+ </resourcesmatch>
+ </not>
+ </condition>
+ </fail>
+ </target>
+
+ <target name="testFiltersFileAttribute">
+ <copy file="filtersetd.txt" tofile="dest5.txt">
+ <filterset filtersfile="filtersfile1" />
+ </copy>
+ <fail>
+ <condition>
+ <not>
+ <resourcesmatch asText="true">
+ <file file="dest5.txt" />
+ <string value="FOO BAR @baz@ @blah@" />
+ </resourcesmatch>
+ </not>
+ </condition>
+ </fail>
+ </target>
+
+ <target name="testMultipleFiltersFiles">
+ <copy file="filtersetd.txt" tofile="dest6.txt">
+ <filterset filtersfile="filtersfile1">
+ <filtersfile file="filtersfile2" />
+ </filterset>
+ </copy>
+ <fail>
+ <condition>
+ <not>
+ <resourcesmatch asText="true">
+ <file file="dest6.txt" />
+ <string value="FOO BAR BAZ @blah@" />
+ </resourcesmatch>
+ </not>
+ </condition>
+ </fail>
+ </target>
+
+ <target name="testMissingFiltersFile">
+ <copy file="filtersetd.txt" tofile="dest7.txt">
+ <filterset filtersfile="nonexistentfiltersfile" />
+ </copy>
+ </target>
+
+ <target name="testAllowMissingFiltersFile">
+ <copy file="filtersetd.txt" tofile="dest8.txt">
+ <filterset filtersfile="nonexistentfiltersfile"
+ onmissingfiltersfile="ignore" />
+ </copy>
+ <fail>
+ <condition>
+ <not>
+ <filesmatch file1="filtersetd.txt" file2="dest8.txt" />
+ </not>
+ </condition>
+ </fail>
+ </target>
+
<target name="cleanup">
- <delete file="dest1.txt" quiet="true" />
- <delete file="dest2.txt" quiet="true" />
- <delete file="dest3.txt" quiet="true" />
+ <delete quiet="true">
+ <fileset dir="." includes="dest?.txt" />
+ </delete>
</target>
</project>
Added: ant/core/trunk/src/etc/testcases/types/filtersetd.txt
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/types/filtersetd.txt?rev=359262&view=auto
==============================================================================
--- ant/core/trunk/src/etc/testcases/types/filtersetd.txt (added)
+++ ant/core/trunk/src/etc/testcases/types/filtersetd.txt Tue Dec 27 11:02:40 2005
@@ -0,0 +1 @@
+@foo@ @bar@ @baz@ @blah@
Propchange: ant/core/trunk/src/etc/testcases/types/filtersetd.txt
------------------------------------------------------------------------------
svn:eol-style = native
Added: ant/core/trunk/src/etc/testcases/types/filtersfile1
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/types/filtersfile1?rev=359262&view=auto
==============================================================================
--- ant/core/trunk/src/etc/testcases/types/filtersfile1 (added)
+++ ant/core/trunk/src/etc/testcases/types/filtersfile1 Tue Dec 27 11:02:40 2005
@@ -0,0 +1,2 @@
+foo=FOO
+bar=BAR
Added: ant/core/trunk/src/etc/testcases/types/filtersfile2
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/types/filtersfile2?rev=359262&view=auto
==============================================================================
--- ant/core/trunk/src/etc/testcases/types/filtersfile2 (added)
+++ ant/core/trunk/src/etc/testcases/types/filtersfile2 Tue Dec 27 11:02:40 2005
@@ -0,0 +1 @@
+baz=BAZ
Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/FilterSet.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/types/FilterSet.java?rev=359262&r1=359261&r2=359262&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/FilterSet.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/FilterSet.java Tue Dec 27 11:02:40 2005
@@ -118,7 +118,44 @@
* @param file the file from which filters will be read.
*/
public void setFile(File file) {
- readFiltersFromFile(file);
+ filtersFiles.add(file);
+ }
+ }
+
+ /**
+ * EnumeratedAttribute to set behavior WRT missing filtersfiles:
+ * "fail" (default), "warn", "ignore".
+ * @since Ant 1.7
+ */
+ public static class OnMissing extends EnumeratedAttribute {
+ private static final String[] VALUES
+ = new String[] {"fail", "warn", "ignore"};
+
+ public static final OnMissing FAIL = new OnMissing("fail");
+ public static final OnMissing WARN = new OnMissing("warn");
+ public static final OnMissing IGNORE = new OnMissing("ignore");
+
+ private static final int FAIL_INDEX = 0;
+ private static final int WARN_INDEX = 1;
+ private static final int IGNORE_INDEX = 2;
+
+ /**
+ * Default constructor.
+ */
+ public OnMissing() {
+ }
+
+ /**
+ * Convenience constructor.
+ * @param value the value to set.
+ */
+ public OnMissing(String value) {
+ setValue(value);
+ }
+
+ //inherit doc
+ public String[] getValues() {
+ return VALUES;
}
}
@@ -138,6 +175,9 @@
private boolean recurse = true;
private Hashtable filterHash = null;
+ private Vector filtersFiles = new Vector();
+ private OnMissing onMissingFiltersFile = OnMissing.FAIL;
+ private boolean readingFiles = false;
/**
* List of ordered filters and filter files.
@@ -169,6 +209,15 @@
if (isReference()) {
return getRef().getFilters();
}
+ //silly hack to avoid stack overflow...
+ if (!readingFiles) {
+ readingFiles = true;
+ for (int i = 0, sz = filtersFiles.size(); i < sz; i++) {
+ readFiltersFromFile((File) filtersFiles.get(i));
+ }
+ filtersFiles.clear();
+ readingFiles = false;
+ }
return filters;
}
@@ -202,13 +251,12 @@
*
* @param filtersFile sets the filter file from which to read filters
* for this filter set.
- * @exception BuildException if there is a problem reading the filters.
*/
public void setFiltersfile(File filtersFile) throws BuildException {
if (isReference()) {
throw tooManyAttributes();
}
- readFiltersFromFile(filtersFile);
+ filtersFiles.add(filtersFile);
}
/**
@@ -292,7 +340,7 @@
throw tooManyAttributes();
}
if (!filtersFile.exists()) {
- throw new BuildException("Could not read filters from file "
+ handleMissingFile("Could not read filters from file "
+ filtersFile + " as it doesn't exist.");
}
if (filtersFile.isFile()) {
@@ -312,13 +360,14 @@
}
} catch (Exception ex) {
throw new BuildException("Could not read filters from file: "
- + filtersFile);
+ + filtersFile);
} finally {
FileUtils.close(in);
}
} else {
- throw new BuildException("Must specify a file not a directory in "
- + "the filtersfile attribute:" + filtersFile);
+ handleMissingFile(
+ "Must specify a file rather than a directory in "
+ + "the filtersfile attribute:" + filtersFile);
}
filterHash = null;
}
@@ -339,6 +388,104 @@
}
/**
+ * Add a new filter.
+ *
+ * @param filter the filter to be added.
+ */
+ public synchronized void addFilter(Filter filter) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ filters.addElement(filter);
+ filterHash = null;
+ }
+
+ /**
+ * Create a new FiltersFile.
+ *
+ * @return The filtersfile that was created.
+ */
+ public FiltersFile createFiltersfile() {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ return new FiltersFile();
+ }
+
+ /**
+ * Add a new filter made from the given token and value.
+ *
+ * @param token The token for the new filter.
+ * @param value The value for the new filter.
+ */
+ public synchronized void addFilter(String token, String value) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ addFilter(new Filter(token, value));
+ }
+
+ /**
+ * Add a Filterset to this filter set.
+ *
+ * @param filterSet the filterset to be added to this filterset
+ */
+ public synchronized void addConfiguredFilterSet(FilterSet filterSet) {
+ if (isReference()) {
+ throw noChildrenAllowed();
+ }
+ for (Enumeration e = filterSet.getFilters().elements(); e.hasMoreElements();) {
+ addFilter((Filter) e.nextElement());
+ }
+ }
+
+ /**
+ * Test to see if this filter set has filters.
+ *
+ * @return Return true if there are filters in this set.
+ */
+ public synchronized boolean hasFilters() {
+ return getFilters().size() > 0;
+ }
+
+ /**
+ * Clone the filterset.
+ *
+ * @return a deep clone of this filterset.
+ *
+ * @throws BuildException if the clone cannot be performed.
+ */
+ public synchronized Object clone() throws BuildException {
+ if (isReference()) {
+ return ((FilterSet) getRef()).clone();
+ }
+ try {
+ FilterSet fs = (FilterSet) super.clone();
+ fs.filters = (Vector) getFilters().clone();
+ fs.setProject(getProject());
+ return fs;
+ } catch (CloneNotSupportedException e) {
+ throw new BuildException(e);
+ }
+ }
+
+ /**
+ * Set the behavior WRT missing filtersfiles.
+ * @param onMissingFiltersFile the OnMissing describing the behavior.
+ */
+ public void setOnMissingFiltersFile(OnMissing onMissingFiltersFile) {
+ this.onMissingFiltersFile = onMissingFiltersFile;
+ }
+
+ /**
+ * Get the onMissingFiltersFile setting.
+ * @return the OnMissing instance.
+ */
+ public OnMissing getOnMissingFiltersFile() {
+ return onMissingFiltersFile;
+ }
+
+ /**
* Does replacement on the given string with token matching.
* This uses the defined begintoken and endtoken values which default
* to @ for both.
@@ -438,87 +585,21 @@
return value;
}
- /**
- * Add a new filter.
- *
- * @param filter the filter to be added.
- */
- public synchronized void addFilter(Filter filter) {
- if (isReference()) {
- throw noChildrenAllowed();
- }
- filters.addElement(filter);
- filterHash = null;
- }
-
- /**
- * Create a new FiltersFile.
- *
- * @return The filtersfile that was created.
- */
- public FiltersFile createFiltersfile() {
- if (isReference()) {
- throw noChildrenAllowed();
- }
- return new FiltersFile();
- }
-
- /**
- * Add a new filter made from the given token and value.
- *
- * @param token The token for the new filter.
- * @param value The value for the new filter.
- */
- public synchronized void addFilter(String token, String value) {
- if (isReference()) {
- throw noChildrenAllowed();
+ private void addFiltersFile(File f) {
+ if (!filtersFiles.contains(f)) {
+ filtersFiles.add(f);
}
- addFilter(new Filter(token, value));
}
- /**
- * Add a Filterset to this filter set.
- *
- * @param filterSet the filterset to be added to this filterset
- */
- public synchronized void addConfiguredFilterSet(FilterSet filterSet) {
- if (isReference()) {
- throw noChildrenAllowed();
- }
- for (Enumeration e = filterSet.getFilters().elements(); e.hasMoreElements();) {
- addFilter((Filter) e.nextElement());
+ private void handleMissingFile(String message) {
+ switch (onMissingFiltersFile.getIndex()) {
+ case OnMissing.IGNORE_INDEX:
+ return;
+ case OnMissing.FAIL_INDEX:
+ throw new BuildException(message);
+ case OnMissing.WARN_INDEX:
+ log(message, Project.MSG_WARN);
}
}
- /**
- * Test to see if this filter set has filters.
- *
- * @return Return true if there are filters in this set.
- */
- public synchronized boolean hasFilters() {
- return getFilters().size() > 0;
- }
-
- /**
- * Clone the filterset.
- *
- * @return a deep clone of this filterset.
- *
- * @throws BuildException if the clone cannot be performed.
- */
- public synchronized Object clone() throws BuildException {
- if (isReference()) {
- return ((FilterSet) getRef()).clone();
- } else {
- try {
- FilterSet fs = (FilterSet) super.clone();
- fs.filters = (Vector) getFilters().clone();
- fs.setProject(getProject());
- return fs;
- } catch (CloneNotSupportedException e) {
- throw new BuildException(e);
- }
- }
- }
}
-
Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/types/FilterSetTest.java
URL: http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/types/FilterSetTest.java?rev=359262&r1=359261&r2=359262&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/types/FilterSetTest.java (original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/types/FilterSetTest.java Tue Dec 27 11:02:40 2005
@@ -141,6 +141,27 @@
assertEquals("value1", filters.get("token1"));
}
+ public void testFiltersFileElement() {
+ executeTarget("testFiltersFileElement");
+ }
+
+ public void testFiltersFileAttribute() {
+ executeTarget("testFiltersFileAttribute");
+ }
+
+ public void testMultipleFiltersFiles() {
+ executeTarget("testMultipleFiltersFiles");
+ }
+
+ public void testMissingFiltersFile() {
+ expectBuildException("testMissingFiltersFile",
+ "should fail due to missing filtersfile");
+ }
+
+ public void testAllowMissingFiltersFile() {
+ executeTarget("testAllowMissingFiltersFile");
+ }
+
private boolean compareFiles(String name1, String name2) {
File file1 = new File(System.getProperty("root"), name1);
File file2 = new File(System.getProperty("root"), name2);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org