Tagging version 1.8.0 of Ant

git-svn-id: https://svn.apache.org/repos/asf/ant/core/tags/ANT_180@905481 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ReleaseInstructions b/ReleaseInstructions
index a47be09..f3a50f4 100644
--- a/ReleaseInstructions
+++ b/ReleaseInstructions
@@ -105,6 +105,9 @@
     on the branch. It is important that this be a clean build. Label this with
     a tag ANT_170_B1.
 
+    The file release.sh gives an idea of how to do this build process,
+    currently in two steps, one with JDK 1.4 and one with JDK 1.5
+
     C:\dev\asf\ant-core>
     svn copy https://svn.apache.org/repos/asf/ant/core/trunk \
     https://svn.apache.org/repos/asf/ant/core/tags/ANT_170_B1 \
diff --git a/WHATSNEW b/WHATSNEW
index ad6a054..7f4110d 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -21,6 +21,9 @@
 Fixed bugs:
 -----------
 
+ * stack traces were not reported at all by <junit/>
+   when filtertrace="on", which is the default.
+
  * ant.bat can now also process the -noclasspath switch when it is 
    the first switch on a command line.
    Bugzilla Report 48186.
diff --git a/build.xml b/build.xml
index 53a000f..949567c 100644
--- a/build.xml
+++ b/build.xml
@@ -375,9 +375,6 @@
     <available property="apache.resolver.present"
       classname="org.apache.xml.resolver.tools.CatalogResolver"
       classpathref="classpath"/>
-    <available property="xalan2.present"
-      classname="org.apache.xalan.transformer.TransformerImpl"
-      classpathref="classpath"/>
     <available property="recent.xalan2.present"
       classname="org.apache.xalan.trace.TraceListenerEx3"
       classpathref="classpath"/>
diff --git a/docs/antnews.html b/docs/antnews.html
index aac148c..fc34ccf 100644
--- a/docs/antnews.html
+++ b/docs/antnews.html
@@ -208,7 +208,7 @@
       <a name="Ant1.8.0"></a>
       Ant1.8.0
     </h3>
-                        <h3>Februrary 5th, 2010 - Ant 1.8.0 Released</h3>
+                        <h3>Februrary 8th, 2010 - Ant 1.8.0 Released</h3>
                                 <p>Apache Ant 1.8.0 is now available for download as source or binary (with and without
       dependencies) from
       <a href="http://ant.apache.org/bindownload.cgi">http://ant.apache.org/bindownload.cgi</a>.</p>
diff --git a/docs/bindownload.html b/docs/bindownload.html
index 0b0afa6..7689955 100644
--- a/docs/bindownload.html
+++ b/docs/bindownload.html
@@ -248,7 +248,7 @@
 <a href="[preferred]/ant/README.html">release notes</a>.</p>
                                 <div class="warning">
 <div class="label">Note</div>
-<div class="content">Ant 1.8.0 was released on 5-Feb-2010 and
+<div class="content">Ant 1.8.0 was released on 8-Feb-2010 and
 may not be available on all mirrors for a few days.</div>
 </div>
                                 <br />
diff --git a/docs/faq.html b/docs/faq.html
index d962e3a..0288b5b 100644
--- a/docs/faq.html
+++ b/docs/faq.html
@@ -748,7 +748,7 @@
       </td>
                           <td colspan="1" rowspan="1"
       valign="top" align="left">
-          5 February 2010
+          8 February 2010
       </td>
       </tr>
           </table>
diff --git a/docs/index.html b/docs/index.html
index 2ab9b94..8debd95 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -204,7 +204,7 @@
       <a name="Ant 1.8.0"></a>
       Ant 1.8.0
     </h3>
-                        <h3>February 5, 2010 - Ant 1.8.0 Available</h3>
+                        <h3>February 8, 2010 - Ant 1.8.0 Available</h3>
                                 <p>
 			Apache Ant 1.8.0 is now available for
 			<a href="http://ant.apache.org/bindownload.cgi">download</a>
diff --git a/docs/manual/install.html b/docs/manual/install.html
index 5e4c135..2f48ed2 100644
--- a/docs/manual/install.html
+++ b/docs/manual/install.html
@@ -920,8 +920,8 @@
   <tr>
     <td>JAI - Java Advanced Imaging</td>
     <td>image task</td>
-    <td><a href="http://java.sun.com/products/java-media/jai/"
-        target="_top">http://java.sun.com/products/java-media/jai/</a></td>
+    <td><a href="https://jai.dev.java.net/"
+        target="_top">https://jai.dev.java.net/</a></td>
   </tr>
   <tr>
     <td>Starteam SDK</td>
diff --git a/docs/srcdownload.html b/docs/srcdownload.html
index bcbe5bd..8aa3fc2 100644
--- a/docs/srcdownload.html
+++ b/docs/srcdownload.html
@@ -246,7 +246,7 @@
 <a href="[preferred]/ant/README.html">release notes</a>.</p>
                                 <div class="warning">
 <div class="label">Note</div>
-<div class="content">Ant 1.8.0 was released on 5-Feb-2010 and
+<div class="content">Ant 1.8.0 was released on 8-Feb-2010 and
 may not be available on all mirrors for a few days.</div>
 </div>
                                 <br />
diff --git a/release.sh b/release.sh
new file mode 100755
index 0000000..e204c97
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#######################################################################
+# this is a first attempt to document the build of the distribution
+# paths are hard-coded and obviously this is for a Cygwin/Windows combo
+#######################################################################
+rm -rf bootstrap build dist distribution
+unset ANT_HOME
+export JAVA_HOME=/cygdrive/c/j2sdk1.4.2_19
+export PATH=$JAVA_HOME/bin:$PATH
+echo ANT_HOME=$ANT_HOME
+echo JAVA_HOME=$JAVA_HOME
+which java
+echo running first build under JDK 1.4
+./build.sh
+export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.5.0_22"
+export PATH=$JAVA_HOME/bin:$PATH
+echo ANT_HOME=$ANT_HOME
+echo JAVA_HOME=$JAVA_HOME
+which java
+echo running second build under JDK 1.5 including tests
+./build.sh distribution run-tests
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/Execute.java b/src/main/org/apache/tools/ant/taskdefs/Execute.java
index 09204ee..74f98ca 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Execute.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Execute.java
@@ -1203,9 +1203,7 @@
                     out.write(cmd[i]);
                 }
             } finally {
-                if (out != null) {
-                    out.close();
-                }
+                FileUtils.close(out);
             }
             return script;
         }
diff --git a/src/main/org/apache/tools/ant/taskdefs/KeySubst.java b/src/main/org/apache/tools/ant/taskdefs/KeySubst.java
index 97f3dbb..9067191 100644
--- a/src/main/org/apache/tools/ant/taskdefs/KeySubst.java
+++ b/src/main/org/apache/tools/ant/taskdefs/KeySubst.java
@@ -28,6 +28,7 @@
 import java.util.StringTokenizer;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.util.FileUtils;
 
 /**
  * Keyword substitution. Input file is written to output file.
@@ -80,20 +81,8 @@
         } catch (IOException ioe) {
             ioe.printStackTrace();
         } finally {
-            if (bw != null) {
-                try {
-                    bw.close();
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
-            if (br != null) {
-                try {
-                    br.close();
-                } catch (IOException e) {
-                    // ignore
-                }
-            }
+            FileUtils.close(bw);
+            FileUtils.close(br);
         }
     }
 
diff --git a/src/main/org/apache/tools/ant/taskdefs/email/Message.java b/src/main/org/apache/tools/ant/taskdefs/email/Message.java
index ee905f4..75b033a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/email/Message.java
+++ b/src/main/org/apache/tools/ant/taskdefs/email/Message.java
@@ -26,6 +26,7 @@
 import java.io.PrintStream;
 
 import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.util.FileUtils;
 
 /**
  * Class representing an email message.
@@ -115,28 +116,33 @@
          throws IOException {
         // We need character encoding aware printing here.
         // So, using BufferedWriter over OutputStreamWriter instead of PrintStream
-        BufferedWriter out
-            = charset != null ? new BufferedWriter(new OutputStreamWriter(ps, charset))
-                              : new BufferedWriter(new OutputStreamWriter(ps));
-        if (messageSource != null) {
-            // Read message from a file
-            FileReader freader = new FileReader(messageSource);
+        BufferedWriter out = null;
+        try {
+            out
+                = charset != null ? new BufferedWriter(new OutputStreamWriter(ps, charset))
+                : new BufferedWriter(new OutputStreamWriter(ps));
+            if (messageSource != null) {
+                // Read message from a file
+                FileReader freader = new FileReader(messageSource);
 
-            try {
-                BufferedReader in = new BufferedReader(freader);
-                String line = null;
-                while ((line = in.readLine()) != null) {
-                    out.write(getProject().replaceProperties(line));
-                    out.newLine();
+                try {
+                    BufferedReader in = new BufferedReader(freader);
+                    String line = null;
+                    while ((line = in.readLine()) != null) {
+                        out.write(getProject().replaceProperties(line));
+                        out.newLine();
+                    }
+                } finally {
+                    freader.close();
                 }
-            } finally {
-                freader.close();
+            } else {
+                out.write(getProject().replaceProperties(buffer.substring(0)));
+                out.newLine();
             }
-        } else {
-            out.write(getProject().replaceProperties(buffer.substring(0)));
-            out.newLine();
+            out.flush();
+        } finally {
+            FileUtils.close(out);
         }
-        out.flush();
     }
 
 
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
index 6f063c1..a0b5406 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/Cab.java
@@ -179,14 +179,18 @@
         throws IOException {
         File listFile = FILE_UTILS.createTempFile("ant", "", null, true, true);
 
-        BufferedWriter writer = new BufferedWriter(new FileWriter(listFile));
+        BufferedWriter writer = null;
+        try {
+            writer = new BufferedWriter(new FileWriter(listFile));
 
-        int size = files.size();
-        for (int i = 0; i < size; i++) {
-            writer.write('\"' + files.elementAt(i).toString() + '\"');
-            writer.newLine();
+            int size = files.size();
+            for (int i = 0; i < size; i++) {
+                writer.write('\"' + files.elementAt(i).toString() + '\"');
+                writer.newLine();
+            }
+        } finally {
+            FileUtils.close(writer);
         }
-        writer.close();
 
         return listFile;
     }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
index 829a469..cc630cb 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/ReplaceRegExp.java
@@ -354,6 +354,7 @@
 
         Reader r = null;
         Writer w = null;
+        BufferedWriter bw = null;
 
         try {
             if (encoding == null) {
@@ -366,7 +367,7 @@
             }
 
             BufferedReader br = new BufferedReader(r);
-            BufferedWriter bw = new BufferedWriter(w);
+            bw = new BufferedWriter(w);
 
             boolean changes = false;
 
@@ -447,7 +448,6 @@
                     }
                 } while (c >= 0);
 
-                bw.flush();
             } else {
                 String buf = FileUtils.safeReadFully(br);
 
@@ -458,9 +458,10 @@
                 }
 
                 bw.write(res);
-                bw.flush();
             }
 
+            bw.flush();
+
             r.close();
             r = null;
             w.close();
@@ -484,6 +485,7 @@
             }
         } finally {
             FileUtils.close(r);
+            FileUtils.close(bw);
             FileUtils.close(w);
             if (temp != null) {
                 temp.delete();
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/i18n/Translate.java b/src/main/org/apache/tools/ant/taskdefs/optional/i18n/Translate.java
index 3ca2266..cf6fa5f 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/i18n/Translate.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/i18n/Translate.java
@@ -530,87 +530,7 @@
                     if (needsWork) {
                         log("Processing " + srcFiles[j],
                             Project.MSG_DEBUG);
-                        FileOutputStream fos = new FileOutputStream(dest);
-                        BufferedWriter out
-                            = new BufferedWriter(new OutputStreamWriter(fos, destEncoding));
-                        FileInputStream fis = new FileInputStream(src);
-                        BufferedReader in
-                            = new BufferedReader(new InputStreamReader(fis, srcEncoding));
-                        String line;
-                        LineTokenizer lineTokenizer = new LineTokenizer();
-                        lineTokenizer.setIncludeDelims(true);
-                        line = lineTokenizer.getToken(in);
-                        while ((line) != null) {
-                            // 2003-02-21 new replace algorithm by tbee (tbee@tbee.org)
-                            // because it wasn't able to replace something like "@aaa;@bbb;"
-
-                            // is there a startToken
-                            // and there is still stuff following the startToken
-                            int startIndex = line.indexOf(startToken);
-                            while (startIndex >= 0
-                                && (startIndex + startToken.length()) <= line.length()) {
-                                // the new value, this needs to be here
-                                // because it is required to calculate the next position to
-                                // search from at the end of the loop
-                                String replace = null;
-
-                                // we found a starttoken, is there an endtoken following?
-                                // start at token+tokenlength because start and end
-                                // token may be indentical
-                                int endIndex = line.indexOf(
-                                    endToken, startIndex + startToken.length());
-                                if (endIndex < 0) {
-                                    startIndex += 1;
-                                } else {
-                                    // grab the token
-                                    String token = line.substring(
-                                        startIndex + startToken.length(), endIndex);
-
-                                    // If there is a white space or = or :, then
-                                    // it isn't to be treated as a valid key.
-                                    boolean validToken = true;
-                                    for (int k = 0; k < token.length() && validToken; k++) {
-                                        char c = token.charAt(k);
-                                        if (c == ':' || c == '='
-                                            || Character.isSpaceChar(c)) {
-                                            validToken = false;
-                                        }
-                                    }
-                                    if (!validToken) {
-                                        startIndex += 1;
-                                    } else {
-                                        // find the replace string
-                                        if (resourceMap.containsKey(token)) {
-                                            replace = (String) resourceMap.get(token);
-                                        } else {
-                                            log("Replacement string missing for: "
-                                                + token, Project.MSG_VERBOSE);
-                                            replace = startToken + token + endToken;
-                                        }
-
-
-                                        // generate the new line
-                                        line = line.substring(0, startIndex)
-                                             + replace
-                                             + line.substring(endIndex + endToken.length());
-
-                                        // set start position for next search
-                                        startIndex += replace.length();
-                                    }
-                                }
-
-                                // find next starttoken
-                                startIndex = line.indexOf(startToken, startIndex);
-                            }
-                            out.write(line);
-                            line = lineTokenizer.getToken(in);
-                        }
-                        if (in != null) {
-                            in.close();
-                        }
-                        if (out != null) {
-                            out.close();
-                        }
+                        translateOneFile(src, dest);
                         ++filesProcessed;
                     } else {
                         log("Skipping " + srcFiles[j]
@@ -624,4 +544,87 @@
         }
         log("Translation performed on " + filesProcessed + " file(s).", Project.MSG_DEBUG);
     }
+
+    private void translateOneFile(File src, File dest) throws IOException {
+        BufferedWriter out = null;
+        BufferedReader in = null;
+        try {
+            FileOutputStream fos = new FileOutputStream(dest);
+            out = new BufferedWriter(new OutputStreamWriter(fos, destEncoding));
+            FileInputStream fis = new FileInputStream(src);
+            in = new BufferedReader(new InputStreamReader(fis, srcEncoding));
+            String line;
+            LineTokenizer lineTokenizer = new LineTokenizer();
+            lineTokenizer.setIncludeDelims(true);
+            line = lineTokenizer.getToken(in);
+            while ((line) != null) {
+                // 2003-02-21 new replace algorithm by tbee (tbee@tbee.org)
+                // because it wasn't able to replace something like "@aaa;@bbb;"
+
+                // is there a startToken
+                // and there is still stuff following the startToken
+                int startIndex = line.indexOf(startToken);
+                while (startIndex >= 0
+                       && (startIndex + startToken.length()) <= line.length()) {
+                    // the new value, this needs to be here
+                    // because it is required to calculate the next position to
+                    // search from at the end of the loop
+                    String replace = null;
+
+                    // we found a starttoken, is there an endtoken following?
+                    // start at token+tokenlength because start and end
+                    // token may be indentical
+                    int endIndex = line.indexOf(endToken, startIndex
+                                                + startToken.length());
+                    if (endIndex < 0) {
+                        startIndex += 1;
+                    } else {
+                        // grab the token
+                        String token = line.substring(startIndex
+                                                      + startToken.length(),
+                                                      endIndex);
+
+                        // If there is a white space or = or :, then
+                        // it isn't to be treated as a valid key.
+                        boolean validToken = true;
+                        for (int k = 0; k < token.length() && validToken; k++) {
+                            char c = token.charAt(k);
+                            if (c == ':' || c == '='
+                                || Character.isSpaceChar(c)) {
+                                validToken = false;
+                            }
+                        }
+                        if (!validToken) {
+                            startIndex += 1;
+                        } else {
+                            // find the replace string
+                            if (resourceMap.containsKey(token)) {
+                                replace = (String) resourceMap.get(token);
+                            } else {
+                                log("Replacement string missing for: " + token,
+                                    Project.MSG_VERBOSE);
+                                replace = startToken + token + endToken;
+                            }
+
+
+                            // generate the new line
+                            line = line.substring(0, startIndex) + replace
+                                + line.substring(endIndex + endToken.length());
+
+                            // set start position for next search
+                            startIndex += replace.length();
+                        }
+                    }
+
+                    // find next starttoken
+                    startIndex = line.indexOf(startToken, startIndex);
+                }
+                out.write(line);
+                line = lineTokenizer.getToken(in);
+            }
+        } finally {
+            FileUtils.close(in);
+            FileUtils.close(out);
+        }
+    }
 }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
index e7b7a07..6ed4f12 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
@@ -169,10 +169,14 @@
                 output.write(sb.toString());
                 resultWriter.close();
                 output.write(results.toString());
-                output.flush();
             } catch (IOException ex) {
                 throw new BuildException(ex);
             } finally {
+                try {
+                    output.flush();
+                } catch (IOException ex) {
+                    // swallow, there has likely been an exception before this
+                }
                 if (out != System.out && out != System.err) {
                     FileUtils.close(out);
                 }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
index 8399416..3156b1a 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
@@ -255,9 +255,10 @@
             createSuiteMethod();
             createClassFooter();
 
-            FileUtils.close(writer);
         } catch (IOException e) {
             e.printStackTrace();
+        } finally {
+            FileUtils.close(writer);
         }
     }
 
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
index d483d13..e56a7bd 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
@@ -44,6 +44,7 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.types.Permissions;
+import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.StringUtils;
 import org.apache.tools.ant.util.TeeOutputStream;
 
@@ -898,6 +899,8 @@
             }
         } catch (Exception e) {
             return stack; // return the stack unfiltered
+        } finally {
+            FileUtils.close(pw);
         }
         return sw.toString();
     }
@@ -941,9 +944,7 @@
                 out.write(Constants.TERMINATED_SUCCESSFULLY + "\n");
                 out.flush();
             } finally {
-                if (out != null) {
-                    out.close();
-                }
+                FileUtils.close(out);
             }
         }
     }
@@ -957,9 +958,7 @@
                     out.write(testCase + "\n");
                     out.flush();
                 } finally {
-                    if (out != null) {
-                        out.close();
-                    }
+                    FileUtils.close(out);
                 }
             } catch (IOException e) {
                 // ignored.
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
index 35621ce..5e3d1d7 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java
@@ -169,10 +169,16 @@
                 wri = new BufferedWriter(new OutputStreamWriter(out, "UTF8"));
                 wri.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
                 (new DOMElementWriter()).write(rootElement, wri, 0, "  ");
-                wri.flush();
             } catch (IOException exc) {
                 throw new BuildException("Unable to write log file", exc);
             } finally {
+                if (wri != null) {
+                    try {
+                        wri.flush();
+                    } catch (IOException ex) {
+                        // ignore
+                    }
+                }
                 if (out != System.out && out != System.err) {
                     FileUtils.close(wri);
                 }
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
index 1857f8a..257e5b7 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java
@@ -1799,9 +1799,7 @@
                 }
             }
         } finally {
-            if (bw != null) {
-                bw.close();
-            }
+            FileUtils.close(bw);
         }
 
         return dsfiles.length;
@@ -2158,13 +2156,7 @@
                 transferred++;
             }
         } finally {
-            if (instream != null) {
-                try {
-                    instream.close();
-                } catch (IOException ex) {
-                    // ignore it
-                }
-            }
+            FileUtils.close(instream);
         }
     }
 
@@ -2295,13 +2287,7 @@
                 }
             }
         } finally {
-            if (outstream != null) {
-                try {
-                    outstream.close();
-                } catch (IOException ex) {
-                    // ignore it
-                }
-            }
+            FileUtils.close(outstream);
         }
     }
 
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java b/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
index e3cae4d..c42f034 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/pvcs/Pvcs.java
@@ -38,6 +38,7 @@
 import org.apache.tools.ant.taskdefs.LogStreamHandler;
 import org.apache.tools.ant.taskdefs.PumpStreamHandler;
 import org.apache.tools.ant.types.Commandline;
+import org.apache.tools.ant.util.FileUtils;
 
 /**
  *
@@ -205,7 +206,7 @@
                                     new LogOutputStream(this,
                                                         Project.MSG_WARN)));
             } finally {
-                fos.close();
+                FileUtils.close(fos);
             }
 
             if (Execute.isFailure(result) && !ignorerc) {
@@ -340,9 +341,7 @@
                 line = in.readLine();
             }
         } finally {
-            if (in != null) {
-                in.close();
-            }
+            FileUtils.close(in);
         }
     }
 
@@ -366,12 +365,8 @@
                 outWriter.newLine();
             }
         } finally {
-            if (inReader != null) {
-                inReader.close();
-            }
-            if (outWriter != null) {
-                outWriter.close();
-            }
+            FileUtils.close(inReader);
+            FileUtils.close(outWriter);
         }
     }
 
diff --git a/xdocs/antnews.xml b/xdocs/antnews.xml
index 7e7c1a3..b93c783 100644
--- a/xdocs/antnews.xml
+++ b/xdocs/antnews.xml
@@ -27,7 +27,7 @@
 
 <body>
   <section name="Ant1.8.0">
-    <h3>Februrary 5th, 2010 - Ant 1.8.0 Released</h3>
+    <h3>Februrary 8th, 2010 - Ant 1.8.0 Released</h3>
     <p>Apache Ant 1.8.0 is now available for download as source or binary (with and without
       dependencies) from
       <a href="http://ant.apache.org/bindownload.cgi">http://ant.apache.org/bindownload.cgi</a>.</p>
diff --git a/xdocs/bindownload.xml b/xdocs/bindownload.xml
index 8a20301..5a4ea12 100644
--- a/xdocs/bindownload.xml
+++ b/xdocs/bindownload.xml
@@ -80,7 +80,7 @@
 
 <div class="warning">
 <div class="label">Note</div>
-<div class="content">Ant 1.8.0 was released on 5-Feb-2010 and
+<div class="content">Ant 1.8.0 was released on 8-Feb-2010 and
 may not be available on all mirrors for a few days.</div>
 </div>
 <br></br>
diff --git a/xdocs/faq.xml b/xdocs/faq.xml
index 200a01f..43aff03 100644
--- a/xdocs/faq.xml
+++ b/xdocs/faq.xml
@@ -224,7 +224,7 @@
           </tr>
           <tr>
             <td>1.8.0</td>
-            <td>5 February 2010</td>
+            <td>8 February 2010</td>
           </tr>
         </table>
       </answer>
diff --git a/xdocs/index.xml b/xdocs/index.xml
index 7209919..b4fd2da 100644
--- a/xdocs/index.xml
+++ b/xdocs/index.xml
@@ -25,7 +25,7 @@
 
 <body>
 	<section name="Ant 1.8.0">
-		<h3>February 5, 2010 - Ant 1.8.0 Available</h3>
+		<h3>February 8, 2010 - Ant 1.8.0 Available</h3>
 		<p>
 			Apache Ant 1.8.0 is now available for
 			<a href="http://ant.apache.org/bindownload.cgi">download</a>
diff --git a/xdocs/srcdownload.xml b/xdocs/srcdownload.xml
index 4887e8f..411f54f 100644
--- a/xdocs/srcdownload.xml
+++ b/xdocs/srcdownload.xml
@@ -77,7 +77,7 @@
 
 <div class="warning">
 <div class="label">Note</div>
-<div class="content">Ant 1.8.0 was released on 5-Feb-2010 and
+<div class="content">Ant 1.8.0 was released on 8-Feb-2010 and
 may not be available on all mirrors for a few days.</div>
 </div>
 <br></br>