RFR JDK-8131023: JShell: System.in does not work

Robert Field robert.field at oracle.com
Thu Aug 25 17:37:15 UTC 2016


As the bug title states, System.in does not work from Snippets.  In a 
command line tool there is only one "in", even though the constructor 
for the tool takes a separate cmdIn and userIn.  So, for a command line 
tool to work these need to be unified.  However, though the JShell API 
is the recommended approach to creating new tools, some will choose to 
wrap the tool, say in a GUI.  In fact this has already been done.  Such 
a wrapped tool can have separate input channels.  Rather than changing 
the constructor for JShellTool to remove the userIn parameter, it would 
seem to leave more options open if a new constructor with just one input 
parameter (not named "cmdIn") was added which forwards to the old 
constructor.

More later...


On 08/25/16 08:23, Jan Lahoda wrote:
> Hi,
>
> Bug:
> https://bugs.openjdk.java.net/browse/JDK-8131023
>
> Langtools webrev:
> http://cr.openjdk.java.net/~jlahoda/8131023/langtools.00/
>
> JDK repository webrev:
> http://cr.openjdk.java.net/~jlahoda/8131023/jdk.00/
>
> Specdiff:
> http://cr.openjdk.java.net/~jlahoda/8131023/diff.00/jdk/jshell/execution/Util.html 
>
>
> Currently jshell forwards output from the agent to the main process. 
> With this patch, the input is also forwarded from the main process to 
> the agent. InputStream.read() is only called in the main process if it 
> has been called on the agent side; this is achieved by using an 
> artificial OutputStream in the agent->main process direction. On the 
> agent side, when an input is requested, a character is written to the 
> corresponding artificial OutputStream, the main process is about that, 
> reads from the actual input and sends the data back to the agent.
>
> In the tool, jline is used to actually read the input, as System.in is 
> switched in the raw mode. This requires a tweak in jline, to detect 
> the proper column on which the editing starts, to cover requests like:
>
> System.err.print("Prompt: "); System.err.flush(); System.in.read();
>
> Without the tweak, the line editor wouldn't unfortunately know about 
> the text written to the console (for supported terminals, at least). 
> (This tweak may be useful in any case for complex prompts that use 
> escape sequences; also for jjs.)
>
> An alternative would be to try to switch jline off while reading the 
> user's input. The advantage of using jline is that it allows to detect 
> Ctrl-C.
>
> Any feedback is welcome!
>
> Thanks,
>      Jan



More information about the kulla-dev mailing list