diff --git a/WHATSNEW b/WHATSNEW
index 8658a1933..e1cf6dc1f 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -29,6 +29,9 @@ Fixed bugs:
files.
Bugzilla Report 50866.
+ * Read on System.in hangs for forked java task.
+ Bugzilla Report 50960.
+
Other changes:
--------------
diff --git a/src/etc/testcases/taskdefs/java.xml b/src/etc/testcases/taskdefs/java.xml
index 16a71df0d..2a7fe3c74 100644
--- a/src/etc/testcases/taskdefs/java.xml
+++ b/src/etc/testcases/taskdefs/java.xml
@@ -387,6 +387,11 @@ redirect.err="${redirect.err}" should be empty
+
+
+
+
@@ -395,4 +400,5 @@ redirect.err="${redirect.err}" should be empty
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java
index c63460792..2ccae1e74 100644
--- a/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java
+++ b/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java
@@ -273,10 +273,9 @@ public class PumpStreamHandler implements ExecuteStreamHandler {
*/
protected Thread createPump(InputStream is, OutputStream os,
boolean closeWhenExhausted, boolean nonBlockingIO) {
- final Thread result
- = new ThreadWithPumper(new StreamPumper(is, os,
- closeWhenExhausted,
- nonBlockingIO));
+ StreamPumper pumper = new StreamPumper(is, os, closeWhenExhausted, nonBlockingIO);
+ pumper.setAutoflush(true);
+ final Thread result = new ThreadWithPumper(pumper);
result.setDaemon(true);
return result;
}
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java
index bee211e6b..6812d88e6 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/JavaTest.java
@@ -18,10 +18,12 @@
package org.apache.tools.ant.taskdefs;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PipedInputStream;
@@ -260,6 +262,40 @@ public class JavaTest extends BuildFileTest {
assertEquals("foo", project.getProperty("input.value"));
}
+ public void testFlushedInput() throws Exception {
+ final PipedOutputStream out = new PipedOutputStream();
+ final PipedInputStream in = new PipedInputStream(out);
+ project.setInputHandler(new DefaultInputHandler() {
+ protected InputStream getInputStream() {
+ return in;
+ }
+ });
+ project.setDefaultInputStream(in);
+
+ final boolean[] timeout = new boolean[1];
+ timeout[0] = false;
+
+ Thread writingThread = new Thread(new Runnable() {
+ public void run() {
+ try {
+ // wait a little bit to have the target executed
+ Thread.sleep(500);
+ } catch (InterruptedException e) {
+ // don't care
+ }
+ try {
+ out.write("foo-FlushedInput\n".getBytes());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ writingThread.setDaemon(true);
+
+ writingThread.start();
+ executeTarget("flushedInput");
+ }
+
/**
* entry point class with no dependencies other
* than normal JRE runtime
@@ -372,4 +408,12 @@ public class JavaTest extends BuildFileTest {
}
}
}
+
+ public static class ReadPoint {
+ public static void main(String[] args) throws IOException {
+ String line = new BufferedReader(new InputStreamReader(System.in)).readLine();
+ System.out.println(line);
+ }
+ }
+
}