jglick      2005/01/27 08:36:11

  Modified:    .        WHATSNEW
               docs/manual/CoreTasks java.html
               src/main/org/apache/tools/ant/taskdefs Java.java
                        PumpStreamHandler.java Redirector.java
                        StreamPumper.java
  Log:
  Permit <java fork="true"> to accept standard input from console.
  PR: 24918
  
  Revision  Changes    Path
  1.731     +4 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.730
  retrieving revision 1.731
  diff -u -r1.730 -r1.731
  --- WHATSNEW  27 Jan 2005 12:42:09 -0000      1.730
  +++ WHATSNEW  27 Jan 2005 16:36:11 -0000      1.731
  @@ -24,6 +24,10 @@
   Fixed bugs:
   -----------
   
  +* Programs run with <java fork="true"> can now accept standard input
  +  from the Ant console.  (Programs run with <java fork="false"> could
  +  already do so.)  Bugzilla Report 24918.
  +
   * Translate task does not remove tokens when a key is not found.
     It logs a verbose message.  Bugzilla Report 13936.
   
  
  
  
  1.36      +7 -7      ant/docs/manual/CoreTasks/java.html
  
  Index: java.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/java.html,v
  retrieving revision 1.35
  retrieving revision 1.36
  diff -u -r1.35 -r1.36
  --- java.html 10 Jan 2005 10:59:31 -0000      1.35
  +++ java.html 27 Jan 2005 16:36:11 -0000      1.36
  @@ -15,10 +15,9 @@
   If odd things go wrong when you run this task, set fork="true" to use a new
   JVM.
   
  -<p>Note that you cannot interact with a forked VM, the only way to
  -send input to it is via the input and inputstring attributes. Also note that
  -in Ant 1.6, any attempt to read input in the forked VM will receive an
  -EOF (-1). This is a change from Ant 1.5, where such an attempt would 
block.</p>
  +<p>As of Ant 1.7, you can interact with a forked VM, as well as
  +sending input to it via the <code>input</code> and <code>inputstring</code>
  +attributes.</p>
   
   <h3>Parameters</h3>
   <table border="1" cellpadding="2" cellspacing="0">
  @@ -157,14 +156,16 @@
       <td valign="top">A file from which the executed command's standard input
                        is taken. This attribute is mutually exclusive with the
                        inputstring attribute</td>
  -    <td align="center" valign="top">No</td>
  +    <td align="center" valign="top">No; default is to take standard input 
from console
  +        (unless <code>spawn="true"</code>)</td>
     </tr>
     <tr>
       <td valign="top">inputstring</td>
       <td valign="top">A string which serves as the input stream for the
                        executed command. This attribute is mutually exclusive 
with the
                        input attribute.</td>
  -    <td align="center" valign="top">No</td>
  +    <td align="center" valign="top">No; default is to take standard input 
from console
  +        (unless <code>spawn="true"</code>)</td>
     </tr>
     <tr>
       <td valign="top">newenvironment</td>
  @@ -353,4 +354,3 @@
   
   </body>
   </html>
  -
  
  
  
  1.97      +8 -6      ant/src/main/org/apache/tools/ant/taskdefs/Java.java
  
  Index: Java.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Java.java,v
  retrieving revision 1.96
  retrieving revision 1.97
  diff -u -r1.96 -r1.97
  --- Java.java 22 Nov 2004 09:23:27 -0000      1.96
  +++ Java.java 27 Jan 2005 16:36:11 -0000      1.97
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2000-2004 The Apache Software Foundation
  + * Copyright  2000-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -37,6 +37,7 @@
   import org.apache.tools.ant.types.RedirectorElement;
   import org.apache.tools.ant.taskdefs.condition.Os;
   import org.apache.tools.ant.util.JavaEnvUtils;
  +import org.apache.tools.ant.util.KeepAliveInputStream;
   
   /**
    * Launcher for Java applications. Allows use of
  @@ -639,11 +640,8 @@
        */
       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);
  -        }
  +        // Should work whether or not redirector.inputStream == null:
  +        return redirector.handleInput(buffer, offset, length);
       }
   
       /**
  @@ -702,6 +700,10 @@
           if (redirectorElement != null) {
               redirectorElement.configure(redirector);
           }
  +        if (!spawn && input == null && inputString == null) {
  +            // #24918: send standard input to the process by default.
  +            redirector.setInputStream(new 
KeepAliveInputStream(getProject().getDefaultInputStream()));
  +        }
       }
   
       /**
  
  
  
  1.21      +20 -10    
ant/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java
  
  Index: PumpStreamHandler.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- PumpStreamHandler.java    14 Apr 2004 15:42:06 -0000      1.20
  +++ PumpStreamHandler.java    27 Jan 2005 16:36:11 -0000      1.21
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2000-2004 The Apache Software Foundation
  + * Copyright  2000-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -31,7 +31,7 @@
   
       private Thread outputThread;
       private Thread errorThread;
  -    private Thread inputThread;
  +    private StreamPumper inputPump;
   
       private OutputStream out;
       private OutputStream err;
  @@ -101,7 +101,7 @@
        */
       public void setProcessInputStream(OutputStream os) {
           if (input != null) {
  -            inputThread = createPump(input, os, true);
  +            inputPump = createInputPump(input, os, true);
           } else {
               try {
                   os.close();
  @@ -117,7 +117,9 @@
       public void start() {
           outputThread.start();
           errorThread.start();
  -        if (inputThread != null) {
  +        if (inputPump != null) {
  +            Thread inputThread = new Thread(inputPump);
  +            inputThread.setDaemon(true);
               inputThread.start();
           }
       }
  @@ -137,12 +139,8 @@
               // ignore
           }
   
  -        if (inputThread != null) {
  -            try {
  -                inputThread.join();
  -            } catch (InterruptedException e) {
  -                // ignore
  -            }
  +        if (inputPump != null) {
  +            inputPump.stop();
           }
   
           try {
  @@ -210,5 +208,17 @@
           result.setDaemon(true);
           return result;
       }
  +    
  +    /**
  +     * Creates a stream pumper to copy the given input stream to the
  +     * given output stream. Used for standard input.
  +     * @since Ant 1.7
  +     */
  +    /*protected*/ StreamPumper createInputPump(InputStream is, OutputStream 
os,
  +                                boolean closeWhenExhausted) {
  +        StreamPumper pumper = new StreamPumper(is, os, closeWhenExhausted);
  +        pumper.setAutoflush(true);
  +        return pumper;
  +    }
   
   }
  
  
  
  1.24      +10 -1     
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.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- Redirector.java   6 Jan 2005 17:29:39 -0000       1.23
  +++ Redirector.java   27 Jan 2005 16:36:11 -0000      1.24
  @@ -202,6 +202,15 @@
           this.inputString = inputString;
       }
   
  +    /**
  +     * Set a stream to use as input.
  +     *
  +     * @param inputStream the stream from which input will be read
  +     * @since Ant 1.7
  +     */
  +    /*public*/ void setInputStream(InputStream inputStream) {
  +        this.inputStream = inputStream;
  +    }
   
       /**
        * File the output of the process is redirected to. If error is not
  @@ -543,7 +552,7 @@
               }
           }
   
  -        // if input files are specified, inputString is ignored;
  +        // if input files are specified, inputString and inputStream are 
ignored;
           // classes that work with redirector attributes can enforce
           // whatever warnings are needed
           if (input != null && input.length > 0) {
  
  
  
  1.21      +27 -2     
ant/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java
  
  Index: StreamPumper.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/StreamPumper.java,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- StreamPumper.java 9 Mar 2004 16:48:06 -0000       1.20
  +++ StreamPumper.java 27 Jan 2005 16:36:11 -0000      1.21
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2000,2002-2004 The Apache Software Foundation
  + * Copyright  2000,2002-2005 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -36,6 +36,7 @@
       private OutputStream os;
       private boolean finished;
       private boolean closeWhenExhausted;
  +    private boolean autoflush = false;
   
       /**
        * Create a new stream pumper.
  @@ -62,6 +63,14 @@
           this(is, os, false);
       }
   
  +    /**
  +     * Set whether data should be flushed through to the output stream.
  +     * @param autoflush if true, push through data; if false, let it be 
buffered
  +     * @since Ant 1.7
  +     */
  +    /*public*/ void setAutoflush(boolean autoflush) {
  +        this.autoflush = autoflush;
  +    }
   
       /**
        * Copies data from the input stream to the output stream.
  @@ -78,8 +87,11 @@
   
           int length;
           try {
  -            while ((length = is.read(buf)) > 0) {
  +            while ((length = is.read(buf)) > 0 && !finished) {
                   os.write(buf, 0, length);
  +                if (autoflush) {
  +                    os.flush();
  +                }
               }
           } catch (Exception e) {
               // ignore errors
  @@ -116,4 +128,17 @@
               wait();
           }
       }
  +    
  +    /**
  +     * Stop the pumper as soon as possible.
  +     * Note that it may continue to block on the input stream
  +     * but it will really stop the thread as soon as it gets EOF
  +     * or any byte, and it will be marked as finished.
  +     * @since Ant 1.7
  +     */
  +    /*public*/ synchronized void stop() {
  +        finished = true;
  +        notifyAll();
  +    }
  +    
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to