diff --git a/src/main/java/dev/jbang/util/ConsoleInput.java b/src/main/java/dev/jbang/util/ConsoleInput.java index 7d7715e41..0bb602a95 100644 --- a/src/main/java/dev/jbang/util/ConsoleInput.java +++ b/src/main/java/dev/jbang/util/ConsoleInput.java @@ -1,78 +1,41 @@ package dev.jbang.util; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.concurrent.*; - -public abstract class ConsoleInput { +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class ConsoleInput { private final int tries; private final int timeout; private final TimeUnit unit; - /** - * Will either return a ConsoleInput that enables reading a line from the - * console (using stdin or a tty) or it will return null if no - * console is available. - */ - public static ConsoleInput get(int tries, int timeout, TimeUnit unit) { - if (Util.haveConsole()) { - return stdin(tries, timeout, unit); - } else if (!Util.isWindows()) { - return tty(tries, timeout, unit); - } else { - return null; - } - } - - /** - * Returns a regular ConsoleInput based upon System.in - */ - public static ConsoleInput stdin(int tries, int timeout, TimeUnit unit) { - return new ConsoleInput(tries, timeout, unit) { - @Override - protected Callable readerTask() { - return new ConsoleInputReadTask(System.in); - } - }; - } - - /** - * Returns a ConsoleInput based upon /dev/tty which only works on Linux and Mac. - */ - public static ConsoleInput tty(int tries, int timeout, TimeUnit unit) { - return new ConsoleInput(tries, timeout, unit) { - @Override - protected Callable readerTask() throws IOException { - return new ConsoleInputReadTask(new FileInputStream("/dev/tty")); - } - }; - } - - private ConsoleInput(int tries, int timeout, TimeUnit unit) { + public ConsoleInput(int tries, int timeout, TimeUnit unit) { this.tries = tries; this.timeout = timeout; this.unit = unit; } - protected abstract Callable readerTask() throws IOException; - public String readLine() { ExecutorService ex = Executors.newSingleThreadExecutor(); String input = null; try { // start working for (int i = 0; i < tries; i++) { - Future result = null; + // Util.infoMsg(String.valueOf(i + 1) + ". loop"); + Future result = ex.submit( + new ConsoleInputReadTask()); try { - result = ex.submit(readerTask()); input = result.get(timeout, unit); break; - } catch (ExecutionException | IOException e) { + } catch (ExecutionException e) { e.getCause().printStackTrace(); } catch (TimeoutException e) { - if (result != null) { - result.cancel(true); - } + // Util.infoMsg("Cancelling reading task"); + result.cancel(true); + // Util.infoMsg("\nThread cancelled. input is null"); } catch (InterruptedException ie) { throw new RuntimeException(ie); } diff --git a/src/main/java/dev/jbang/util/ConsoleInputReadTask.java b/src/main/java/dev/jbang/util/ConsoleInputReadTask.java index 764947fc3..c580d6247 100644 --- a/src/main/java/dev/jbang/util/ConsoleInputReadTask.java +++ b/src/main/java/dev/jbang/util/ConsoleInputReadTask.java @@ -2,21 +2,17 @@ import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.util.concurrent.Callable; public class ConsoleInputReadTask implements Callable { - private final InputStream in; - - public ConsoleInputReadTask(InputStream in) { - this.in = in; - } - public String call() throws IOException { - BufferedReader br = new BufferedReader(new InputStreamReader(in)); + BufferedReader br = new BufferedReader( + new InputStreamReader(System.in)); + // System.out.println("ConsoleInputReadTask run() called."); String input; do { + // System.out.println("Please type something: "); try { // wait until we have data to complete a readLine() while (!br.ready()) { @@ -24,9 +20,11 @@ public String call() throws IOException { } input = br.readLine(); } catch (InterruptedException e) { + // System.out.println("ConsoleInputReadTask() cancelled"); return null; } } while ("".equals(input)); + // System.out.println("Thank You for providing input!"); return input; } } \ No newline at end of file diff --git a/src/main/java/dev/jbang/util/Util.java b/src/main/java/dev/jbang/util/Util.java index 9cdb2431d..5b97b6787 100644 --- a/src/main/java/dev/jbang/util/Util.java +++ b/src/main/java/dev/jbang/util/Util.java @@ -1372,8 +1372,8 @@ public static boolean isBlankString(String str) { } public static int askInput(String message, int timeout, int defaultValue, String... options) { - ConsoleInput con = ConsoleInput.get(1, timeout, TimeUnit.SECONDS); - if (con != null) { + if (!"true".equalsIgnoreCase(System.getenv(JBANG_STDIN_NOTTY))) { + ConsoleInput con = new ConsoleInput(1, timeout, TimeUnit.SECONDS); StringBuilder msg = new StringBuilder(message + "\n\n"); for (int i = 0; i < options.length; i++) { msg.append("(").append(i + 1).append(") ").append(options[i]).append("\n"); @@ -1420,10 +1420,6 @@ public static int askInput(String message, int timeout, int defaultValue, String return -1; } - public static boolean haveConsole() { - return !"true".equalsIgnoreCase(System.getenv(JBANG_STDIN_NOTTY)); - } - private static void setupApplicationIcon() { try { Class clazz = Util.class.getClassLoader().loadClass("java.awt.Taskbar");