From 2a9323ad3699c45126793f325eedb126754f8ed6 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 3 Oct 2018 12:43:11 -0700 Subject: [PATCH] Control 'standalone' launch via spring boot properties --- .../commons/commons-language-server/pom.xml | 5 +++ .../languageserver/LanguageServerRunner.java | 23 ++++++------ .../config/LanguageServerProperties.java | 35 +++++++++++++++++++ .../starter/LanguageServerAutoconf.java | 18 ++++++++-- 4 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/config/LanguageServerProperties.java diff --git a/headless-services/commons/commons-language-server/pom.xml b/headless-services/commons/commons-language-server/pom.xml index ce21ab97f..d82a6eb60 100644 --- a/headless-services/commons/commons-language-server/pom.xml +++ b/headless-services/commons/commons-language-server/pom.xml @@ -29,6 +29,11 @@ ${reactor-version} + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java index eedbc546e..161acbabe 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java @@ -35,8 +35,10 @@ import org.eclipse.lsp4j.services.LanguageServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; +import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerProperties; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.Log; +import org.springframework.util.Assert; /** * A CommandLineRunner that launches a language server. This meant to be used as a Spring bean @@ -63,7 +65,7 @@ public class LanguageServerRunner implements CommandLineRunner { log.error("", e); } }, - "LanguageServerApp lifecycle" + "LanguageServerApp-lifecycle" ).start(); } @@ -71,25 +73,23 @@ public class LanguageServerRunner implements CommandLineRunner { * System property that is set when the app launches. This makes it easy for the JVM process to recognized * as a languageserver by using (for example) JMX to read the system properties. */ - public static final String STS4_LANGUAGESERVER_NAME = "sts4.languageserver.name"; - - public static final String STANDALONE_STARTUP = "standalone-startup"; //TODO: turn into spring boot property - private static final int SERVER_STANDALONE_PORT = 5007; //TODO: turn into spring boot property - + public static final String SYSPROP_LANGUAGESERVER_NAME = "sts4.languageserver.name"; + private LanguageServerProperties properties; private final String name; private final Provider languageServerFactory; - public LanguageServerRunner(String name, Provider languageServerFactory) { + public LanguageServerRunner(String name, LanguageServerProperties properties, Provider languageServerFactory) { super(); this.name = name; + this.properties = properties; this.languageServerFactory = languageServerFactory; } public void start() throws Exception { - System.setProperty(STS4_LANGUAGESERVER_NAME, name); //makes it easy to recognize language server processes. + System.setProperty(SYSPROP_LANGUAGESERVER_NAME, name); //makes it easy to recognize language server processes. LanguageServerRunner app = this; - if (System.getProperty(STANDALONE_STARTUP, "false").equals("true")) { + if (properties.isStandalone()) { app.startAsServer(); } else { app.startAsClient(); @@ -161,7 +161,8 @@ public class LanguageServerRunner implements CommandLineRunner { * 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 Exception { - log.info("Starting LS as standlone server port = {}", SERVER_STANDALONE_PORT); + int serverPort = properties.getStandalonePort(); + log.info("Starting LS as standlone server port = {}", serverPort); Function wrapper = consumer -> { MessageConsumer result = consumer; @@ -170,7 +171,7 @@ public class LanguageServerRunner implements CommandLineRunner { SimpleLanguageServer languageServer = createServer(); Launcher launcher = createSocketLauncher(languageServer, STS4LanguageClient.class, - new InetSocketAddress("localhost", SERVER_STANDALONE_PORT), createServerThreads(), wrapper); + new InetSocketAddress("localhost", serverPort), createServerThreads(), wrapper); languageServer.connect(launcher.getRemoteProxy()); launcher.startListening().get(); diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/config/LanguageServerProperties.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/config/LanguageServerProperties.java new file mode 100644 index 000000000..1779f7a47 --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/config/LanguageServerProperties.java @@ -0,0 +1,35 @@ +package org.springframework.ide.vscode.commons.languageserver.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("languageserver") +public class LanguageServerProperties { + + /** + * Enables 'standalone' launch mode. In standalone mode the language server + * creates a server socket and waits for a client to connect on that socket. + */ + private boolean standalone = true; + + /** + * The port on which a standalone language server listens. This setting + * is ignored if the server is not launched in standalone mode. + */ + private int standalonePort = 5007; + + public boolean isStandalone() { + return standalone; + } + + public void setStandalone(boolean standalone) { + this.standalone = standalone; + } + + public int getStandalonePort() { + return standalonePort; + } + + public void setStandalonePort(int standalonePort) { + this.standalonePort = standalonePort; + } +} diff --git a/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoconf.java b/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoconf.java index 649c9d9dc..666324b35 100644 --- a/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoconf.java +++ b/headless-services/commons/language-server-starter/src/main/java/org/springframework/ide/vscode/languageserver/starter/LanguageServerAutoconf.java @@ -1,21 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ package org.springframework.ide.vscode.languageserver.starter; import javax.inject.Provider; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.ide.vscode.commons.languageserver.LanguageServerRunner; +import org.springframework.ide.vscode.commons.languageserver.config.LanguageServerProperties; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; @Configuration +@EnableConfigurationProperties(LanguageServerProperties.class) public class LanguageServerAutoconf { @Bean public LanguageServerRunner serverApp( - @Qualifier("serverName") String serverName, + @Qualifier("serverName") String serverName, + LanguageServerProperties properties, Provider languageServerFactory ) { - return new LanguageServerRunner(serverName, languageServerFactory); + return new LanguageServerRunner(serverName, properties, languageServerFactory); } }