Search in sources :

Example 1 with MessageConsumer

use of org.eclipse.lsp4j.jsonrpc.MessageConsumer in project sts4 by spring-projects.

the class LaunguageServerApp method run.

/**
 * Listen for requests from the parent node process.
 * Send replies asynchronously.
 * When the request stream is closed, wait for 5s for all outstanding responses to compute, then return.
 * @throws ExecutionException
 * @throws InterruptedException
 */
protected void run(Connection connection) throws InterruptedException, ExecutionException {
    LanguageServer server = createServer();
    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);
    }
    launcher.startListening().get();
}
Also used : LanguageServer(org.eclipse.lsp4j.services.LanguageServer) SimpleLanguageServer(org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer) MessageConsumer(org.eclipse.lsp4j.jsonrpc.MessageConsumer) ExecutorService(java.util.concurrent.ExecutorService) LanguageClient(org.eclipse.lsp4j.services.LanguageClient) LanguageClientAware(org.eclipse.lsp4j.services.LanguageClientAware)

Example 2 with MessageConsumer

use of org.eclipse.lsp4j.jsonrpc.MessageConsumer in project ballerina by ballerina-lang.

the class BallerinaLangServerService method launchRPCServer.

private <T> Launcher<T> launchRPCServer(Object localService, Class<T> remoteInterface) {
    Consumer<GsonBuilder> configureGson = (gsonBuilder) -> {
    };
    Map<String, JsonRpcMethod> supportedMethods = new LinkedHashMap();
    supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(remoteInterface));
    if (localService instanceof JsonRpcMethodProvider) {
        JsonRpcMethodProvider rpcMethodProvider = (JsonRpcMethodProvider) localService;
        supportedMethods.putAll(rpcMethodProvider.supportedMethods());
    } else {
        supportedMethods.putAll(ServiceEndpoints.getSupportedMethods(localService.getClass()));
    }
    MessageJsonHandler jsonHandler = new MessageJsonHandler(supportedMethods, configureGson);
    MessageConsumer outGoingMessageStream = new WSRPCMessageConsumer(this, jsonHandler);
    RemoteEndpoint serverEndpoint = new RemoteEndpoint(outGoingMessageStream, ServiceEndpoints.toEndpoint(localService));
    jsonHandler.setMethodProvider(serverEndpoint);
    final MessageConsumer messageConsumer = serverEndpoint;
    final MessageProducer reader = new WSRPCMessageProducer(this, jsonHandler);
    final T remoteProxy = ServiceEndpoints.toServiceObject(serverEndpoint, remoteInterface);
    return new Launcher<T>() {

        public Future<?> startListening() {
            return ConcurrentMessageProcessor.startProcessing(reader, messageConsumer, Executors.newCachedThreadPool());
        }

        public T getRemoteProxy() {
            return remoteProxy;
        }
    };
}
Also used : ConcurrentMessageProcessor(org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor) LanguageClient(org.eclipse.lsp4j.services.LanguageClient) OnError(javax.websocket.OnError) CloseReason(javax.websocket.CloseReason) OnMessage(javax.websocket.OnMessage) LoggerFactory(org.slf4j.LoggerFactory) Constants(org.ballerinalang.composer.service.ballerina.langserver.Constants) MessageProducer(org.eclipse.lsp4j.jsonrpc.MessageProducer) GsonBuilder(com.google.gson.GsonBuilder) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) OnOpen(javax.websocket.OnOpen) ComposerService(org.ballerinalang.composer.server.spi.ComposerService) Future(java.util.concurrent.Future) OnClose(javax.websocket.OnClose) Map(java.util.Map) LinkedList(java.util.LinkedList) Launcher(org.eclipse.lsp4j.jsonrpc.Launcher) ServiceType(org.ballerinalang.composer.server.spi.ServiceType) Logger(org.slf4j.Logger) Session(javax.websocket.Session) ServiceEndpoints(org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints) MessageJsonHandler(org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler) IOException(java.io.IOException) ServerEndpoint(javax.websocket.server.ServerEndpoint) MessageConsumer(org.eclipse.lsp4j.jsonrpc.MessageConsumer) Executors(java.util.concurrent.Executors) ExecutionException(java.util.concurrent.ExecutionException) Consumer(java.util.function.Consumer) List(java.util.List) ServerConstants(org.ballerinalang.composer.server.core.ServerConstants) JsonRpcMethod(org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod) ServiceInfo(org.ballerinalang.composer.server.spi.ServiceInfo) JsonRpcMethodProvider(org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider) BallerinaLanguageServer(org.ballerinalang.langserver.BallerinaLanguageServer) RemoteEndpoint(org.eclipse.lsp4j.jsonrpc.RemoteEndpoint) JsonRpcMethodProvider(org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethodProvider) MessageConsumer(org.eclipse.lsp4j.jsonrpc.MessageConsumer) MessageJsonHandler(org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler) GsonBuilder(com.google.gson.GsonBuilder) RemoteEndpoint(org.eclipse.lsp4j.jsonrpc.RemoteEndpoint) LinkedHashMap(java.util.LinkedHashMap) JsonRpcMethod(org.eclipse.lsp4j.jsonrpc.json.JsonRpcMethod) Launcher(org.eclipse.lsp4j.jsonrpc.Launcher) MessageProducer(org.eclipse.lsp4j.jsonrpc.MessageProducer)

Example 3 with MessageConsumer

use of org.eclipse.lsp4j.jsonrpc.MessageConsumer in project sts4 by spring-projects.

the class LaunguageServerApp method startAsServer.

/**
 * starts up the language server and let it listen for connections from the outside
 * instead of connecting itself to an existing port or channel.
 *
 * This is meant for development only, to reduce turnaround times while working
 * on the language server from within an IDE, so that you can start the language
 * server right away in debug mode and let the vscode extension connect to that
 * instance instead of vice versa.
 *
 * Source of inspiration:
 * https://github.com/itemis/xtext-languageserver-example/blob/master/org.xtext.example.mydsl.ide/src/org/xtext/example/mydsl/ide/RunServer.java
 */
public void startAsServer() throws IOException, InterruptedException {
    Log.info("Starting LS as standlone server");
    Function<MessageConsumer, MessageConsumer> wrapper = consumer -> {
        MessageConsumer result = consumer;
        return result;
    };
    SimpleLanguageServer languageServer = createServer();
    Launcher<STS4LanguageClient> launcher = createSocketLauncher(languageServer, STS4LanguageClient.class, new InetSocketAddress("localhost", SERVER_STANDALONE_PORT), createServerThreads(), wrapper);
    languageServer.connect(launcher.getRemoteProxy());
    Future<?> future = launcher.startListening();
    while (!future.isDone()) {
        Thread.sleep(10_000l);
    }
}
Also used : OutputStream(java.io.OutputStream) PrintStream(java.io.PrintStream) AsynchronousServerSocketChannel(java.nio.channels.AsynchronousServerSocketChannel) LanguageClientAware(org.eclipse.lsp4j.services.LanguageClientAware) Socket(java.net.Socket) Launcher(org.eclipse.lsp4j.jsonrpc.Launcher) LanguageClient(org.eclipse.lsp4j.services.LanguageClient) SocketAddress(java.net.SocketAddress) Provider(javax.inject.Provider) Log(org.springframework.ide.vscode.commons.util.Log) Channels(java.nio.channels.Channels) IOException(java.io.IOException) LanguageServer(org.eclipse.lsp4j.services.LanguageServer) InetSocketAddress(java.net.InetSocketAddress) Function(java.util.function.Function) Executors(java.util.concurrent.Executors) MessageConsumer(org.eclipse.lsp4j.jsonrpc.MessageConsumer) ExecutionException(java.util.concurrent.ExecutionException) Future(java.util.concurrent.Future) LoggingFormat(org.springframework.ide.vscode.commons.languageserver.util.LoggingFormat) ExecutorService(java.util.concurrent.ExecutorService) InputStream(java.io.InputStream) AsynchronousSocketChannel(java.nio.channels.AsynchronousSocketChannel) SimpleLanguageServer(org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer) MessageConsumer(org.eclipse.lsp4j.jsonrpc.MessageConsumer) SimpleLanguageServer(org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer) InetSocketAddress(java.net.InetSocketAddress)

Aggregations

MessageConsumer (org.eclipse.lsp4j.jsonrpc.MessageConsumer)3 LanguageClient (org.eclipse.lsp4j.services.LanguageClient)3 IOException (java.io.IOException)2 ExecutionException (java.util.concurrent.ExecutionException)2 ExecutorService (java.util.concurrent.ExecutorService)2 Executors (java.util.concurrent.Executors)2 Future (java.util.concurrent.Future)2 Launcher (org.eclipse.lsp4j.jsonrpc.Launcher)2 GsonBuilder (com.google.gson.GsonBuilder)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)1 PrintStream (java.io.PrintStream)1 InetSocketAddress (java.net.InetSocketAddress)1 Socket (java.net.Socket)1 SocketAddress (java.net.SocketAddress)1 AsynchronousServerSocketChannel (java.nio.channels.AsynchronousServerSocketChannel)1 AsynchronousSocketChannel (java.nio.channels.AsynchronousSocketChannel)1 Channels (java.nio.channels.Channels)1 ArrayList (java.util.ArrayList)1 LinkedHashMap (java.util.LinkedHashMap)1