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);
}
}