From 5ea32cf751a4f3a30734e13f182fe97a637fc780 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 18 Oct 2017 16:20:42 -0700 Subject: [PATCH] Cleaner dependency injection for BootJavaLanguageServer --- .../boot/java/BootJavaLanguageServer.java | 44 +++++---- .../java/BootJavaLanguageServerParams.java | 64 +++++++++++++ .../ide/vscode/boot/java/Main.java | 5 +- .../ide/vscode/boot/java/ProjectServices.java | 26 ++++++ .../boot/java/utils/BootProjectUtil.java | 38 ++++++++ .../test/AutowiredHoverProviderTest.java | 24 ++--- .../test/ComponentHoverProviderTest.java | 28 ++---- .../beans/test/SpringIndexerBeansTest.java | 30 ++----- .../test/RequestMappingLiveHoverTest.java | 90 +++++++++---------- .../RequestMappingSymbolProviderTest.java | 33 ++----- .../java/scope/test/ScopeCompletionTest.java | 48 ++-------- .../java/utils/test/SpringIndexerTest.java | 63 +++++-------- .../java/value/test/ValueCompletionTest.java | 46 ++++------ .../harness/BootLanguageServerHarness.java | 69 ++++++++++++++ .../project/harness/PropertyIndexHarness.java | 7 ++ .../languageserver/java/ProjectObserver.java | 13 ++- .../languageserver/util/LSFactory.java | 25 ++++++ .../languageserver/testharness/Editor.java | 1 - .../testharness/LanguageServerHarness.java | 2 +- 19 files changed, 388 insertions(+), 268 deletions(-) create mode 100644 headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerParams.java create mode 100644 headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/ProjectServices.java create mode 100644 headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/BootProjectUtil.java create mode 100644 headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java create mode 100644 headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LSFactory.java diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index 20796f0d6..46441b849 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -46,24 +45,18 @@ import org.springframework.ide.vscode.boot.java.value.ValueCompletionProcessor; import org.springframework.ide.vscode.boot.java.value.ValueHoverProvider; import org.springframework.ide.vscode.boot.java.value.ValuePropertyReferencesProvider; import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider; -import org.springframework.ide.vscode.commons.gradle.GradleCore; -import org.springframework.ide.vscode.commons.gradle.GradleProjectCache; -import org.springframework.ide.vscode.commons.gradle.GradleProjectFinder; import org.springframework.ide.vscode.commons.languageserver.HighlightParams; 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.java.CompositeJavaProjectFinder; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeProjectOvserver; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler; 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.maven.MavenCore; -import org.springframework.ide.vscode.commons.maven.java.MavenProjectCache; -import org.springframework.ide.vscode.commons.maven.java.MavenProjectFinder; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; @@ -80,19 +73,19 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { private final VscodeCompletionEngineAdapter completionEngine; private final SpringIndexer indexer; private final SpringLiveHoverWatchdog liveHoverWatchdog; - private final CompositeProjectOvserver projectObserver; + private final ProjectObserver projectObserver; private final WordHighlighter testHightlighter = null; //new WordHighlighter("foo"); - public BootJavaLanguageServer(CompositeJavaProjectFinder javaProjectFinder, SpringPropertyIndexProvider indexProvider) { - this(javaProjectFinder, indexProvider, RunningAppProvider.DEFAULT); - } + private JavaProjectFinder projectFinder; - public BootJavaLanguageServer(CompositeJavaProjectFinder javaProjectFinder, SpringPropertyIndexProvider indexProvider, RunningAppProvider runningAppProvider) { + public BootJavaLanguageServer(LSFactory _params) { super("vscode-boot-java"); + BootJavaLanguageServerParams serverParams = _params.create(this); System.setProperty(LANGUAGE_SERVER_PROCESS_PROPERTY, LANGUAGE_SERVER_PROCESS_PROPERTY); + JavaProjectFinder javaProjectFinder = serverParams.projectFinder; SimpleWorkspaceService workspaceService = getWorkspaceService(); SimpleTextDocumentService documents = getTextDocumentService(); @@ -102,16 +95,16 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { validateWith(doc.getId(), reconcileEngine); }); - ICompletionEngine bootCompletionEngine = createCompletionEngine(javaProjectFinder, indexProvider); + ICompletionEngine bootCompletionEngine = createCompletionEngine(javaProjectFinder, serverParams.indexProvider); completionEngine = createCompletionEngineAdapter(this, bootCompletionEngine); completionEngine.setMaxCompletions(100); documents.onCompletion(completionEngine::getCompletions); documents.onCompletionResolve(completionEngine::resolveCompletion); - BootJavaHoverProvider hoverInfoProvider = createHoverHandler(javaProjectFinder, runningAppProvider); + BootJavaHoverProvider hoverInfoProvider = createHoverHandler(javaProjectFinder, serverParams.runningAppProvider); documents.onHover(hoverInfoProvider); - liveHoverWatchdog = new SpringLiveHoverWatchdog(this, hoverInfoProvider, runningAppProvider); + liveHoverWatchdog = new SpringLiveHoverWatchdog(this, hoverInfoProvider, serverParams.runningAppProvider); documents.onDidChangeContent(params -> { TextDocument doc = params.getDocument(); if (testHightlighter != null) { @@ -139,14 +132,8 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { documents.onCodeLens(codeLensHandler::createCodeLenses); documents.onCodeLensResolve(codeLensHandler::resolveCodeLens); - // Initialize project finders, project caches and project observers - MavenProjectCache mavenProjectCache = new MavenProjectCache(getWorkspaceService().getFileObserver(), MavenCore.getDefault()); - javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); - - GradleProjectCache gradleProjectCache = new GradleProjectCache(getWorkspaceService().getFileObserver(), GradleCore.getDefault()); - javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); - - projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); + projectFinder = serverParams.projectFinder; + projectObserver = serverParams.projectObserver; } public void setMaxCompletionsNumber(int number) { @@ -295,4 +282,13 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { return projectObserver; } + public JavaProjectFinder getProjectFinder() { + return projectFinder; + } + + + public SpringIndexer getSpringIndexer() { + return indexer; + } + } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerParams.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerParams.java new file mode 100644 index 000000000..2f9641e89 --- /dev/null +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerParams.java @@ -0,0 +1,64 @@ +package org.springframework.ide.vscode.boot.java; + +import java.util.Arrays; + +import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider; +import org.springframework.ide.vscode.boot.metadata.DefaultSpringPropertyIndexProvider; +import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider; +import org.springframework.ide.vscode.commons.gradle.GradleCore; +import org.springframework.ide.vscode.commons.gradle.GradleProjectCache; +import org.springframework.ide.vscode.commons.gradle.GradleProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.CompositeProjectOvserver; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; +import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; +import org.springframework.ide.vscode.commons.maven.MavenCore; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectCache; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectFinder; +import org.springframework.ide.vscode.commons.util.FileObserver; + +public class BootJavaLanguageServerParams { + + public final JavaProjectFinder projectFinder; + public final ProjectObserver projectObserver; + public final SpringPropertyIndexProvider indexProvider; + public final RunningAppProvider runningAppProvider; + + public BootJavaLanguageServerParams( + JavaProjectFinder projectFinder, + ProjectObserver projectObserver, + SpringPropertyIndexProvider indexProvider, + RunningAppProvider runningAppProvider) { + super(); + this.projectFinder = projectFinder; + this.projectObserver = projectObserver; + this.indexProvider = indexProvider; + this.runningAppProvider = runningAppProvider; + } + + public static LSFactory createDefault() { + return (SimpleLanguageServer server) -> { + // Initialize project finders, project caches and project observers + FileObserver fileObserver = server.getWorkspaceService().getFileObserver(); + CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); + MavenProjectCache mavenProjectCache = new MavenProjectCache(fileObserver, MavenCore.getDefault()); + javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); + + GradleProjectCache gradleProjectCache = new GradleProjectCache(fileObserver, GradleCore.getDefault()); + javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); + + CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); + + return new BootJavaLanguageServerParams( + javaProjectFinder, + projectObserver, + new DefaultSpringPropertyIndexProvider(javaProjectFinder), + RunningAppProvider.DEFAULT + ); + }; + } + + +} diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Main.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Main.java index a78afc5d3..6570c4074 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Main.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/Main.java @@ -26,9 +26,12 @@ public class Main { public static void main(String[] args) throws IOException, InterruptedException { LaunguageServerApp.start(() -> { + CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder); - SimpleLanguageServer server = new BootJavaLanguageServer(javaProjectFinder, indexProvider); + SimpleLanguageServer server = new BootJavaLanguageServer( + BootJavaLanguageServerParams.createDefault() + ); return server; }); } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/ProjectServices.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/ProjectServices.java new file mode 100644 index 000000000..1c2441d13 --- /dev/null +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/ProjectServices.java @@ -0,0 +1,26 @@ +/******************************************************************************* + * Copyright (c) 2017 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.boot.java; + +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; + +public class ProjectServices { + + public final JavaProjectFinder finder; + public final ProjectObserver observer; + + public ProjectServices(JavaProjectFinder finder, ProjectObserver observer) { + super(); + this.finder = finder; + this.observer = observer; + } +} diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/BootProjectUtil.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/BootProjectUtil.java new file mode 100644 index 000000000..9994c7da6 --- /dev/null +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/BootProjectUtil.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2017 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.boot.java.utils; + +import java.nio.file.Path; + +import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.util.Log; + +public class BootProjectUtil { + + public static boolean isBootProject(IJavaProject jp) { + try { + IClasspath cp = jp.getClasspath(); + if (cp!=null) { + return cp.getClasspathEntries().anyMatch(cpe -> isBootEntry(cpe)); + } + } catch (Exception e) { + Log.log(e); + } + return false; + } + + private static boolean isBootEntry(Path cpe) { + String name = cpe.getFileName().toString(); + return name.endsWith(".jar") && name.startsWith("spring-boot"); + } + +} diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java index 3b0816eef..9bc808287 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java @@ -47,10 +47,12 @@ import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProvider; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; @@ -59,27 +61,13 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; */ public class AutowiredHoverProviderTest { - private CompositeJavaProjectFinder projectFinder; - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; + private BootLanguageServerHarness harness; + private JavaProjectFinder projectFinder; @Before public void setup() throws Exception { - projectFinder = new CompositeJavaProjectFinder(); - - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectFinder, indexHarness.getIndexProvider()); - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + harness = new BootLanguageServerHarness(); + projectFinder = harness.getProjectFinder(); } @Test diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java index 3b2accae8..d299f90b4 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java @@ -22,7 +22,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; @@ -41,16 +40,15 @@ import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.junit.Before; import org.junit.Test; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProvider; import org.springframework.ide.vscode.boot.java.beans.ComponentHoverProvider; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; -import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; @@ -59,27 +57,13 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; */ public class ComponentHoverProviderTest { - private CompositeJavaProjectFinder projectFinder; - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; + private JavaProjectFinder projectFinder; + private BootLanguageServerHarness harness; @Before public void setup() throws Exception { - projectFinder = new CompositeJavaProjectFinder(); - - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectFinder, indexHarness.getIndexProvider()); - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + harness = new BootLanguageServerHarness(); + projectFinder = (d) -> harness.getProjectFinder().find(d); } @Test diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java index 99fb2b5f6..62641f09c 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/SpringIndexerBeansTest.java @@ -30,7 +30,9 @@ import org.springframework.ide.vscode.boot.java.beans.Constants; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; @@ -40,9 +42,8 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; public class SpringIndexerBeansTest { private Map symbolProviders; - private CompositeJavaProjectFinder projectManager; - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; + private BootLanguageServerHarness harness; + private JavaProjectFinder projectFinder; @Before public void setup() throws Exception { @@ -50,27 +51,14 @@ public class SpringIndexerBeansTest { symbolProviders.put(Constants.SPRING_BEAN, new BeansSymbolProvider()); symbolProviders.put(Constants.SPRING_COMPONENT, new ComponentSymbolProvider()); - projectManager = new CompositeJavaProjectFinder(); - - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectManager, indexHarness.getIndexProvider()); - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + harness = new BootLanguageServerHarness(); + projectFinder = harness.getProjectFinder(); harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI())); } @Test public void testScanSimpleConfigurationClass() throws Exception { - SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectManager, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); indexer.initialize(directory.toPath()); @@ -82,7 +70,7 @@ public class SpringIndexerBeansTest { @Test public void testScanSimpleFunctionBean() throws Exception { - SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectManager, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); indexer.initialize(directory.toPath()); @@ -94,7 +82,7 @@ public class SpringIndexerBeansTest { @Test public void testScanSimpleComponentClass() throws Exception { - SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectManager, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); indexer.initialize(directory.toPath()); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java index a2a3c02ad..5dd271b64 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingLiveHoverTest.java @@ -1,46 +1,44 @@ -/******************************************************************************* - * Copyright (c) 2017 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.boot.java.requestmapping.test; - -import org.junit.Before; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; -import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; -import org.springframework.ide.vscode.project.harness.MockRunningAppProvider; -import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; - - -public class RequestMappingLiveHoverTest { - - private CompositeJavaProjectFinder projectManager; - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; - private MockRunningAppProvider mockAppProvider; - - @Before - public void setup() throws Exception { - - projectManager = new CompositeJavaProjectFinder(); - mockAppProvider = new MockRunningAppProvider(); - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(() -> { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectManager, indexHarness.getIndexProvider(), mockAppProvider.provider); - return server; - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; - } - - -} +///******************************************************************************* +// * Copyright (c) 2017 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.boot.java.requestmapping.test; +// +//import org.junit.Before; +//import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; +//import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +//import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +//import org.springframework.ide.vscode.project.harness.MockRunningAppProvider; +//import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; +// +// +//public class RequestMappingLiveHoverTest { +// +// private CompositeJavaProjectFinder projectManager; +// private LanguageServerHarness harness; +// private PropertyIndexHarness indexHarness; +// private MockRunningAppProvider mockAppProvider; +// +// @Before +// public void setup() throws Exception { +// +// mockAppProvider = new MockRunningAppProvider(); +// harness = new LanguageServerHarness(() -> { +// BootJavaLanguageServer server = new BootJavaLanguageServer(indexHarness.getProjectFinder(), indexHarness.getIndexProvider(), mockAppProvider.provider); +// return server; +// }) { +// @Override +// protected String getFileExtension() { +// return ".java"; +// } +// }; +// } +// +// +//} diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java index 8842b1058..178b721b4 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java @@ -18,20 +18,17 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.Callable; import org.eclipse.lsp4j.SymbolInformation; import org.junit.Before; import org.junit.Test; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.requestmapping.Constants; import org.springframework.ide.vscode.boot.java.requestmapping.RequestMappingSymbolProvider; import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; -import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; -import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; /** * @author Martin Lippert @@ -39,37 +36,23 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; public class RequestMappingSymbolProviderTest { private Map symbolProviders; - private CompositeJavaProjectFinder projectManager; - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; + private BootLanguageServerHarness harness; + private JavaProjectFinder projectFinder; @Before public void setup() throws Exception { symbolProviders = new HashMap<>(); symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); - projectManager = new CompositeJavaProjectFinder(); - - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectManager, indexHarness.getIndexProvider()); - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + harness = new BootLanguageServerHarness(); + projectFinder = harness.getProjectFinder(); } @Test public void testSimpleRequestMappingSymbol() throws Exception { harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI())); - SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectManager, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI()); indexer.initialize(directory.toPath()); @@ -83,7 +66,7 @@ public class RequestMappingSymbolProviderTest { public void testParentRequestMappingSymbol() throws Exception { harness.intialize(new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI())); - SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectManager, symbolProviders); + SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI()); indexer.initialize(directory.toPath()); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java index 015ed2639..3c46d0d50 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/scope/test/ScopeCompletionTest.java @@ -13,69 +13,39 @@ package org.springframework.ide.vscode.boot.java.scope.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import java.io.File; import java.io.InputStream; -import java.util.Arrays; import java.util.List; -import java.util.concurrent.Callable; import org.apache.commons.io.IOUtils; import org.eclipse.lsp4j.CompletionItem; import org.junit.Before; import org.junit.Test; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.java.FileBasedJavaProjectFinder; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; -import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; -import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; -import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; /** * @author Martin Lippert */ public class ScopeCompletionTest { - protected final CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(Arrays.asList((JavaProjectFinder)new FileBasedJavaProjectFinder() { - @Override - public IJavaProject find(File doc) { - return getTestProject(); - } - })); - - private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; - private IJavaProject testProject; - + private BootLanguageServerHarness harness; private Editor editor; - @Before public void setup() throws Exception { - testProject = ProjectsHarness.INSTANCE.mavenProject("test-annotations"); - indexHarness = new PropertyIndexHarness(); - - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(javaProjectFinder, indexHarness.getIndexProvider()); - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + IJavaProject testProject = ProjectsHarness.INSTANCE.mavenProject("test-annotations"); + harness = BootLanguageServerHarness.createMocked(); + harness.useProject(testProject); harness.intialize(null); } - private IJavaProject getTestProject() { - return testProject; - } +// private IJavaProject getTestProject() { +// return testProject; +// } @Test public void testEmptyBracketsCompletion() throws Exception { diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java index 9f6b49203..fef850aba 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java @@ -38,6 +38,7 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; @@ -47,36 +48,18 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; public class SpringIndexerTest { private Map symbolProviders; - private CompositeJavaProjectFinder projectFinder; private LanguageServerHarness harness; - private PropertyIndexHarness indexHarness; - private SpringIndexer indexer; + + private SpringIndexer indexer() { + return harness.getServer().getSpringIndexer(); + } + @Before public void setup() throws Exception { symbolProviders = new HashMap<>(); symbolProviders.put(Constants.SPRING_REQUEST_MAPPING, new RequestMappingSymbolProvider()); - - projectFinder = new CompositeJavaProjectFinder(); - - indexHarness = new PropertyIndexHarness(); - harness = new LanguageServerHarness(new Callable() { - @Override - public BootJavaLanguageServer call() throws Exception { - BootJavaLanguageServer server = new BootJavaLanguageServer(projectFinder, indexHarness.getIndexProvider()) { - @Override - protected SpringIndexer createAnnotationIndexer(SimpleLanguageServer server, JavaProjectFinder projectManager) { - return indexer = new SpringIndexer((BootJavaLanguageServer) server, projectFinder, symbolProviders); - } - }; - return server; - } - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + harness = new BootLanguageServerHarness(); } @Test @@ -85,7 +68,7 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - List allSymbols = indexer.getAllSymbols(""); + List allSymbols = indexer().getAllSymbols(""); assertEquals(8, allSymbols.size()); @@ -108,19 +91,19 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); String uriPrefix = "file://" + directory.getAbsolutePath(); - List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/MainClass.java"); + List symbols = indexer().getSymbols(uriPrefix + "/src/main/java/org/test/MainClass.java"); assertEquals(4, symbols.size()); assertTrue(containsSymbol(symbols, "@SpringBootApplication", uriPrefix + "/src/main/java/org/test/MainClass.java", 6, 0, 6, 22)); assertTrue(containsSymbol(symbols, "@/embedded-foo-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 17, 1, 17, 41)); assertTrue(containsSymbol(symbols, "@/foo-root-mapping -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 24, 0, 24, 36)); assertTrue(containsSymbol(symbols, "@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)", uriPrefix + "/src/main/java/org/test/MainClass.java", 27, 1, 27, 51)); - symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java"); + symbols = indexer().getSymbols(uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java"); assertEquals(2, symbols.size()); assertTrue(containsSymbol(symbols, "@/mapping1 -- (no method defined)", uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java", 6, 1, 6, 28)); assertTrue(containsSymbol(symbols, "@/mapping2 -- (no method defined)", uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java", 11, 1, 11, 28)); - symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/sub/MappingClassSubpackage.java"); + symbols = indexer().getSymbols(uriPrefix + "/src/main/java/org/test/sub/MappingClassSubpackage.java"); assertEquals(2, symbols.size()); assertTrue(containsSymbol(symbols, "@/classlevel -- (no method defined)", uriPrefix + "/src/main/java/org/test/sub/MappingClassSubpackage.java", 4, 0, 4, 30)); assertTrue(containsSymbol(symbols, "@/classlevel/mapping-subpackage -- (no method defined)", uriPrefix + "/src/main/java/org/test/sub/MappingClassSubpackage.java", 7, 1, 7, 38)); @@ -132,7 +115,7 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/").toURI()); - List allSymbols = indexer.getAllSymbols(""); + List allSymbols = indexer().getAllSymbols(""); assertEquals(8, allSymbols.size()); @@ -157,18 +140,18 @@ public class SpringIndexerTest { // update document and update index String changedDocURI = "file://" + directory.getAbsolutePath() + "/src/main/java/org/test/SimpleMappingClass.java"; String newContent = FileUtils.readFileToString(new File(new URI(changedDocURI))).replace("mapping1", "mapping1-CHANGED"); - CompletableFuture updateFuture = indexer.updateDocument(changedDocURI, newContent); + CompletableFuture updateFuture = indexer().updateDocument(changedDocURI, newContent); updateFuture.get(5, TimeUnit.SECONDS); // check for updated index per document - List symbols = indexer.getSymbols(changedDocURI); + List symbols = indexer().getSymbols(changedDocURI); assertEquals(2, symbols.size()); assertTrue(containsSymbol(symbols, "@/mapping1-CHANGED -- (no method defined)", changedDocURI, 6, 1, 6, 36)); assertTrue(containsSymbol(symbols, "@/mapping2 -- (no method defined)", changedDocURI, 11, 1, 11, 28)); // check for updated index in all symbols - List allSymbols = indexer.getAllSymbols(""); + List allSymbols = indexer().getAllSymbols(""); assertEquals(8, allSymbols.size()); String uriPrefix = "file://" + directory.getAbsolutePath(); @@ -189,7 +172,7 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - List allSymbols = indexer.getAllSymbols("mapp"); + List allSymbols = indexer().getAllSymbols("mapp"); assertEquals(6, allSymbols.size()); @@ -209,7 +192,7 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - List allSymbols = indexer.getAllSymbols("@/foo-root-mapping -- (no method defined)"); + List allSymbols = indexer().getAllSymbols("@/foo-root-mapping -- (no method defined)"); assertEquals(2, allSymbols.size()); @@ -225,7 +208,7 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - List allSymbols = indexer.getAllSymbols("@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)"); + List allSymbols = indexer().getAllSymbols("@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)"); assertEquals(1, allSymbols.size()); @@ -257,18 +240,18 @@ public class SpringIndexerTest { File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - List allSymbols = indexer.getAllSymbols(""); + List allSymbols = indexer().getAllSymbols(""); assertEquals(8, allSymbols.size()); File pomFile = directory.toPath().resolve(MavenCore.POM_XML).toFile(); - assertFalse(indexer.isInitializing()); + assertFalse(indexer().isInitializing()); harness.changeFile(pomFile.toURI().toString()); // Refresh in progress - assertTrue(indexer.isInitializing()); + assertTrue(indexer().isInitializing()); - allSymbols = indexer.getAllSymbols(""); - assertFalse(indexer.isInitializing()); + allSymbols = indexer().getAllSymbols(""); + assertFalse(indexer().isInitializing()); assertEquals(8, allSymbols.size()); } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java index 910f55424..a3d925a65 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java @@ -11,26 +11,23 @@ package org.springframework.ide.vscode.boot.java.value.test; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -import java.io.File; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.apache.commons.io.IOUtils; import org.eclipse.lsp4j.CompletionItem; import org.junit.Before; import org.junit.Test; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerParams; +import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider; import org.springframework.ide.vscode.boot.java.value.ValueCompletionProcessor; import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.languageserver.java.FileBasedJavaProjectFinder; -import org.springframework.ide.vscode.commons.languageserver.java.CompositeJavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.Editor; -import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; +import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness; import org.springframework.ide.vscode.project.harness.ProjectsHarness; import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; @@ -39,7 +36,7 @@ import org.springframework.ide.vscode.project.harness.PropertyIndexHarness; */ public class ValueCompletionTest { - private LanguageServerHarness harness; + private BootLanguageServerHarness harness; private IJavaProject testProject; private Editor editor; @@ -50,24 +47,15 @@ public class ValueCompletionTest { public void setup() throws Exception { testProject = ProjectsHarness.INSTANCE.mavenProject("test-annotations"); indexHarness = new PropertyIndexHarness(); - - harness = new LanguageServerHarness(() -> { - BootJavaLanguageServer server = new BootJavaLanguageServer( - new CompositeJavaProjectFinder(new ArrayList<>(Collections.singleton(new FileBasedJavaProjectFinder() { - @Override - public IJavaProject find(File doc) { - return getTestProject(); - } - }))), - indexHarness.getIndexProvider() - ); - return server; - }) { - @Override - protected String getFileExtension() { - return ".java"; - } - }; + //Somewhat strange test setup, with a project context finder that finds the test project, + // but doesn't use it in the indexProvider. + BootJavaLanguageServerParams params = new BootJavaLanguageServerParams( + d -> getTestProject(), + ProjectObserver.NULL, + indexHarness.getIndexProvider(), + RunningAppProvider.DEFAULT + ); + harness = new BootLanguageServerHarness(params); harness.intialize(null); } @@ -297,7 +285,9 @@ public class ValueCompletionTest { for (String expectedCompleted : completedAnnotations) { Editor clonedEditor = editor.clone(); clonedEditor.apply(completions.get(i++)); - assertTrue(clonedEditor.getText().contains(expectedCompleted)); + if (!clonedEditor.getText().contains(expectedCompleted)) { + fail("Not found '"+expectedCompleted+"' in \n"+clonedEditor.getText()); + } } assertEquals(i, completions.size()); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java new file mode 100644 index 000000000..f49760464 --- /dev/null +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java @@ -0,0 +1,69 @@ +/******************************************************************************* + * Copyright (c) 2017 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.project.harness; + +import org.junit.Assert; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServer; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerParams; +import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider; +import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; +import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; + +public class BootLanguageServerHarness extends LanguageServerHarness { + + private PropertyIndexHarness indexHarness; + private JavaProjectFinder projectFinder = (doc) -> getServer().getProjectFinder().find(doc); + + /** + * Creates a harness with a 'realistic' language server. I.e. no fake or mocked components. + */ + public BootLanguageServerHarness() throws Exception { + super(() -> new BootJavaLanguageServer(BootJavaLanguageServerParams.createDefault())); + } + + /** + * Creates a harness with custom (potentially mocked) params. + */ + public BootLanguageServerHarness(BootJavaLanguageServerParams params) throws Exception { + super(() -> { + return new BootJavaLanguageServer((server) -> params); + }); + this.projectFinder = params.projectFinder; + } + + + public static BootLanguageServerHarness createMocked() throws Exception { + PropertyIndexHarness indexHarness = new PropertyIndexHarness(); + BootLanguageServerHarness harness = new BootLanguageServerHarness(new BootJavaLanguageServerParams(indexHarness.getProjectFinder(), ProjectObserver.NULL, indexHarness.getIndexProvider(), RunningAppProvider.DEFAULT)); + harness.indexHarness = indexHarness; + return harness; + } + + @Override + protected String getFileExtension() { + return ".java"; + } + + public JavaProjectFinder getProjectFinder() { + return projectFinder; + } + + public PropertyIndexHarness getPropertyIndexHarness() { + Assert.assertNotNull(indexHarness); //only supported in some types of instantations of the harness (i.e. when indexer is controlled by indexer harness. + return indexHarness; + } + + public void useProject(IJavaProject p) throws Exception { + indexHarness.useProject(p); + } +} diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/PropertyIndexHarness.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/PropertyIndexHarness.java index 0295f438c..d0f1d02fa 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/PropertyIndexHarness.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/PropertyIndexHarness.java @@ -18,10 +18,13 @@ import org.springframework.boot.configurationmetadata.ConfigurationMetadataPrope import org.springframework.boot.configurationmetadata.Deprecation; import org.springframework.boot.configurationmetadata.ValueHint; import org.springframework.boot.configurationmetadata.ValueProvider; +import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerParams; import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndex; import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; +import org.springframework.ide.vscode.commons.languageserver.util.LSFactory; import org.springframework.ide.vscode.commons.util.FuzzyMap; import org.springframework.ide.vscode.commons.util.text.IDocument; @@ -559,4 +562,8 @@ public class PropertyIndexHarness { return indexProvider; } + public JavaProjectFinder getProjectFinder() { + return (doc) -> testProject; + } + } diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ProjectObserver.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ProjectObserver.java index 5a37ae412..b07ef2258 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ProjectObserver.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/ProjectObserver.java @@ -24,9 +24,18 @@ public interface ProjectObserver { void created(IJavaProject project); void changed(IJavaProject project); void deleted(IJavaProject project); - } - + } void addListener(Listener listener); void removeListener(Listener listener); + ProjectObserver NULL = new ProjectObserver() { + @Override + public void addListener(Listener listener) { + } + + @Override + public void removeListener(Listener listener) { + } + }; + } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LSFactory.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LSFactory.java new file mode 100644 index 000000000..98a9293f8 --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/LSFactory.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2017 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.commons.languageserver.util; + +/** + * A factory that is aware of the language server context. Use this to inject + * dependencies into a {@link SimpleLanguageServer} implementation when the + * instantiation of the injected component itself depends on the language server (or + * some of its services). + * + * Note: It is starting to 'smell' like we should really be using some kind of dependency + * injection framework to deal with stuff like this. + */ +@FunctionalInterface +public interface LSFactory { + T create(SimpleLanguageServer server); +} diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index aa8e60ac5..f8be6cd7e 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -798,5 +798,4 @@ public class Editor { this.selectionStart = this.selectionEnd = doc.toOffset(position); } - } diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 66566fec0..4aa2fdac2 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -17,7 +17,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; import java.io.File; -import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.nio.file.Files; @@ -613,4 +612,5 @@ public class LanguageServerHarness { public S getServer() { return server; } + }