4242import java .util .concurrent .Executor ;
4343import java .util .concurrent .Executors ;
4444import java .util .concurrent .TimeoutException ;
45+ import java .util .concurrent .atomic .AtomicBoolean ;
4546import java .util .concurrent .atomic .AtomicLong ;
4647import java .util .concurrent .locks .Lock ;
4748import java .util .concurrent .locks .ReadWriteLock ;
@@ -65,17 +66,29 @@ public class Connection implements Closeable {
6566 return thread ;
6667 });
6768 private static final AtomicLong NEXT_ID = new AtomicLong (1L );
68- private final WebSocket socket ;
69+ private WebSocket socket ;
6970 private final Map <Long , Consumer <Either <Throwable , JsonInput >>> methodCallbacks = new ConcurrentHashMap <>();
7071 private final ReadWriteLock callbacksLock = new ReentrantReadWriteLock (true );
7172 private final Multimap <Event <?>, Consumer <?>> eventCallbacks = HashMultimap .create ();
7273 private final HttpClient client ;
74+ private final String url ;
75+ private final AtomicBoolean isClosed ;
7376
7477 public Connection (HttpClient client , String url ) {
7578 Require .nonNull ("HTTP client" , client );
7679 Require .nonNull ("URL to connect to" , url );
80+ this .url = url ;
7781 this .client = client ;
78- socket = this .client .openSocket (new HttpRequest (GET , url ), new Listener ());
82+ this .socket = this .client .openSocket (new HttpRequest (GET , url ), new Listener ());
83+ this .isClosed = new AtomicBoolean ();
84+ }
85+
86+ boolean isClosed () {
87+ return isClosed .get ();
88+ }
89+
90+ void reopen () {
91+ this .socket = this .client .openSocket (new HttpRequest (GET , url ), new Listener ());
7992 }
8093
8194 private static class NamedConsumer <X > implements Consumer <X > {
@@ -190,6 +203,7 @@ public void clearListeners() {
190203 public void close () {
191204 socket .close ();
192205 client .close ();
206+ this .isClosed .set (true );
193207 }
194208
195209 private class Listener implements WebSocket .Listener {
0 commit comments