ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bode...@apache.org
Subject cvs commit: ant/src/main/org/apache/tools/ant/util DelayedFileOutputStream.java
Date Tue, 26 Aug 2003 12:32:58 GMT
bodewig     2003/08/26 05:32:57

  Modified:    src/main/org/apache/tools/ant/taskdefs Redirector.java
  Added:       src/main/org/apache/tools/ant/util
                        DelayedFileOutputStream.java
  Log:
  Don't open the file used for <exec output="file"> and friends before
  it gets actually written.
  
  Needed to fix PR: 13652
  
  Revision  Changes    Path
  1.8       +4 -16     ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java
  
  Index: Redirector.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- Redirector.java	17 Jul 2003 10:20:15 -0000	1.7
  +++ Redirector.java	26 Aug 2003 12:32:57 -0000	1.8
  @@ -57,9 +57,8 @@
   import java.io.ByteArrayOutputStream;
   import java.io.ByteArrayInputStream;
   import java.io.File;
  -import java.io.FileNotFoundException;
  -import java.io.FileOutputStream;
   import java.io.FileInputStream;
  +import java.io.FileNotFoundException;
   import java.io.IOException;
   import java.io.StringReader;
   import java.io.OutputStream;
  @@ -68,6 +67,7 @@
   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.StringUtils;
   import org.apache.tools.ant.util.TeeOutputStream;
   
  @@ -269,16 +269,10 @@
               errorStream = new LogOutputStream(managingTask, Project.MSG_WARN);
           } else {
               if (out != null)  {
  -                try {
                       outputStream
  -                        = new FileOutputStream(out.getAbsolutePath(), append);
  +                        = new DelayedFileOutputStream(out, append);
                       managingTask.log("Output redirected to " + out,
                                        Project.MSG_VERBOSE);
  -                } catch (FileNotFoundException fne) {
  -                    throw new BuildException("Cannot write to " + out, fne);
  -                } catch (IOException ioe) {
  -                    throw new BuildException("Cannot write to " + out, ioe);
  -                }
               }
   
               if (outputProperty != null) {
  @@ -302,16 +296,10 @@
           }
   
           if (error != null)  {
  -            try {
                   errorStream
  -                    = new FileOutputStream(error.getAbsolutePath(), append);
  +                    = new DelayedFileOutputStream(error, append);
                   managingTask.log("Error redirected to " + error,
                       Project.MSG_VERBOSE);
  -            } catch (FileNotFoundException fne) {
  -                throw new BuildException("Cannot write to " + error, fne);
  -            } catch (IOException ioe) {
  -                throw new BuildException("Cannot write to " + error, ioe);
  -            }
           }
   
           if (errorProperty != null) {
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/util/DelayedFileOutputStream.java
  
  Index: DelayedFileOutputStream.java
  ===================================================================
  /*
   * 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
   * <http://www.apache.org/>.
   */
  package org.apache.tools.ant.util;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.OutputStream;
  
  /**
   * Class that delays opening the output file until the first bytes
   * shall be written or the method {@link #open open} has been invoked
   * explicitly.
   *
   * @since Ant 1.6
   */
  public class DelayedFileOutputStream extends OutputStream {
  
      private FileOutputStream fos;
      private File file;
      private boolean append;
      private boolean opened = false;
      private boolean closed = false;
  
      /**
       * Creates a stream that will eventually write to the file with
       * the given name and replace it.
       */
      public DelayedFileOutputStream(String name) {
          this(name, false);
      }
  
      /**
       * Creates a stream that will eventually write to the file with
       * the given name and optionally append to instead of replacing
       * it.
       */
      public DelayedFileOutputStream(String name, boolean append) {
          this(new File(name), append);
      }
  
      /**
       * Creates a stream that will eventually write to the file with
       * the given name and replace it.
       */
      public DelayedFileOutputStream(File f) {
          this(f, false);
      }
  
      /**
       * Creates a stream that will eventually write to the file with
       * the given name and optionally append to instead of replacing
       * it.
       */
      public DelayedFileOutputStream(File file, boolean append) {
          this.file = file;
          this.append = append;
      }
  
      /**
       * Explicitly open the file for writing.
       *
       * <p>Returns silently if the file has already been opened.</p>
       */
      public void open() throws IOException {
          ensureOpened();
      }
  
      public synchronized void close() throws IOException {
          if (opened) {
              fos.close();
          }
          closed = true;
      }
  
      /**
       * Delegates to the three arg version.
       */
      public void write(byte[] b) throws IOException {
          write(b, 0, b.length);
      }
  
      public synchronized void write(byte[] b, int offset, int len) 
          throws IOException {
          ensureOpened();
          fos.write(b, offset, len);
      }
  
      public synchronized void write(int b) throws IOException {
          ensureOpened();
          fos.write(b);
      }
  
      private synchronized void ensureOpened() throws IOException {
          if (closed) {
              throw new IOException(file + " has already been closed.");
          }
  
          if (!opened) {
              fos = new FileOutputStream(file.getAbsolutePath(), append);
              opened = true;
          }
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message