diff --git a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java index 30b2e514..1d531046 100644 --- a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java +++ b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/MessageProducer.java @@ -11,7 +11,9 @@ ******************************************************************************/ package org.eclipse.lsp4j.jsonrpc; -public interface MessageProducer { +import java.io.Closeable; + +public interface MessageProducer extends Closeable { /** * Listen to a message source and forward all messages to the given consumer. Typically this method diff --git a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java index 11f2acb6..41be13f2 100644 --- a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java +++ b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/ConcurrentMessageProcessor.java @@ -52,7 +52,7 @@ public boolean isDone() { public boolean cancel(boolean mayInterruptIfRunning) { if (mayInterruptIfRunning && messageProducer instanceof Closeable) { try { - ((Closeable) messageProducer).close(); + messageProducer.close(); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java index fff6086c..07521471 100644 --- a/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java +++ b/org.eclipse.lsp4j.jsonrpc/src/main/java/org/eclipse/lsp4j/jsonrpc/json/StreamMessageProducer.java @@ -31,7 +31,7 @@ /** * A message producer that reads from an input stream and parses messages from JSON. */ -public class StreamMessageProducer implements MessageProducer, Closeable, MessageConstants { +public class StreamMessageProducer implements MessageProducer, MessageConstants { private static final Logger LOG = Logger.getLogger(StreamMessageProducer.class.getName()); @@ -204,8 +204,9 @@ protected boolean handleMessage(InputStream input, Headers headers) { } @Override - public void close() { + public void close() throws IOException { keepRunning = false; + input.close(); } } diff --git a/org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java b/org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java index 4d59864a..873176af 100644 --- a/org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java +++ b/org.eclipse.lsp4j.jsonrpc/src/test/java/org/eclipse/lsp4j/jsonrpc/test/json/MessageProducerTest.java @@ -69,7 +69,9 @@ public int read() throws IOException { MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap()); try (StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler)) { messageProducer.listen(message -> {}); - } + }catch (IOException e) { + throw new IllegalStateException(e); + } }).get(TIMEOUT, TimeUnit.MILLISECONDS); } @@ -85,7 +87,9 @@ public int read() throws IOException { MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap()); try (StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler)) { messageProducer.listen(message -> {}); - } + }catch (IOException e) { + throw new IllegalStateException(e); + } }).get(TIMEOUT, TimeUnit.MILLISECONDS); } @@ -101,7 +105,9 @@ public int read() throws IOException { MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap()); try (StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler)) { messageProducer.listen(message -> {}); - } + }catch (IOException e) { + throw new IllegalStateException(e); + } }).get(TIMEOUT, TimeUnit.MILLISECONDS); } @@ -118,7 +124,9 @@ public int read() throws IOException { MessageJsonHandler jsonHandler = new MessageJsonHandler(Collections.emptyMap()); try (StreamMessageProducer messageProducer = new StreamMessageProducer(input, jsonHandler)) { messageProducer.listen(message -> {}); - } + }catch (IOException e) { + throw new IllegalStateException(e); + } }).get(TIMEOUT, TimeUnit.MILLISECONDS); } catch (ExecutionException e) { throw e.getCause(); @@ -149,11 +157,13 @@ protected void fireError(Throwable error) { } var jsonHandler = new MessageJsonHandler(Collections.emptyMap()); - try (var producer = new TestProducer( new ByteArrayInputStream(inputStr.getBytes()), jsonHandler)) { - var received = new ArrayList<>(); - producer.listen(received::add); - assertEquals("Both messages should be delivered", 2, received.size()); - } + try (var producer = new TestProducer(new ByteArrayInputStream(inputStr.getBytes()), jsonHandler)) { + var received = new ArrayList<>(); + producer.listen(received::add); + assertEquals("Both messages should be delivered", 2, received.size()); + } catch (IOException e) { + throw new IllegalStateException(e); + } }).get(TIMEOUT, TimeUnit.MILLISECONDS); }