@Override public MessageConsumer apply(final MessageConsumer consumer) { //inject our own consumer to refresh the timestamp return message -> { lastActivityTime=System.currentTimeMillis(); consumer.consume(message); }; } }
protected MessageConsumer wrapMessageConsumer(MessageConsumer consumer) { MessageConsumer result = consumer; if (messageTracer != null) { final PrintWriter tracer = messageTracer; result = message -> { tracer.println(message); tracer.flush(); consumer.consume(message); }; } if (validateMessages) { result = new ReflectiveMessageValidator(result); } if (messageWrapper != null) { result = messageWrapper.apply(result); } return result; }
protected MessageConsumer wrapMessageConsumer(MessageConsumer consumer) { MessageConsumer result = consumer; if (messageTracer != null) { final PrintWriter tracer = messageTracer; result = message -> { tracer.println(message); tracer.flush(); consumer.consume(message); }; } if (validateMessages) { result = new ReflectiveMessageValidator(result); } if (messageWrapper != null) { result = messageWrapper.apply(result); } return result; }
/** * Send a notification to the remote endpoint. */ @Override public void notify(String method, Object parameter) { NotificationMessage notificationMessage = createNotificationMessage(method, parameter); try { out.consume(notificationMessage); } catch (Exception exception) { Level logLevel = JsonRpcException.indicatesStreamClosed(exception) ? Level.INFO : Level.WARNING; LOG.log(logLevel, "Failed to send notification message.", exception); } }
/** * Send a notification to the remote endpoint. */ @Override public void notify(String method, Object parameter) { NotificationMessage notificationMessage = createNotificationMessage(method, parameter); try { out.consume(notificationMessage); } catch (Exception exception) { Level logLevel = JsonRpcException.indicatesStreamClosed(exception) ? Level.INFO : Level.WARNING; LOG.log(logLevel, "Failed to send notification message.", exception); } }
@Override public void consume(Message message) throws MessageIssueException, JsonRpcException { List<MessageIssue> result = new ArrayList<>(); try { validate(message, result, new LinkedList<>(), new LinkedList<>()); } catch (Exception e) { LOG.log(Level.SEVERE, "Error during message validation: " + e.getMessage(), e); result.add(new MessageIssue("Message validation failed, please check the logs of the remote endpoint.", ResponseErrorCode.InvalidParams.getValue())); } if (!result.isEmpty()) { // Sort the messages in order to get a stable order (otherwise it depends on the JVM's reflection implementation) Collections.sort(result, (issue1, issue2) -> issue1.getText().compareTo(issue2.getText())); throw new MessageIssueException(message, result); } else if (delegate != null) { delegate.consume(message); } }
@Override public void consume(Message message) throws MessageIssueException, JsonRpcException { List<MessageIssue> result = new ArrayList<>(); try { validate(message, result, new LinkedList<>(), new LinkedList<>()); } catch (Exception e) { LOG.log(Level.SEVERE, "Error during message validation: " + e.getMessage(), e); result.add(new MessageIssue("Message validation failed, please check the logs of the remote endpoint.", ResponseErrorCode.InvalidParams.getValue())); } if (!result.isEmpty()) { // Sort the messages in order to get a stable order (otherwise it depends on the JVM's reflection implementation) Collections.sort(result, (issue1, issue2) -> issue1.getText().compareTo(issue2.getText())); throw new MessageIssueException(message, result); } else if (delegate != null) { delegate.consume(message); } }
@SuppressFBWarnings("DM_DEFAULT_ENCODING") public void launch() { Function<MessageConsumer, MessageConsumer> loggingMessageConsumerAdapter = consumer -> { return message -> { log.debug("Message received to client: {}", message); consumer.consume(message); }; }; Launcher<LanguageClient> serverLauncher = LSPLauncher.createServerLauncher( languageServer, inputStream, outputStream, Executors.newCachedThreadPool(), loggingMessageConsumerAdapter); if (languageServer instanceof LanguageClientAware) { LanguageClient client = serverLauncher.getRemoteProxy(); ((LanguageClientAware) languageServer).connect(client); } serverLauncher.startListening(); } }
/** * Send a request to the remote endpoint. */ @Override public CompletableFuture<Object> request(String method, Object parameter) { final RequestMessage requestMessage = createRequestMessage(method, parameter); final CompletableFuture<Object> result = new CompletableFuture<Object>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { sendCancelNotification(requestMessage.getRawId()); return super.cancel(mayInterruptIfRunning); } }; synchronized(sentRequestMap) { // Store request information so it can be handled when the response is received sentRequestMap.put(requestMessage.getId(), new PendingRequestInfo(requestMessage, result)); } try { // Send the request to the remote service out.consume(requestMessage); } catch (Exception exception) { // The message could not be sent, e.g. because the communication channel was closed result.completeExceptionally(exception); } return result; }
/** * Send a request to the remote endpoint. */ @Override public CompletableFuture<Object> request(String method, Object parameter) { final RequestMessage requestMessage = createRequestMessage(method, parameter); final CompletableFuture<Object> result = new CompletableFuture<Object>() { @Override public boolean cancel(boolean mayInterruptIfRunning) { sendCancelNotification(requestMessage.getRawId()); return super.cancel(mayInterruptIfRunning); } }; synchronized(sentRequestMap) { // Store request information so it can be handled when the response is received sentRequestMap.put(requestMessage.getId(), new PendingRequestInfo(requestMessage, result)); } try { // Send the request to the remote service out.consume(requestMessage); } catch (Exception exception) { // The message could not be sent, e.g. because the communication channel was closed result.completeExceptionally(exception); } return result; }
errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", throwable); out.consume(createErrorResponseMessage(requestMessage, errorObject)); if (throwable instanceof Error) throw (Error) throwable; out.consume(createResultResponseMessage(requestMessage, result)); }).exceptionally((Throwable t) -> { out.consume(responseMessage); return null; }).thenApply((obj) -> {
errorObject = fallbackResponseError("Internal error. Exception handler provided no error object", throwable); out.consume(createErrorResponseMessage(requestMessage, errorObject)); if (throwable instanceof Error) throw (Error) throwable; out.consume(createResultResponseMessage(requestMessage, result)); }).exceptionally((Throwable t) -> { out.consume(responseMessage); return null; }).thenApply((obj) -> {
try { Message message = jsonHandler.parseMessage(content); callback.consume(message); } catch (MessageIssueException exception) {
try { Message message = jsonHandler.parseMessage(content); callback.consume(message); } catch (MessageIssueException exception) {
private Future<Void> runAsync(Connection connection) throws Exception { LanguageServer server = this.languageServer; ExecutorService executor = createServerThreads(); Function<MessageConsumer, MessageConsumer> wrapper = (MessageConsumer consumer) -> { return (msg) -> { try { consumer.consume(msg); } catch (UnsupportedOperationException e) { //log a warning and ignore. We are getting some messages from vsCode the server doesn't know about log.warn("Unsupported message was ignored!", e); } }; }; Launcher<STS4LanguageClient> launcher = Launcher.createLauncher(server, STS4LanguageClient.class, connection.in, connection.out, executor, wrapper ); if (server instanceof LanguageClientAware) { LanguageClient client = launcher.getRemoteProxy(); ((LanguageClientAware) server).connect(client); } return launcher.startListening(); }
protected void handleRequestIssues(RequestMessage requestMessage, List<MessageIssue> issues) { ResponseError errorObject = new ResponseError(); if (issues.size() == 1) { MessageIssue issue = issues.get(0); errorObject.setMessage(issue.getText()); errorObject.setCode(issue.getIssueCode()); errorObject.setData(issue.getCause()); } else { if (requestMessage.getMethod() != null) errorObject.setMessage("Multiple issues were found in '" + requestMessage.getMethod() + "' request."); else errorObject.setMessage("Multiple issues were found in request."); errorObject.setCode(ResponseErrorCode.InvalidRequest); errorObject.setData(issues); } out.consume(createErrorResponseMessage(requestMessage, errorObject)); }
protected void handleRequestIssues(RequestMessage requestMessage, List<MessageIssue> issues) { ResponseError errorObject = new ResponseError(); if (issues.size() == 1) { MessageIssue issue = issues.get(0); errorObject.setMessage(issue.getText()); errorObject.setCode(issue.getIssueCode()); errorObject.setData(issue.getCause()); } else { if (requestMessage.getMethod() != null) errorObject.setMessage("Multiple issues were found in '" + requestMessage.getMethod() + "' request."); else errorObject.setMessage("Multiple issues were found in request."); errorObject.setCode(ResponseErrorCode.InvalidRequest); errorObject.setData(issues); } out.consume(createErrorResponseMessage(requestMessage, errorObject)); }