diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.boot.ls/META-INF/MANIFEST.MF
index a0cf1b621..e69952eb3 100644
--- a/eclipse-language-servers/org.springframework.tooling.boot.ls/META-INF/MANIFEST.MF
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/META-INF/MANIFEST.MF
@@ -25,7 +25,8 @@ Require-Bundle: org.eclipse.jdt.launching;bundle-version="3.9.0",
org.eclipse.jdt.core,
org.eclipse.ui.editors;bundle-version="3.11.100",
org.springsource.ide.eclipse.commons.livexp,
- org.apache.commons.lang3
+ org.apache.commons.lang3,
+ org.eclipse.wst.sse.ui;bundle-version="1.5.100";resolution:=optional
Import-Package: com.google.gson;version="2.7.0",
org.eclipse.jface.preference,
org.osgi.framework
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
index ec55a31fa..5d9ce0bb0 100644
--- a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
@@ -10,52 +10,72 @@
clientImpl="org.springframework.tooling.ls.eclipse.commons.STS4LanguageClientImpl"
label="Spring Boot Language Server">
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
@@ -250,6 +270,25 @@
scopeName="source.java-properties">
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/xml/XMLContentAssistProposalComputer.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/xml/XMLContentAssistProposalComputer.java
new file mode 100644
index 000000000..f5a284589
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/xml/XMLContentAssistProposalComputer.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2019 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
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Pivotal, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.tooling.boot.ls.xml;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.lsp4e.operations.completion.LSContentAssistProcessor;
+import org.eclipse.wst.sse.ui.contentassist.CompletionProposalInvocationContext;
+import org.eclipse.wst.sse.ui.contentassist.IAsyncCompletionProposalComputer;
+
+/**
+ * @author Martin Lippert
+ */
+@SuppressWarnings("restriction")
+public class XMLContentAssistProposalComputer implements IAsyncCompletionProposalComputer {
+
+ private static TimeUnit TIMEOUT_UNIT = TimeUnit.MILLISECONDS;
+ private static long TIMEOUT_LENGTH = 2000;
+
+ private LSContentAssistProcessor lsContentAssistProcessor;
+
+ public XMLContentAssistProposalComputer() {
+ lsContentAssistProcessor = new LSContentAssistProcessor();
+ }
+
+ @Override
+ public List computeCompletionProposals(CompletionProposalInvocationContext context, IProgressMonitor monitor) {
+ CompletableFuture future = CompletableFuture.supplyAsync(() -> {
+ return lsContentAssistProcessor.computeCompletionProposals(context.getViewer(), context.getInvocationOffset());
+ });
+
+ try {
+ return Arrays.asList(future.get(TIMEOUT_LENGTH, TIMEOUT_UNIT));
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ e.printStackTrace();
+ return Collections.emptyList();
+ }
+ }
+
+ @Override
+ public List computeContextInformation(CompletionProposalInvocationContext context, IProgressMonitor monitor) {
+ IContextInformation[] contextInformation = lsContentAssistProcessor.computeContextInformation(context.getViewer(), context.getInvocationOffset());
+ return Arrays.asList(contextInformation);
+ }
+
+ @Override
+ public String getErrorMessage() {
+ return lsContentAssistProcessor.getErrorMessage();
+ }
+
+ @Override
+ public void sessionEnded() {
+ }
+
+ @Override
+ public void sessionStarted() {
+ }
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java
index 1f1962df2..1842aa787 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java
@@ -23,6 +23,7 @@ import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache;
import org.springframework.ide.vscode.boot.java.utils.SymbolCache;
import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider;
import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents;
+import org.springframework.ide.vscode.boot.xml.SpringXMLLanguageServerComponents;
import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine;
import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter;
import org.springframework.ide.vscode.commons.languageserver.composable.CompositeLanguageServerComponents;
@@ -78,6 +79,7 @@ public class BootLanguageServerInitializer implements InitializingBean {
CompositeLanguageServerComponents.Builder builder = new CompositeLanguageServerComponents.Builder();
builder.add(new BootPropertiesLanguageServerComponents(server, params, javaElementLocationProvider, parser, yamlStructureProvider, yamlAssistContextProvider, sourceLinks));
builder.add(new BootJavaLanguageServerComponents(server, params, sourceLinks, cuCache, adHocProperties, symbolCache, config, springIndexer, runningAppProvider));
+ builder.add(new SpringXMLLanguageServerComponents(server, params));
components = builder.build(server);
params.projectObserver.addListener(reconcileOpenDocuments(server, components));
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
index 2df2e3034..f3fa4ff1f 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java
@@ -92,7 +92,7 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent
// Do not add more components here. You should instead just make your new
// components into separate beans.
- public static final Set LANGUAGES = ImmutableSet.of(LanguageId.JAVA, LanguageId.XML);
+ public static final Set LANGUAGES = ImmutableSet.of(LanguageId.JAVA);
private static final Logger log = LoggerFactory.getLogger(BootJavaLanguageServerComponents.class);
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java
new file mode 100644
index 000000000..b9329175c
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLCompletionEngine.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2019 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
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Pivotal, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.ide.vscode.boot.xml;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine;
+import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal;
+import org.springframework.ide.vscode.commons.util.text.TextDocument;
+
+/**
+ * @author Martin Lippert
+ */
+public class SpringXMLCompletionEngine implements ICompletionEngine {
+
+ public SpringXMLCompletionEngine(SpringXMLLanguageServerComponents springXMLLanguageServerComponents) {
+ }
+
+ @Override
+ public Collection getCompletions(TextDocument document, int offset) throws Exception {
+ System.out.println(" SUPER COOL SPRING XML COMPLETION PROPOSALS COMING SOON... STAY TUNED...");
+
+ return Collections.emptyList();
+ }
+
+}
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java
new file mode 100644
index 000000000..8dfd6fe35
--- /dev/null
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2019 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
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Pivotal, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.ide.vscode.boot.xml;
+
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.ide.vscode.boot.app.BootLanguageServerParams;
+import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionEngine;
+import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents;
+import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler;
+import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer;
+import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService;
+import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService;
+import org.springframework.ide.vscode.commons.util.text.LanguageId;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * @author Martin Lippert
+ */
+public class SpringXMLLanguageServerComponents implements LanguageServerComponents {
+
+ public static final Set LANGUAGES = ImmutableSet.of(LanguageId.XML);
+
+ private static final Logger log = LoggerFactory.getLogger(SpringXMLLanguageServerComponents.class);
+
+ private final SimpleLanguageServer server;
+ private final BootLanguageServerParams serverParams;
+
+ public SpringXMLLanguageServerComponents(
+ SimpleLanguageServer server,
+ BootLanguageServerParams serverParams) {
+ this.server = server;
+ this.serverParams = serverParams;
+
+ server.doOnInitialized(this::initialized);
+ server.onShutdown(this::shutdown);
+ }
+
+ @Override
+ public Set getInterestingLanguages() {
+ return LANGUAGES;
+ }
+
+ @Override
+ public ICompletionEngine getCompletionEngine() {
+ return new SpringXMLCompletionEngine(this);
+ }
+
+ @Override
+ public HoverHandler getHoverProvider() {
+ return null;
+ }
+
+ private void initialized() {
+ }
+
+ private void shutdown() {
+ }
+
+}