diff --git a/src/main/org/apache/tools/ant/taskdefs/Redirector.java b/src/main/org/apache/tools/ant/taskdefs/Redirector.java index 09c44fd98..a3ee2f4cf 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Redirector.java +++ b/src/main/org/apache/tools/ant/taskdefs/Redirector.java @@ -67,7 +67,7 @@ import java.io.PrintStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; -import org.apache.tools.ant.util.DelayedFileOutputStream; +import org.apache.tools.ant.util.LazyFileOutputStream; import org.apache.tools.ant.util.StringUtils; import org.apache.tools.ant.util.TeeOutputStream; @@ -269,8 +269,7 @@ public class Redirector { errorStream = new LogOutputStream(managingTask, Project.MSG_WARN); } else { if (out != null) { - outputStream - = new DelayedFileOutputStream(out, append); + outputStream = new LazyFileOutputStream(out, append); managingTask.log("Output redirected to " + out, Project.MSG_VERBOSE); } @@ -296,8 +295,7 @@ public class Redirector { } if (error != null) { - errorStream - = new DelayedFileOutputStream(error, append); + errorStream = new LazyFileOutputStream(error, append); managingTask.log("Error redirected to " + error, Project.MSG_VERBOSE); } @@ -460,8 +458,18 @@ public class Redirector { if (inputStream != null) { inputStream.close(); } + + if (outputStream instanceof LazyFileOutputStream) { + ((LazyFileOutputStream) outputStream).open(); + } outputStream.close(); - errorStream.close(); + + if (errorStream != outputStream) { + if (errorStream instanceof LazyFileOutputStream) { + ((LazyFileOutputStream) errorStream).open(); + } + errorStream.close(); + } if (baos != null) { setPropertyFromBAOS(baos, outputProperty); diff --git a/src/main/org/apache/tools/ant/util/DelayedFileOutputStream.java b/src/main/org/apache/tools/ant/util/LazyFileOutputStream.java similarity index 94% rename from src/main/org/apache/tools/ant/util/DelayedFileOutputStream.java rename to src/main/org/apache/tools/ant/util/LazyFileOutputStream.java index bfbd56d17..7bd01a7bd 100644 --- a/src/main/org/apache/tools/ant/util/DelayedFileOutputStream.java +++ b/src/main/org/apache/tools/ant/util/LazyFileOutputStream.java @@ -65,7 +65,7 @@ import java.io.OutputStream; * * @since Ant 1.6 */ -public class DelayedFileOutputStream extends OutputStream { +public class LazyFileOutputStream extends OutputStream { private FileOutputStream fos; private File file; @@ -77,7 +77,7 @@ public class DelayedFileOutputStream extends OutputStream { * Creates a stream that will eventually write to the file with * the given name and replace it. */ - public DelayedFileOutputStream(String name) { + public LazyFileOutputStream(String name) { this(name, false); } @@ -86,7 +86,7 @@ public class DelayedFileOutputStream extends OutputStream { * the given name and optionally append to instead of replacing * it. */ - public DelayedFileOutputStream(String name, boolean append) { + public LazyFileOutputStream(String name, boolean append) { this(new File(name), append); } @@ -94,7 +94,7 @@ public class DelayedFileOutputStream extends OutputStream { * Creates a stream that will eventually write to the file with * the given name and replace it. */ - public DelayedFileOutputStream(File f) { + public LazyFileOutputStream(File f) { this(f, false); } @@ -103,7 +103,7 @@ public class DelayedFileOutputStream extends OutputStream { * the given name and optionally append to instead of replacing * it. */ - public DelayedFileOutputStream(File file, boolean append) { + public LazyFileOutputStream(File file, boolean append) { this.file = file; this.append = append; } diff --git a/src/testcases/org/apache/tools/ant/util/LazyFileOutputStreamTest.java b/src/testcases/org/apache/tools/ant/util/LazyFileOutputStreamTest.java new file mode 100644 index 000000000..df0720b44 --- /dev/null +++ b/src/testcases/org/apache/tools/ant/util/LazyFileOutputStreamTest.java @@ -0,0 +1,105 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "Ant" and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant.util; + +import java.io.File; +import java.io.IOException; +import junit.framework.TestCase; + +/** + * @since Ant 1.6 + */ +public class LazyFileOutputStreamTest extends TestCase { + private LazyFileOutputStream los; + private final static File f = new File("test.txt"); + + public LazyFileOutputStreamTest(String s) { + super(s); + } + + public void setUp() { + los = new LazyFileOutputStream(f); + } + + public void tearDown() throws IOException { + try { + los.close(); + } finally { + f.delete(); + } + } + + public void testNoFileWithoutWrite() throws IOException { + los.close(); + assertTrue(f + " has not been written.", !f.exists()); + } + + public void testOpen() throws IOException { + los.open(); + los.close(); + assertTrue(f + " has been written.", f.exists()); + } + + public void testSingleByte() throws IOException { + los.write(0); + los.close(); + assertTrue(f + " has been written.", f.exists()); + } + + public void testByteArray() throws IOException { + los.write(new byte[] {0}); + los.close(); + assertTrue(f + " has been written.", f.exists()); + } +}