summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/cli/StreamTerminal.java
diff options
context:
space:
mode:
authorBen Culkin <scorpress@gmail.com>2023-06-25 16:30:36 -0400
committerBen Culkin <scorpress@gmail.com>2023-06-25 16:30:36 -0400
commitb8bbd1b015d59523cf2054a6ad42be11dedc8652 (patch)
tree2f4fa5f12909961a98d5740122a692e7ef758144 /base/src/main/java/bjc/utils/cli/StreamTerminal.java
parent69a769bc6474d71f5108af0698dd5454319e2a6c (diff)
Add timeout support
Add support for timeouts to Terminal, so you can say you only want to wait so long for a given reply
Diffstat (limited to 'base/src/main/java/bjc/utils/cli/StreamTerminal.java')
-rw-r--r--base/src/main/java/bjc/utils/cli/StreamTerminal.java27
1 files changed, 26 insertions, 1 deletions
diff --git a/base/src/main/java/bjc/utils/cli/StreamTerminal.java b/base/src/main/java/bjc/utils/cli/StreamTerminal.java
index 69be8d7..87370f8 100644
--- a/base/src/main/java/bjc/utils/cli/StreamTerminal.java
+++ b/base/src/main/java/bjc/utils/cli/StreamTerminal.java
@@ -7,6 +7,8 @@ import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
+import bjc.data.Either;
+
/**
* Implementation of {@link Terminal} using {@link Reader} and {@link Writer}
*
@@ -149,6 +151,24 @@ public class StreamTerminal implements Terminal, Runnable {
return pendingReplies.get(id);
}
}
+
+ @Override
+ public Optional<String> awaitReply(long id, TimeUnit unit, long delay) throws InterruptedException {
+ if (pendingReplies.containsKey(id))
+ return Optional.of(pendingReplies.get(id));
+ while (true) {
+ replyLock.lock();
+ boolean stat = replyCondition.await(delay, unit);
+ replyLock.unlock();
+
+ // If we timed out, say so
+ if (stat == false) return Optional.empty();
+ // Explanation: Since the reply map is add-only, the lock isn't actually
+ // protecting anything. We just want to wait until a response is received.
+ if (pendingReplies.containsKey(id))
+ return Optional.of(pendingReplies.get(id));
+ }
+ }
@Override
public Optional<String> checkReply(long id) {
@@ -160,5 +180,10 @@ public class StreamTerminal implements Terminal, Runnable {
return awaitReply(submitRequest(req));
}
- // TODO add variants of the two blocking methods above with timeout support
+ @Override
+ public Either<String, Long> submitRequestSync(String req, TimeUnit unit, long delay) throws InterruptedException {
+ long id = submitRequest(req);
+ Optional<String> rep = awaitReply(id, unit, delay);
+ return rep.isEmpty() ? Either.right(id) : Either.left(rep.get());
+ }
} \ No newline at end of file