conor       2003/02/08 23:59:53

  Modified:    src/main/org/apache/tools/ant Main.java Project.java
                        Task.java UnknownElement.java
               src/main/org/apache/tools/ant/taskdefs Ant.java
                        CallTarget.java Java.java Redirector.java
               src/main/org/apache/tools/ant/taskdefs/optional/junit
                        JUnitTask.java JUnitTestRunner.java
               src/testcases/org/apache/tools/ant/taskdefs
                        DemuxOutputTask.java
  Added:       src/main/org/apache/tools/ant DemuxInputStream.java
  Log:
  Input handling framework
  
  Non-forked Java tasks can now have their input redirected.
  
  Note that it would be possible to add a noninteractive flag to
  Ant preventing any input from System.in in any java classes
  druing a build. Would prevent locking up waiting for input
  
  Revision  Changes    Path
  1.78      +8 -7      jakarta-ant/src/main/org/apache/tools/ant/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Main.java,v
  retrieving revision 1.77
  retrieving revision 1.78
  diff -u -w -u -r1.77 -r1.78
  --- Main.java 23 Jan 2003 16:33:24 -0000      1.77
  +++ Main.java 9 Feb 2003 07:59:52 -0000       1.78
  @@ -572,6 +572,8 @@
                   //System.setSecurityManager(new NoExitSecurityManager());
               }
               try {
  +                project.setDefaultInputStream(System.in);
  +                System.setIn(new DemuxInputStream(project));
                   System.setOut(new PrintStream(new DemuxOutputStream(project, 
false)));
                   System.setErr(new PrintStream(new DemuxOutputStream(project, 
true)));
   
  @@ -662,7 +664,7 @@
        * @exception BuildException if a specified InputHandler
        *                           implementation could not be loaded.
        */
  -    private void addInputHandler(Project project) {
  +    private void addInputHandler(Project project) throws BuildException {
           InputHandler handler = null;
           if (inputHandlerClassname == null) {
               handler = new DefaultInputHandler();
  @@ -675,8 +677,7 @@
                       + inputHandlerClassname
                       + " does not implement the InputHandler interface";
                   throw new BuildException(msg);
  -            }
  -            catch (Exception e) {
  +            } catch (Exception e) {
                   String msg = "Unable to instantiate specified input handler "
                       + "class " + inputHandlerClassname + " : "
                       + e.getClass().getName();
  
  
  
  1.128     +139 -57   jakarta-ant/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Project.java,v
  retrieving revision 1.127
  retrieving revision 1.128
  diff -u -w -u -r1.127 -r1.128
  --- Project.java      31 Jan 2003 07:57:41 -0000      1.127
  +++ Project.java      9 Feb 2003 07:59:52 -0000       1.128
  @@ -90,7 +90,6 @@
    */
   
   public class Project {
  -
       /** Message priority of "error". */
       public static final int MSG_ERR = 0;
       /** Message priority of "warning". */
  @@ -114,6 +113,13 @@
       private static final String VISITED = "VISITED";
   
       /**
  +     * The class name of the Ant class loader to use for 
  +     * JDK 1.2 and above
  +     */
  +    private static final String ANTCLASSLOADER_JDK12
  +        = "org.apache.tools.ant.loader.AntClassLoader2";
  +    
  +    /**
        * Version constant for Java 1.0
        *
        * @deprecated use org.apache.tools.ant.util.JavaEnvUtils instead
  @@ -205,14 +211,36 @@
       private InputHandler inputHandler = null;
   
       /**
  +     * The default input stream used to read any input
  +     */
  +    private InputStream defaultInputStream = null;
  +    
  +    /**
        * Sets the input handler
  +     * 
  +     * @param handler the InputHandler instance to use for gathering input.
        */
       public void setInputHandler(InputHandler handler) {
           inputHandler = handler;
       }
   
       /**
  +     * Set the default System input stream. Normally this stream is set to 
  +     * System.in. This inputStream is used when no task inptu redirection is
  +     * being performed.
  +     *
  +     * @param defaultInputStream the default input stream to use when input 
  +     *        is reuested.
  +     */
  +    public void setDefaultInputStream(InputStream defaultInputStream) {
  +        this.defaultInputStream = defaultInputStream;
  +    }
  +    
  +    /**
        * Retrieves the current input handler.
  +     *
  +     * @return the InputHandler instance currently in place for the project 
  +     *         instance.
        */
       public InputHandler getInputHandler() {
           return inputHandler;
  @@ -278,13 +306,18 @@
           setSystemProperties();
       }
   
  +    /**
  +     * Factory method to create a class loader for loading classes
  +     *
  +     * @return an appropriate classloader
  +     */
       private AntClassLoader createClassLoader() {
           AntClassLoader loader = null;
           if (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
               try {
                   // 1.2+ - create advanced helper dynamically
                   Class loaderClass
  -                    = 
Class.forName("org.apache.tools.ant.loader.AntClassLoader2");
  +                    = Class.forName(ANTCLASSLOADER_JDK12);
                   loader = (AntClassLoader) loaderClass.newInstance();
               } catch (Exception e) {
                       log("Unable to create Class Loader: "
  @@ -300,6 +333,14 @@
           return loader;
       }
   
  +    /**
  +     * Factory method to create a class loader for loading classes from
  +     * a given path
  +     *
  +     * @param path the path from whcih clases are to be loaded.
  +     * 
  +     * @return an appropriate classloader
  +     */
       public AntClassLoader createClassLoader(Path path) {
           AntClassLoader loader = createClassLoader();
           loader.setClassPath(path);
  @@ -434,7 +475,8 @@
        * @since 1.5
        */
       public synchronized void setNewProperty(String name, String value) {
  -        PropertyHelper.getPropertyHelper(this).setNewProperty( null, name, 
value);
  +        PropertyHelper.getPropertyHelper(this).setNewProperty(null, name, 
  +                                                              value);
       }
   
       /**
  @@ -447,7 +489,8 @@
        * @see #setProperty(String,String)
        */
       public synchronized void setUserProperty(String name, String value) {
  -        PropertyHelper.getPropertyHelper(this).setUserProperty( null, name, 
value);
  +        PropertyHelper.getPropertyHelper(this).setUserProperty(null, name, 
  +                                                               value);
       }
   
       /**
  @@ -509,8 +552,7 @@
        *                           property name, e.g. <code>${xxx</code>
        */
       public String replaceProperties(String value)
  -        throws BuildException
  -    {
  +        throws BuildException {
           PropertyHelper ph=PropertyHelper.getPropertyHelper(this);
           return ph.replaceProperties(null, value, null);
       }
  @@ -1241,6 +1283,48 @@
       }
   
       /**
  +     * Read data from the default input stream. If no default has been 
  +     * specified, System.in is used. 
  +     *
  +     * @param buffer the buffer into which data is to be read.
  +     * @param offset the offset into the buffer at which data is stored.
  +     * @param length the amount of data to read
  +     *
  +     * @return the number of bytes read
  +     * 
  +     * @exception IOException if the data cannot be read
  +     */
  +    public int defaultInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (defaultInputStream != null) {
  +            return defaultInputStream.read(buffer, offset, length);
  +        } else {
  +            return System.in.read(buffer, offset, length);
  +        }
  +    }
  +    
  +    /**
  +     * Demux an input request to the correct task.
  +     *
  +     * @param buffer the buffer into which data is to be read.
  +     * @param offset the offset into the buffer at which data is stored.
  +     * @param length the amount of data to read
  +     *
  +     * @return the number of bytes read
  +     * 
  +     * @exception IOException if the data cannot be read
  +     */     
  +    public int demuxInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        Task task = (Task) threadTasks.get(Thread.currentThread());
  +        if (task == null) {
  +            return defaultInput(buffer, offset, length);
  +        } else {
  +            return task.handleInput(buffer, offset, length);
  +        }
  +    }
  +    
  +    /**
        * Demultiplexes flush operation so that each task receives the 
appropriate
        * messages. If the current thread is not currently executing a task,
        * the message is logged directly.
  @@ -1250,8 +1334,6 @@
        * @param line Message to handle. Should not be <code>null</code>.
        * @param isError Whether the text represents an error 
(<code>true</code>)
        *        or information (<code>false</code>).
  -     * @param terminated true if this line should be terminated with an 
  -     *        end-of-line marker
        */
       public void demuxFlush(String line, boolean isError) {
           Task task = (Task) threadTasks.get(Thread.currentThread());
  
  
  
  1.39      +20 -0     jakarta-ant/src/main/org/apache/tools/ant/Task.java
  
  Index: Task.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Task.java,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -u -w -u -r1.38 -r1.39
  --- Task.java 31 Jan 2003 07:57:41 -0000      1.38
  +++ Task.java 9 Feb 2003 07:59:52 -0000       1.39
  @@ -55,6 +55,7 @@
   package org.apache.tools.ant;
   
   import java.util.Enumeration;
  +import java.io.IOException;
   
   /**
    * Base class for all tasks.
  @@ -313,6 +314,22 @@
       }
   
       /**
  +     * Handle an input request by this task
  +     *
  +     * @param buffer the buffer into which data is to be read.
  +     * @param offset the offset into the buffer at which data is stored.
  +     * @param length the amount of data to read
  +     *
  +     * @return the number of bytes read
  +     * 
  +     * @exception IOException if the data cannot be read
  +     */
  +    protected int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        return getProject().defaultInput(buffer, offset, length);
  +    }
  +    
  +    /**
        * Handles an error line by logging it with the INFO priority.
        *
        * @param line The error line to log. Should not be <code>null</code>.
  @@ -396,6 +413,9 @@
   
       /**
        * Has this task been marked invalid?
  +     *
  +     * @return true if this task is no longer valid. A new task should be 
  +     * configured in this case.
        *
        * @since Ant 1.5
        */
  
  
  
  1.37      +31 -10    
jakarta-ant/src/main/org/apache/tools/ant/UnknownElement.java
  
  Index: UnknownElement.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/UnknownElement.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -w -u -r1.36 -r1.37
  --- UnknownElement.java       31 Jan 2003 07:57:41 -0000      1.36
  +++ UnknownElement.java       9 Feb 2003 07:59:52 -0000       1.37
  @@ -55,6 +55,7 @@
   package org.apache.tools.ant;
   
   import java.util.Vector;
  +import java.io.IOException;
   
   /**
    * Wrapper class that holds all the information necessary to create a task
  @@ -157,6 +158,26 @@
       }
   
       /**
  +     * Handle an input request by this element
  +     *
  +     * @param buffer the buffer into which data is to be read.
  +     * @param offset the offset into the buffer at which data is stored.
  +     * @param length the amount of data to read
  +     *
  +     * @return the number of bytes read
  +     * 
  +     * @exception IOException if the data cannot be read
  +     */
  +    protected int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (realThing instanceof Task) {
  +            return ((Task) realThing).handleInput(buffer, offset, length);
  +        } else {
  +            return super.handleInput(buffer, offset, length);
  +        }
  +            
  +    }
  +    /**
        * Handles output sent to System.out by this task or its real task.
        *
        * @param line The line of output to log. Should not be 
<code>null</code>.
  @@ -241,8 +262,7 @@
        */
       protected void handleChildren(Object parent,
                                     RuntimeConfigurable parentWrapper)
  -        throws BuildException
  -    {
  +        throws BuildException {
           if (parent instanceof TaskAdapter) {
               parent = ((TaskAdapter) parent).getProxy();
           }
  @@ -277,7 +297,8 @@
                       // What ? Add data type ? createElement ?
                   }
               } else {
  -                realChild = ih.createElement(getProject(), parent, 
child.getTag());
  +                realChild 
  +                    = ih.createElement(getProject(), parent, child.getTag());
               }
   
               childWrapper.setProxy(realChild);
  
  
  
  1.1                  
jakarta-ant/src/main/org/apache/tools/ant/DemuxInputStream.java
  
  Index: DemuxInputStream.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 "The Jakarta Project", "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 [EMAIL PROTECTED]
   *
   * 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;
  
  import java.io.IOException;
  import java.io.InputStream;
  
  /**
   *
   * Passes input requests tot he project objetc for demuxing into 
   * individual tasks and threads.
   *
   * @since Ant 1.6
   * @author Conor MacNeill
   */
  public class DemuxInputStream extends InputStream {
  
      /**
       * The project to from which to get input.
       */
      private Project project;
      
      /**
       * Create a DemuxInputStream for the given project
       *
       * @param project the project instance
       */
      public DemuxInputStream(Project project) {
          this.project = project;
      }
  
      /**
       * @see InputStream.read()
       */
      public int read() throws IOException {
          byte[] buffer = new byte[1];
          project.demuxInput(buffer, 0, 1);
          return buffer[0];
      }
      
  
      /**
       * @see InputStream.read(byte[], int, int)
       */
      public int read(byte[] buffer, int offset, int length) throws IOException 
{
          return project.demuxInput(buffer, offset, length);
      }
  }
  
  
  
  1.73      +14 -1     
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Ant.java
  
  Index: Ant.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Ant.java,v
  retrieving revision 1.72
  retrieving revision 1.73
  diff -u -w -u -r1.72 -r1.73
  --- Ant.java  31 Jan 2003 07:57:41 -0000      1.72
  +++ Ant.java  9 Feb 2003 07:59:53 -0000       1.73
  @@ -297,6 +297,18 @@
       }
   
       /**
  +     * @see Task#handleInput(byte[], int, int)
  +     */
  +    public int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (newProject != null) {
  +            return newProject.demuxInput(buffer, offset, length);
  +        } else {
  +            return super.handleInput(buffer, offset, length);
  +        }
  +    }
  +    
  +    /**
        * Pass output sent to System.out to the new project.
        *
        * @since Ant 1.5.2
  @@ -443,7 +455,8 @@
        * requested.
        */
       private void addReferences() throws BuildException {
  -        Hashtable thisReferences = (Hashtable) 
getProject().getReferences().clone();
  +        Hashtable thisReferences 
  +            = (Hashtable) getProject().getReferences().clone();
           Hashtable newReferences = newProject.getReferences();
           Enumeration e;
           if (references.size() > 0) {
  
  
  
  1.29      +10 -0     
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java
  
  Index: CallTarget.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -w -u -r1.28 -r1.29
  --- CallTarget.java   31 Jan 2003 07:57:41 -0000      1.28
  +++ CallTarget.java   9 Feb 2003 07:59:53 -0000       1.29
  @@ -56,6 +56,7 @@
   
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.Task;
  +import java.io.IOException;
   
   /**
    * Call another target in the same project.
  @@ -185,6 +186,15 @@
           }
       }
       
  +    public int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (callee != null) {
  +            return callee.handleInput(buffer, offset, length);
  +        } else {
  +            return super.handleInput(buffer, offset, length);
  +        }
  +    }
  +
       /**
        * Pass output sent to System.out to the new project.
        *
  
  
  
  1.54      +9 -0      
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Java.java
  
  Index: Java.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Java.java,v
  retrieving revision 1.53
  retrieving revision 1.54
  diff -u -w -u -r1.53 -r1.54
  --- Java.java 8 Feb 2003 14:14:27 -0000       1.53
  +++ Java.java 9 Feb 2003 07:59:53 -0000       1.54
  @@ -416,6 +416,15 @@
           }
       }
       
  +    public int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (redirector.getInputStream() != null) {
  +            return redirector.handleInput(buffer, offset, length);
  +        } else {
  +            return super.handleInput(buffer, offset, length);
  +        }
  +    }
  +
       /**
        * Pass output sent to System.out to specified output file.
        *
  
  
  
  1.2       +146 -6    
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java
  
  Index: Redirector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -w -u -r1.1 -r1.2
  --- Redirector.java   8 Feb 2003 14:14:27 -0000       1.1
  +++ Redirector.java   9 Feb 2003 07:59:53 -0000       1.2
  @@ -79,37 +79,92 @@
    * @since Ant 1.6
    */
   public class Redirector {
  +    /** 
  +     * The file receiveing standard output. Will also receive standard error
  +     * unless standard error is redirected or logError is true.
  +     */
       private File out;
  +    
  +    /**
  +     * The file to which standard error is being redirected 
  +     */
       private File error;
  +    
  +    /** 
  +     * The file from which standard input is being taken.
  +     */
       private File input;
   
  +    /** 
  +      * Indicates if standard error should be logged to Ant's log system
  +      * rather than the output. This has no effect if standard error is 
  +      * redirected to a file or property.
  +      */
       private boolean logError = false;
  +    
  +    /**
  +     * Buffer used to capture output for storage into a property
  +     */
       private ByteArrayOutputStream baos = null;
  +    
  +    /**
  +     * Buffer used to capture error output for storage into a property
  +     */
       private ByteArrayOutputStream errorBaos = null;
  +    
  +    /** The name of the property into which output is to be stored */
       private String outputProperty;
  +    
  +    /** The name of the property into which error output is to be stored */
       private String errorProperty;
  +    
  +    /** String from which input is taken */
       private String inputString;
  +    
  +    /** Flag which indicates if error and output files are to be appended. */
       private boolean append = false;
       
  +    /** The task for which this redirector is working */ 
       private Task managingTask;
   
  +    /** The stream for output data */
       private OutputStream outputStream = null;
  +    
  +    /** The stream for error output */
       private OutputStream errorStream = null;
  +    
  +    /** The stream for input */
       private InputStream inputStream = null; 
  +    
  +    /** Stream which are used for line oriented output */ 
       private PrintStream outPrintStream = null;
  +    
  +    /** Stream which is used for line oriented error output */
       private PrintStream errorPrintStream = null;
       
  +    /**
  +     * Create a redirector instance for the given task
  +     *
  +     * @param managingTask the task for which the redirector is to work
  +     */
       public Redirector(Task managingTask) {
           this.managingTask = managingTask;
       }
       
       /**
        * Set the input to use for the task
  +     *
  +     * @param input the file from which input is read.
        */
       public void setInput(File input) {
           this.input = input;
       }
   
  +    /**
  +     * Set the string to use as input
  +     *
  +     * @param inputString the string which is used as the input source
  +     */
       public void setInputString(String inputString) {
           this.inputString = inputString;
       }
  @@ -118,6 +173,8 @@
       /**
        * File the output of the process is redirected to. If error is not 
        * redirected, it too will appear in the output
  +     *
  +     * @param out the file to which output stream is written
        */
       public void setOutput(File out) {
           this.out = out;
  @@ -127,14 +184,18 @@
        * Controls whether error output of exec is logged. This is only useful
        * when output is being redirected and error output is desired in the
        * Ant log
  +     *
  +     * @param logError if true the standard error is sent to the Ant log 
system
  +     *        and not sent to output.
        */
       public void setLogError(boolean logError) {
           this.logError = logError;
       }
       
       /**
  -     * File the error stream of the process is redirected to.
  +     * Set the file to which standard error is to be redirected.
        *
  +     * @param error the file to which error is to be written
        */
       public void setError(File error) {
           this.error = error;
  @@ -143,6 +204,9 @@
       /**
        * Property name whose value should be set to the output of
        * the process.
  +     *
  +     * @param outputProperty the name of the property to be set with the 
  +     *        task's output.
        */
       public void setOutputProperty(String outputProperty) {
           this.outputProperty = outputProperty;
  @@ -152,6 +216,8 @@
        * Whether output should be appended to or overwrite an existing file.
        * Defaults to false.
        *
  +     * @param append if true output and error streams are appended to their
  +     *        respective files, if specified.
        */
       public void setAppend(boolean append) {
           this.append = append;
  @@ -161,11 +227,21 @@
        * Property name whose value should be set to the error of
        * the process.
        *
  +     * @param errorProperty the name of the property to be set 
  +     *        with the error output.
        */
       public void setErrorProperty(String errorProperty) {
           this.errorProperty = errorProperty;
       }
   
  +    /**
  +     * Set a property from a ByteArrayOutputStream
  +     *
  +     * @param baos contains the property value.
  +     * @param propertyName the property name.
  +     *
  +     * @exception IOException if the value cannot be read form the stream.
  +     */
       private void setPropertyFromBAOS(ByteArrayOutputStream baos, 
                                        String propertyName) throws IOException 
{
       
  @@ -183,6 +259,10 @@
       }
       
   
  +    /**
  +     * Create the input, error and output streams based on the 
  +     * configuration options.
  +     */
       public void createStreams() {        
           if (out == null && outputProperty == null) {
               outputStream = new LogOutputStream(managingTask, 
Project.MSG_INFO);
  @@ -265,6 +345,11 @@
       
       /**
        * Create the StreamHandler to use with our Execute instance.
  +     *
  +     * @return the execute stream handler to manage the input, output and
  +     * error streams.
  +     * 
  +     * @throws BuildException if the execute stream handler cannot be 
created.
        */
       public ExecuteStreamHandler createHandler() throws BuildException {
           createStreams();
  @@ -272,8 +357,9 @@
       }
      
       /**
  -     * Pass output sent to System.out to specified output file.
  +     * Pass output sent to System.out to specified output.
        *
  +     * @param line the data to be output
        */
       protected void handleOutput(String line) {
           if (outPrintStream == null) {
  @@ -283,8 +369,30 @@
       }
       
       /**
  -     * Pass output sent to System.out to specified output file.
  +     * Handle an input request
  +     *
  +     * @param buffer the buffer into which data is to be read.
  +     * @param offset the offset into the buffer at which data is stored.
  +     * @param length the amount of data to read
  +     *
  +     * @return the number of bytes read
  +     * 
  +     * @exception IOException if the data cannot be read
  +     */
  +    protected int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (inputStream == null) {
  +            return managingTask.getProject().defaultInput(buffer, offset, 
  +                                                          length);
  +        } else {
  +            return inputStream.read(buffer, offset, length);
  +        }            
  +    }
  +    
  +    /**
  +     * Process data due to a flush operation.
        *
  +     * @param line the data being flushed.
        */
       protected void handleFlush(String line) {
           if (outPrintStream == null) {
  @@ -294,8 +402,9 @@
       }
       
       /**
  -     * Pass output sent to System.err to specified output file.
  +     * Process error output
        *
  +     * @param line the error output data.
        */
       protected void handleErrorOutput(String line) {
           if (errorPrintStream == null) {
  @@ -305,8 +414,9 @@
       }
       
       /**
  -     * Pass output sent to System.err to specified output file.
  +     * Handle a flush operation on the error stream
        *
  +     * @param line the error information being flushed.
        */
       protected void handleErrorFlush(String line) {
           if (errorPrintStream == null) {
  @@ -315,15 +425,45 @@
           errorPrintStream.print(line);
       }
   
  +    /**
  +     * Get the output stream for the redirector
  +     *
  +     * @return the redirector's output stream or null if no output 
  +     *         has been configured
  +     */
       public OutputStream getOutputStream() {
           return outputStream;
       }
       
  +    /**
  +     * Get the error stream for the redirector
  +     *
  +     * @return the redirector's error stream or null if no output 
  +     *         has been configured
  +     */
       public OutputStream getErrorStream() {
           return errorStream;
       }
   
  +    /**
  +     * Get the input stream for the redirector
  +     *
  +     * @return the redirector's input stream or null if no output 
  +     *         has been configured
  +     */
  +    public InputStream getInputStream() {
  +        return inputStream;
  +    }
       
  +    /**
  +     * Complete redirection. 
  +     *
  +     * This opertaion will close any streams and create any specified
  +     * property values.
  +     *
  +     * @throws IOException if the outptu properties cannot be read from their
  +     * output streams.
  +     */
       public void complete() throws IOException {
           System.out.flush();
           System.err.flush();
  
  
  
  1.56      +16 -1     
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
  
  Index: JUnitTask.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java,v
  retrieving revision 1.55
  retrieving revision 1.56
  diff -u -w -u -r1.55 -r1.56
  --- JUnitTask.java    31 Jan 2003 07:57:41 -0000      1.55
  +++ JUnitTask.java    9 Feb 2003 07:59:53 -0000       1.56
  @@ -714,6 +714,21 @@
       }
   
       /**
  +     * @see Task#handleInput(byte[], int, int)
  +     * 
  +     * @since Ant 1.6
  +     */
  +    protected int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        if (runner != null) {
  +            return runner.handleInput(buffer, offset, length);
  +        } else {
  +            return super.handleInput(buffer, offset, length);
  +        }
  +    }
  +    
  +    
  +    /**
        * Pass output sent to System.out to the TestRunner so it can
        * collect ot for the formatters.
        *
  
  
  
  1.30      +5 -0      
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
  
  Index: JUnitTestRunner.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -w -u -r1.29 -r1.30
  --- JUnitTestRunner.java      31 Jan 2003 07:57:42 -0000      1.29
  +++ JUnitTestRunner.java      9 Feb 2003 07:59:53 -0000       1.30
  @@ -410,6 +410,11 @@
           }
       }
       
  +    protected int handleInput(byte[] buffer, int offset, int length) 
  +        throws IOException {
  +        return -1;
  +    }
  +    
       protected void handleErrorOutput(String line) {
           if (systemError != null) {
               systemError.println(line);
  
  
  
  1.4       +2 -1      
jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/DemuxOutputTask.java
  
  Index: DemuxOutputTask.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-ant/src/testcases/org/apache/tools/ant/taskdefs/DemuxOutputTask.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -u -r1.3 -r1.4
  --- DemuxOutputTask.java      25 Feb 2002 04:33:25 -0000      1.3
  +++ DemuxOutputTask.java      9 Feb 2003 07:59:53 -0000       1.4
  @@ -56,9 +56,10 @@
   import org.apache.tools.ant.*;
   import org.apache.tools.ant.BuildFileTest;
   import java.util.Random;
  +
   /**
    * A simple task that prints to System.out and System.err and then catches
  - * the output which it then check. If the output does not match, an
  + * the output which it then checks. If the output does not match, an
    * exception is thrown
    *
    * @since 1.5
  
  
  

Reply via email to