diff --git a/gclc/src/main/java/fr/bigeon/gclc/manager/ConsoleManager.java b/gclc/src/main/java/fr/bigeon/gclc/manager/ConsoleManager.java index 9a0d060..6bf3b45 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/manager/ConsoleManager.java +++ b/gclc/src/main/java/fr/bigeon/gclc/manager/ConsoleManager.java @@ -74,12 +74,25 @@ public interface ConsoleManager extends AutoCloseable { * @throws InterruptedIOException if the prompt was interrupted */ String prompt() throws IOException; + /** @param timeout the time to wait in milliseconds + * @return the user inputed string, null if the timeout was reached + * @throws IOException if the manager is closed or could not read the prompt + * @throws InterruptedIOException if the prompt was interrupted */ + String prompt(long timeout) throws IOException; + /** @param message the message to prompt the user * @return the user inputed string * @throws IOException if the manager is closed or could not read the prompt * @throws InterruptedIOException if the prompt was interrupted */ String prompt(String message) throws IOException; + /** @param timeout the time to wait in milliseconds + * @param message the message to prompt the user + * @return the user inputed string, null if the timeout was reached + * @throws IOException if the manager is closed or could not read the prompt + * @throws InterruptedIOException if the prompt was interrupted */ + String prompt(String message, long timeout) throws IOException; + /**

* Set a prompting prefix. * diff --git a/gclc/src/main/java/fr/bigeon/gclc/manager/PipedConsoleManager.java b/gclc/src/main/java/fr/bigeon/gclc/manager/PipedConsoleManager.java index c0390d8..c5ca922 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/manager/PipedConsoleManager.java +++ b/gclc/src/main/java/fr/bigeon/gclc/manager/PipedConsoleManager.java @@ -121,11 +121,23 @@ public final class PipedConsoleManager .prompt(innerManager.getPrompt() + System.lineSeparator()); } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#prompt(long) */ + @Override + public String prompt(long timeout) throws IOException { + return innerManager.prompt(timeout); + } + @Override public String prompt(String message) throws IOException { return innerManager.prompt(message + System.lineSeparator()); } + @Override + public String prompt(String message, long timeout) throws IOException { + return innerManager.prompt(message + System.lineSeparator(), timeout); + } + @Override public void setPrompt(String prompt) { innerManager.setPrompt(prompt); diff --git a/gclc/src/main/java/fr/bigeon/gclc/manager/ReadingRunnable.java b/gclc/src/main/java/fr/bigeon/gclc/manager/ReadingRunnable.java index dfd8a7d..80aceab 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/manager/ReadingRunnable.java +++ b/gclc/src/main/java/fr/bigeon/gclc/manager/ReadingRunnable.java @@ -69,8 +69,7 @@ public class ReadingRunnable implements Runnable { /** @param obj the object to lock on * @param start the object to notify when ready to wait * @param message the message to wait for */ - public ToWaitRunnable(Object obj, Object start, - String message) { + public ToWaitRunnable(Object obj, Object start, String message) { this.obj = obj; this.start = start; this.message = message; @@ -91,8 +90,8 @@ public class ReadingRunnable implements Runnable { return; } } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, - THREAD_INTERRUPTION_EXCEPTION, e); + LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, + e); } } } @@ -126,13 +125,9 @@ public class ReadingRunnable implements Runnable { private final Object lock = new Object(); /** The waiting status for a message */ private boolean waiting; - /** - * The blocker for a given message - */ + /** The blocker for a given message */ private final Map messageBlocker = new HashMap<>(); - /** - * The lock - */ + /** The lock */ private final Object messageBlockerLock = new Object(); /** The message being delivered */ private String delivering; @@ -195,18 +190,17 @@ public class ReadingRunnable implements Runnable { public String getMessage() throws IOException { synchronized (lock) { if (!running) { - throw new IOException(CLOSED_PIPE); + throw new IOException(CLOSED_PIPE); } waiting = true; while (messages.isEmpty()) { try { lock.wait(TIMEOUT); } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, - e); + LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, e); } if (messages.isEmpty() && !running) { - throw new IOException(CLOSED_PIPE); + throw new IOException(CLOSED_PIPE); } } LOGGER.finest("Polled: " + messages.peek()); //$NON-NLS-1$ @@ -216,6 +210,28 @@ public class ReadingRunnable implements Runnable { } } + public String getNextMessage(long timeout) throws IOException { + synchronized (lock) { + if (!running) { + throw new IOException(CLOSED_PIPE); + } + waiting = true; + try { + lock.wait(timeout); + } catch (InterruptedException e) { + LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, e); + } + if (messages.isEmpty() && !running) { + throw new IOException(CLOSED_PIPE); + } + waiting = false; + if (messages.isEmpty()) { + return null; + } + return messages.poll(); + } + } + /** @param running the running to set */ public void setRunning(boolean running) { synchronized (lock) { @@ -235,7 +251,7 @@ public class ReadingRunnable implements Runnable { public boolean hasMessage() throws IOException { synchronized (lock) { if (!running) { - throw new IOException(CLOSED_PIPE); + throw new IOException(CLOSED_PIPE); } return !messages.isEmpty(); } @@ -283,7 +299,7 @@ public class ReadingRunnable implements Runnable { try { start.wait(TIMEOUT); } catch (InterruptedException e) { - LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, + LOGGER.log(Level.SEVERE, THREAD_INTERRUPTION_EXCEPTION, e); } } diff --git a/gclc/src/main/java/fr/bigeon/gclc/manager/SystemConsoleManager.java b/gclc/src/main/java/fr/bigeon/gclc/manager/SystemConsoleManager.java index 6b839f6..56072a3 100644 --- a/gclc/src/main/java/fr/bigeon/gclc/manager/SystemConsoleManager.java +++ b/gclc/src/main/java/fr/bigeon/gclc/manager/SystemConsoleManager.java @@ -136,6 +136,13 @@ public final class SystemConsoleManager implements ConsoleManager { // NOSONAR return prompt(prompt); } + /* (non-Javadoc) + * @see fr.bigeon.gclc.manager.ConsoleManager#prompt(long) */ + @Override + public String prompt(long timeout) throws IOException { + return prompt(prompt, timeout); + } + /* (non-Javadoc) * @see fr.bigeon.gclc.ConsoleManager#prompt(java.lang.String) */ @Override @@ -145,6 +152,15 @@ public final class SystemConsoleManager implements ConsoleManager { // NOSONAR return reading.getMessage(); } + /* (non-Javadoc) + * @see fr.bigeon.gclc.ConsoleManager#prompt(java.lang.String) */ + @Override + public String prompt(String message, long timeout) throws IOException { + checkOpen(); + out.print(message); + return reading.getNextMessage(timeout); + } + /** @param prompt the prompt to set */ @Override public void setPrompt(String prompt) {