public class JsonRpcReader {
- private final static Logger logger = LoggerFactory.getLogger(JsonRpcReader.class);
+ private static final Logger logger = LoggerFactory.getLogger(JsonRpcReader.class);
private final JsonRpcSender jsonRpcSender;
private final ObjectMapper objectMapper;
return;
}
- final var executor = Executors.newFixedThreadPool(10);
- try {
+ try (final var executor = Executors.newCachedThreadPool()) {
while (!Thread.interrupted()) {
final var input = lineSupplier.get();
if (input == null) {
executor.submit(() -> handleMessage(message, requestHandler, responseHandler));
}
- } finally {
- Util.closeExecutorService(executor);
}
}
final RequestHandler requestHandler,
final Consumer<JsonRpcResponse> responseHandler
) {
- if (message instanceof final JsonRpcRequest jsonRpcRequest) {
- logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod());
- final var response = handleRequest(requestHandler, jsonRpcRequest);
- if (response != null) {
- jsonRpcSender.sendResponse(response);
+ switch (message) {
+ case JsonRpcRequest jsonRpcRequest -> {
+ logger.debug("Received json rpc request, method: " + jsonRpcRequest.getMethod());
+ final var response = handleRequest(requestHandler, jsonRpcRequest);
+ if (response != null) {
+ jsonRpcSender.sendResponse(response);
+ }
}
- } else if (message instanceof JsonRpcResponse jsonRpcResponse) {
- responseHandler.accept(jsonRpcResponse);
- } else {
- final var messages = ((JsonRpcBatchMessage) message).getMessages();
- final var responseList = new ArrayList<JsonRpcResponse>(messages.size());
- final var executor = Executors.newFixedThreadPool(10);
- try {
- final var lock = new ReentrantLock();
- messages.forEach(jsonNode -> {
- final JsonRpcRequest request;
- try {
- request = parseJsonRpcRequest(jsonNode);
- } catch (JsonRpcException e) {
- final var response = JsonRpcResponse.forError(e.getError(), getId(jsonNode));
- lock.lock();
+ case JsonRpcResponse jsonRpcResponse -> responseHandler.accept(jsonRpcResponse);
+ case JsonRpcBatchMessage jsonRpcBatchMessage -> {
+ final var messages = jsonRpcBatchMessage.getMessages();
+ final var responseList = new ArrayList<JsonRpcResponse>(messages.size());
+ try (final var executor = Executors.newCachedThreadPool()) {
+ final var lock = new ReentrantLock();
+ messages.forEach(jsonNode -> {
+ final JsonRpcRequest request;
try {
- responseList.add(response);
- } finally {
- lock.unlock();
- }
- return;
- }
-
- executor.submit(() -> {
- final var response = handleRequest(requestHandler, request);
- if (response != null) {
+ request = parseJsonRpcRequest(jsonNode);
+ } catch (JsonRpcException e) {
+ final var response = JsonRpcResponse.forError(e.getError(), getId(jsonNode));
lock.lock();
try {
responseList.add(response);
} finally {
lock.unlock();
}
+ return;
}
+
+ executor.submit(() -> {
+ final var response = handleRequest(requestHandler, request);
+ if (response != null) {
+ lock.lock();
+ try {
+ responseList.add(response);
+ } finally {
+ lock.unlock();
+ }
+ }
+ });
});
- });
- } finally {
- Util.closeExecutorService(executor);
- }
+ }
- if (responseList.size() > 0) {
- jsonRpcSender.sendBatchResponses(responseList);
+ if (!responseList.isEmpty()) {
+ jsonRpcSender.sendBatchResponses(responseList);
+ }
}
}
}
}
private JsonRpcMessage parseJsonRpcMessage(final String input) {
+ if (input.trim().isEmpty()) {
+ jsonRpcSender.sendResponse(JsonRpcResponse.forError(new JsonRpcResponse.Error(JsonRpcResponse.Error.PARSE_ERROR,
+ "Empty input line",
+ null), null));
+ return null;
+ }
+
final JsonNode jsonNode;
try {
jsonNode = objectMapper.readTree(input);
null), null));
return null;
} else if (jsonNode.isArray()) {
- if (jsonNode.size() == 0) {
+ if (jsonNode.isEmpty()) {
jsonRpcSender.sendResponse(JsonRpcResponse.forError(new JsonRpcResponse.Error(JsonRpcResponse.Error.INVALID_REQUEST,
"invalid request",
null), null));
private ValueNode getId(JsonNode jsonNode) {
final var id = jsonNode.get("id");
- return id instanceof ValueNode ? (ValueNode) id : null;
+ return id instanceof ValueNode value ? value : null;
}
private JsonRpcRequest parseJsonRpcRequest(final JsonNode input) throws JsonRpcException {