From 1e3f0adcf35f925c00b47631f43149e83e3fcdb3 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Tue, 10 Mar 2020 17:16:58 -0400 Subject: [PATCH] PT #171730730 Move classpath fallback calculation in tests --- headless-services/commons/pom.xml | 2 +- .../spring-boot-language-server/pom.xml | 24 ++- .../boot/app/BootLanguagServerBootApp.java | 13 +- .../boot/app/BootLanguageServerParams.java | 103 +--------- .../app/PropertiesJavaDefinitionHandler.java | 3 +- .../BeanInjectedIntoHoverProvider.java | 5 +- .../ls/JavaProjectsServiceWithFallback.java | 182 ------------------ .../vscode/boot/jdt/ls/JdtLsProjectCache.java | 13 +- .../boot/bootiful/BootLanguageServerTest.java | 4 +- .../vscode/boot/bootiful/HoverTestConf.java | 4 +- .../vscode/boot/bootiful/JavaTestConf.java | 82 ++++++++ .../boot/bootiful/SourceLinksTestConf.java | 4 +- .../boot/bootiful/SymbolProviderTestConf.java | 4 +- .../boot/bootiful/XmlBeansTestConf.java | 4 +- .../utils/test/CompilationUnitCacheTest.java | 4 +- .../java/value/test/ValueCompletionTest.java | 4 +- .../harness/BootLanguageServerHarness.java | 44 ++++- 17 files changed, 191 insertions(+), 308 deletions(-) delete mode 100644 headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JavaProjectsServiceWithFallback.java create mode 100644 headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/JavaTestConf.java diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 5600bce91..df6a906ba 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -117,7 +117,7 @@ 3.1.5.RELEASE 0.7.5.RELEASE 2.4 - 1.11 + 1.13 true pivotal diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml index 17f30ba3d..892761079 100644 --- a/headless-services/spring-boot-language-server/pom.xml +++ b/headless-services/spring-boot-language-server/pom.xml @@ -80,12 +80,7 @@ org.springframework.ide.vscode - commons-maven - ${dependencies.version} - - - org.springframework.ide.vscode - commons-gradle + commons-java ${dependencies.version} @@ -103,6 +98,10 @@ commons-io ${commons-io-version} + + commons-codec + commons-codec + org.json json @@ -149,6 +148,19 @@ ${mockito-version} test + + + org.springframework.ide.vscode + commons-maven + ${dependencies.version} + test + + + org.springframework.ide.vscode + commons-gradle + ${dependencies.version} + test + diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java index 1702e34d1..95eaa5ce6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguagServerBootApp.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2020 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 @@ -36,6 +36,8 @@ import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache; import org.springframework.ide.vscode.boot.java.utils.SymbolCache; import org.springframework.ide.vscode.boot.java.utils.SymbolCacheOnDisc; import org.springframework.ide.vscode.boot.java.utils.SymbolCacheVoid; +import org.springframework.ide.vscode.boot.jdt.ls.JavaProjectsService; +import org.springframework.ide.vscode.boot.jdt.ls.JdtLsProjectCache; import org.springframework.ide.vscode.boot.metadata.AdHocSpringPropertyIndexProvider; import org.springframework.ide.vscode.boot.metadata.ClassReferenceProvider; import org.springframework.ide.vscode.boot.metadata.LoggerNameProvider; @@ -116,10 +118,15 @@ public class BootLanguagServerBootApp { r.def("class-reference", ClassReferenceProvider.factory(sourceLinks)); }; } + + @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") + @Bean JavaProjectsService javaProjectsService(SimpleLanguageServer server, BootLsConfigProperties configProperties) { + return new JdtLsProjectCache(server, configProperties.isEnableJandexIndex()); + } @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") - @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, BootLsConfigProperties configProperties) { - return BootLanguageServerParams.createDefault(server, valueProviders, configProperties.isEnableJandexIndex()); + @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService projectsService) { + return BootLanguageServerParams.createDefault(server, valueProviders, projectsService); } @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java index de4f3380f..851dd14bc 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerParams.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 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 @@ -10,38 +10,18 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.app; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collection; -import java.util.Optional; - import org.eclipse.lsp4j.TextDocumentIdentifier; import org.springframework.ide.vscode.boot.java.links.SourceLinks; import org.springframework.ide.vscode.boot.jdt.ls.JavaProjectsService; -import org.springframework.ide.vscode.boot.jdt.ls.JavaProjectsServiceWithFallback; -import org.springframework.ide.vscode.boot.jdt.ls.JdtLsProjectCache; import org.springframework.ide.vscode.boot.metadata.DefaultSpringPropertyIndexProvider; import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.boot.metadata.ValueProviderRegistry; import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; import org.springframework.ide.vscode.boot.metadata.types.TypeUtilProvider; -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.java.IJavaProject; -import org.springframework.ide.vscode.commons.java.IJavadocProvider; import org.springframework.ide.vscode.commons.java.SpringProjectUtil; -import org.springframework.ide.vscode.commons.javadoc.JavaDocProviders; -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.JavadocService; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; 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.protocol.java.Classpath.CPE; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.FileObserver; import org.springframework.ide.vscode.commons.util.text.IDocument; @@ -83,89 +63,18 @@ public class BootLanguageServerParams { this.typeUtilProvider = typeUtilProvider; } - public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders, boolean isJandexIndex) { + public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders, JavaProjectsService javaProjectService) { // Initialize project finders, project caches and project observers - JavaProjectsService jdtProjectCache = new JavaProjectsServiceWithFallback( - server, - new JdtLsProjectCache(server, isJandexIndex), - () -> createFallbackProjectCache(server) - ); - FileObserver fileObserver = server.getWorkspaceService().getFileObserver(); - DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(jdtProjectCache, jdtProjectCache, fileObserver, valueProviders); + DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectService, javaProjectService, fileObserver, valueProviders); indexProvider.setProgressService(server.getProgressService()); return new BootLanguageServerParams( - jdtProjectCache.filter(project -> SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)), - jdtProjectCache, + javaProjectService.filter(project -> SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)), + javaProjectService, indexProvider, - (SourceLinks sourceLinks, IDocument doc) -> new TypeUtil(sourceLinks, jdtProjectCache.find(new TextDocumentIdentifier(doc.getUri()))) + (SourceLinks sourceLinks, IDocument doc) -> new TypeUtil(sourceLinks, javaProjectService.find(new TextDocumentIdentifier(doc.getUri()))) ); } - private static JavaProjectsService createFallbackProjectCache(SimpleLanguageServer server) { - CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); - - JavadocService javadocService = (uri, cpe) -> JavaDocProviders.createFor(cpe); - - MavenProjectCache mavenProjectCache = new MavenProjectCache(server, MavenCore.getDefault(), true, Paths.get(IJavaProject.PROJECT_CACHE_FOLDER), javadocService); - javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); - - GradleProjectCache gradleProjectCache = new GradleProjectCache(server, GradleCore.getDefault(), true, Paths.get(IJavaProject.PROJECT_CACHE_FOLDER), javadocService); - javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); - - CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); - - return new JavaProjectsService() { - - @Override - public void removeListener(Listener listener) { - projectObserver.removeListener(listener); - } - - @Override - public void addListener(Listener listener) { - projectObserver.addListener(listener); - } - - @Override - public Optional find(TextDocumentIdentifier doc) { - return javaProjectFinder.find(doc); - } - - @Override - public IJavadocProvider javadocProvider(String projectUri, CPE cpe) { - return javadocService.javadocProvider(projectUri, cpe); - } - - @Override - public Collection all() { - return javaProjectFinder.all(); - } - }; - } - - public static BootLanguageServerParams createTestDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { - // Initialize project finders, project caches and project observers - CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); - MavenProjectCache mavenProjectCache = new MavenProjectCache(server, MavenCore.getDefault(), false, null, (uri, cpe) -> JavaDocProviders.createFor(cpe)); - mavenProjectCache.setAlwaysFireEventOnFileChanged(true); - javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); - - GradleProjectCache gradleProjectCache = new GradleProjectCache(server, GradleCore.getDefault(), false, null, (uri, cpe) -> JavaDocProviders.createFor(cpe)); - gradleProjectCache.setAlwaysFireEventOnFileChanged(true); - javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); - - CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); - - DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder, projectObserver, null, valueProviders); - indexProvider.setProgressService(server.getProgressService()); - - return new BootLanguageServerParams( - javaProjectFinder.filter(project -> SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)), - projectObserver, - indexProvider, - (SourceLinks sourceLinks, IDocument doc) -> new TypeUtil(sourceLinks, javaProjectFinder.find(new TextDocumentIdentifier(doc.getUri()))) - ); - } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/PropertiesJavaDefinitionHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/PropertiesJavaDefinitionHandler.java index cc6db4212..b5491b6ec 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/PropertiesJavaDefinitionHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/PropertiesJavaDefinitionHandler.java @@ -17,7 +17,6 @@ import java.util.stream.Collectors; import org.eclipse.lsp4j.LocationLink; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentPositionParams; -import org.gradle.internal.impldep.com.google.common.collect.ImmutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +41,8 @@ import org.springframework.ide.vscode.java.properties.parser.PropertiesAst.Node; import org.springframework.ide.vscode.java.properties.parser.PropertiesAst.Value; import org.springframework.stereotype.Component; +import com.google.common.collect.ImmutableList; + @Component public class PropertiesJavaDefinitionHandler implements DefinitionHandler, LanguageSpecific { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/BeanInjectedIntoHoverProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/BeanInjectedIntoHoverProvider.java index 09345a77a..c531304b2 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/BeanInjectedIntoHoverProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/BeanInjectedIntoHoverProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 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 @@ -21,7 +21,6 @@ import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.lsp4j.CodeLens; import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.Range; -import org.gradle.internal.impldep.com.google.common.collect.ImmutableList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.java.autowired.AutowiredHoverProvider; @@ -33,6 +32,8 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.util.Optionals; import org.springframework.ide.vscode.commons.util.text.TextDocument; +import com.google.common.collect.ImmutableList; + public class BeanInjectedIntoHoverProvider extends AbstractInjectedIntoHoverProvider { private static final Logger log = LoggerFactory.getLogger(BeanInjectedIntoHoverProvider.class); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JavaProjectsServiceWithFallback.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JavaProjectsServiceWithFallback.java deleted file mode 100644 index 8ad76af2b..000000000 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JavaProjectsServiceWithFallback.java +++ /dev/null @@ -1,182 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2018, 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.jdt.ls; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; - -import org.eclipse.lsp4j.TextDocumentIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.ide.vscode.commons.java.IJavaProject; -import org.springframework.ide.vscode.commons.java.IJavadocProvider; -import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; -import org.springframework.ide.vscode.commons.protocol.java.Classpath.CPE; -import org.springframework.ide.vscode.commons.util.Assert; - -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; -import com.google.common.collect.ImmutableList; - -import reactor.core.Disposable; - -public class JavaProjectsServiceWithFallback implements JavaProjectsService { - - private Logger log = LoggerFactory.getLogger(JavaProjectsServiceWithFallback.class); - - private final CompletableFuture mainServiceInitialized; - - private final SimpleLanguageServer server; - private final Supplier fallback; - private final InitializableJavaProjectsService main; - - private final Listener listenerDelegate; - private final List listeners; - - public JavaProjectsServiceWithFallback(SimpleLanguageServer server, InitializableJavaProjectsService main, Supplier fallback) { - Assert.isNotNull(fallback); - this.main = main; - this.fallback = Suppliers.memoize(new Supplier() { - @Override - public JavaProjectsService get() { - JavaProjectsService fallbackService = fallback.get(); - fallbackService.addListener(listenerDelegate); - return fallbackService; - } - }); - - this.server = server; - this.listeners = new ArrayList<>(); - - this.listenerDelegate = new Listener() { - @Override - public void deleted(IJavaProject project) { - notifyDelete(project); - } - - @Override - public void created(IJavaProject project) { - notifyCreated(project); - } - - @Override - public void changed(IJavaProject project) { - notifyChanged(project); - } - }; - this.main.addListener(this.listenerDelegate); - - this.mainServiceInitialized = this.server - .onInitialized(main.initialize()) - .doOnSuccess((disposable) -> { - server.onShutdown(() -> { - disposable.dispose(); - }); - }) - .doOnError(error -> { - log.warn("JDT-based JavaProject service not available, will use fallback service", error); - }) - .toFuture(); - - log.info("set fallback shutdown handler"); - } - - @Override - public void addListener(Listener listener) { - synchronized (listeners) { - listeners.add(listener); - } - } - - @Override - public void removeListener(Listener listener) { - synchronized (listeners) { - listeners.remove(listener); - } - } - - private void notifyCreated(IJavaProject newProject) { - log.info("Project created: " + newProject.getLocationUri()); - - synchronized (listeners) { - for (Listener listener : listeners) { - listener.created(newProject); - } - } - } - - private void notifyDelete(IJavaProject deleted) { - log.info("Project deleted: " + deleted.getLocationUri()); - - synchronized (listeners) { - for (Listener listener : listeners) { - listener.deleted(deleted); - } - } - } - - private void notifyChanged(IJavaProject project) { - log.info("Project changed: " + project.getLocationUri()); - - synchronized (listeners) { - for (Listener listener : listeners) { - listener.changed(project); - } - } - } - - @Override - public Optional find(TextDocumentIdentifier doc) { - if (mainServiceInitialized.isDone()) { - if (mainServiceInitialized.isCompletedExceptionally()) { - return fallback.get().find(doc); - } else { - return main.find(doc); - } - } else { - log.debug("find => NOT INITIALIZED YET"); - } - log.debug("NOT FOUND {} ", doc.getUri()); - return Optional.empty(); - } - - @Override - public IJavadocProvider javadocProvider(String projectUri, CPE classpathEntry) { - if (mainServiceInitialized.isDone()) { - if (mainServiceInitialized.isCompletedExceptionally()) { - return fallback.get().javadocProvider(projectUri, classpathEntry); - } else { - return main.javadocProvider(projectUri, classpathEntry); - } - } else { - log.debug("javadoc => NOT INITIALIZED YET"); - } - return IJavadocProvider.NULL; - } - - @Override - public Collection all() { - if (mainServiceInitialized.isDone()) { - if (mainServiceInitialized.isCompletedExceptionally()) { - return fallback.get().all(); - } else { - return main.all(); - } - } else { - log.debug("find => NOT INITIALIZED YET"); - } - return ImmutableList.of(); - } - -} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java index f0ab7efc4..758ce9f2a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2020 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 @@ -59,6 +59,17 @@ public class JdtLsProjectCache implements InitializableJavaProjectsService { public JdtLsProjectCache(SimpleLanguageServer server, boolean isJandexIndex) { this.server = server; this.IS_JANDEX_INDEX = isJandexIndex; + this.server + .onInitialized(initialize()) + .doOnSuccess((disposable) -> { + server.onShutdown(() -> { + disposable.dispose(); + }); + }) + .doOnError(error -> { + log.error("JDT-based JavaProject service not available!", error); + }) + .toFuture(); } private FileObserver getFileObserver() { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/BootLanguageServerTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/BootLanguageServerTest.java index b7bc9c24f..305344e40 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/BootLanguageServerTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/BootLanguageServerTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Pivotal, Inc. + * Copyright (c) 2018-2020 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 @@ -27,7 +27,7 @@ import org.springframework.test.annotation.DirtiesContext.ClassMode; @Retention(RUNTIME) @Target(TYPE) @OverrideAutoConfiguration(enabled=false) -@ImportAutoConfiguration(classes=LanguageServerAutoConf.class) +@ImportAutoConfiguration(classes= {LanguageServerAutoConf.class, JavaTestConf.class}) @SpringBootTest(classes={ BootLanguagServerBootApp.class }) diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/HoverTestConf.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/HoverTestConf.java index 74fc5d9ee..b5ca29598 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/HoverTestConf.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/HoverTestConf.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2020 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 @@ -42,7 +42,7 @@ public class HoverTestConf { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, PropertyIndexHarness indexHarness) { - BootLanguageServerParams testDefaults = BootLanguageServerParams.createTestDefault(server, valueProviders); + BootLanguageServerParams testDefaults = BootLanguageServerHarness.createTestDefault(server, valueProviders); return new BootLanguageServerParams( indexHarness.getProjectFinder(), testDefaults.projectObserver, diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/JavaTestConf.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/JavaTestConf.java new file mode 100644 index 000000000..f35c3c95c --- /dev/null +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/JavaTestConf.java @@ -0,0 +1,82 @@ +/******************************************************************************* + * Copyright (c) 2020 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.bootiful; + +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.Optional; + +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.ide.vscode.boot.jdt.ls.JavaProjectsService; +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.java.IJavaProject; +import org.springframework.ide.vscode.commons.java.IJavadocProvider; +import org.springframework.ide.vscode.commons.javadoc.JavaDocProviders; +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.JavadocService; +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.protocol.java.Classpath.CPE; + +@Configuration +public class JavaTestConf { + + @Bean JavaProjectsService javaProjectsService(SimpleLanguageServer server) { + CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); + + JavadocService javadocService = (uri, cpe) -> JavaDocProviders.createFor(cpe); + + MavenProjectCache mavenProjectCache = new MavenProjectCache(server, MavenCore.getDefault(), true, Paths.get(IJavaProject.PROJECT_CACHE_FOLDER), javadocService); + javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); + + GradleProjectCache gradleProjectCache = new GradleProjectCache(server, GradleCore.getDefault(), true, Paths.get(IJavaProject.PROJECT_CACHE_FOLDER), javadocService); + javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); + + CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); + + return new JavaProjectsService() { + + @Override + public void removeListener(Listener listener) { + projectObserver.removeListener(listener); + } + + @Override + public void addListener(Listener listener) { + projectObserver.addListener(listener); + } + + @Override + public Optional find(TextDocumentIdentifier doc) { + return javaProjectFinder.find(doc); + } + + @Override + public IJavadocProvider javadocProvider(String projectUri, CPE cpe) { + return javadocService.javadocProvider(projectUri, cpe); + } + + @Override + public Collection all() { + return javaProjectFinder.all(); + } + }; + } + +} diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SourceLinksTestConf.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SourceLinksTestConf.java index 18a202268..2ce2ec818 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SourceLinksTestConf.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SourceLinksTestConf.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019-2020 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 @@ -52,7 +52,7 @@ public class SourceLinksTestConf { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { - BootLanguageServerParams testDefaults = BootLanguageServerParams.createTestDefault(server, valueProviders); + BootLanguageServerParams testDefaults = BootLanguageServerHarness.createTestDefault(server, valueProviders); return new BootLanguageServerParams( testDefaults.projectFinder, new MockProjectObserver(), diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SymbolProviderTestConf.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SymbolProviderTestConf.java index 201fe3b28..486eae3c9 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SymbolProviderTestConf.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/SymbolProviderTestConf.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018, 2019 Pivotal, Inc. + * Copyright (c) 2018, 2020 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 @@ -47,7 +47,7 @@ public class SymbolProviderTestConf { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { - return BootLanguageServerParams.createTestDefault(server, valueProviders); + return BootLanguageServerHarness.createTestDefault(server, valueProviders); } @Bean DefaultSpringPropertyIndexProvider indexProvider(BootLanguageServerParams serverParams) { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/XmlBeansTestConf.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/XmlBeansTestConf.java index 065f594df..f603b792b 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/XmlBeansTestConf.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/bootiful/XmlBeansTestConf.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2020 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 @@ -51,7 +51,7 @@ public class XmlBeansTestConf { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, PropertyIndexHarness indexHarness) { - BootLanguageServerParams testDefaults = BootLanguageServerParams.createTestDefault(server, valueProviders); + BootLanguageServerParams testDefaults = BootLanguageServerHarness.createTestDefault(server, valueProviders); return new BootLanguageServerParams( indexHarness.getProjectFinder(), new MockProjectObserver(), diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java index 570f8f03b..9a0b37c18 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/CompilationUnitCacheTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 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 @@ -95,7 +95,7 @@ public class CompilationUnitCacheTest { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, MockProjectObserver projectObserver, ValueProviderRegistry valueProviders, PropertyIndexHarness indexHarness) { - BootLanguageServerParams testDefaults = BootLanguageServerParams.createTestDefault(server, valueProviders); + BootLanguageServerParams testDefaults = BootLanguageServerHarness.createTestDefault(server, valueProviders); return new BootLanguageServerParams( indexHarness.getProjectFinder(), projectObserver, diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java index c1fb6a8e6..30dda51f3 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueCompletionTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 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 @@ -108,7 +108,7 @@ public class ValueCompletionTest { } @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, JavaProjectFinder projectFinder, ValueProviderRegistry valueProviders, PropertyIndexHarness indexHarness) { - BootLanguageServerParams testDefaults = BootLanguageServerParams.createTestDefault(server, valueProviders); + BootLanguageServerParams testDefaults = BootLanguageServerHarness.createTestDefault(server, valueProviders); return new BootLanguageServerParams( projectFinder, ProjectObserver.NULL, diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java index 477fa1ac9..40e5488fe 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/project/harness/BootLanguageServerHarness.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2020 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 @@ -12,16 +12,33 @@ package org.springframework.ide.vscode.project.harness; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Arrays; +import org.eclipse.lsp4j.TextDocumentIdentifier; import org.junit.Assert; import org.springframework.ide.vscode.boot.app.BootLanguageServerParams; import org.springframework.ide.vscode.boot.editor.harness.PropertyIndexHarness; +import org.springframework.ide.vscode.boot.java.links.SourceLinks; +import org.springframework.ide.vscode.boot.metadata.DefaultSpringPropertyIndexProvider; +import org.springframework.ide.vscode.boot.metadata.ValueProviderRegistry; +import org.springframework.ide.vscode.boot.metadata.types.TypeUtil; +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.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.java.SpringProjectUtil; +import org.springframework.ide.vscode.commons.javadoc.JavaDocProviders; +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.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.protocol.java.Classpath; import org.springframework.ide.vscode.commons.protocol.java.Classpath.CPE; +import org.springframework.ide.vscode.commons.util.text.IDocument; import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; @@ -144,5 +161,30 @@ public class BootLanguageServerHarness extends LanguageServerHarness { } return null; } + + public static BootLanguageServerParams createTestDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { + // Initialize project finders, project caches and project observers + CompositeJavaProjectFinder javaProjectFinder = new CompositeJavaProjectFinder(); + MavenProjectCache mavenProjectCache = new MavenProjectCache(server, MavenCore.getDefault(), false, null, (uri, cpe) -> JavaDocProviders.createFor(cpe)); + mavenProjectCache.setAlwaysFireEventOnFileChanged(true); + javaProjectFinder.addJavaProjectFinder(new MavenProjectFinder(mavenProjectCache)); + + GradleProjectCache gradleProjectCache = new GradleProjectCache(server, GradleCore.getDefault(), false, null, (uri, cpe) -> JavaDocProviders.createFor(cpe)); + gradleProjectCache.setAlwaysFireEventOnFileChanged(true); + javaProjectFinder.addJavaProjectFinder(new GradleProjectFinder(gradleProjectCache)); + + CompositeProjectOvserver projectObserver = new CompositeProjectOvserver(Arrays.asList(mavenProjectCache, gradleProjectCache)); + + DefaultSpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder, projectObserver, null, valueProviders); + indexProvider.setProgressService(server.getProgressService()); + + return new BootLanguageServerParams( + javaProjectFinder.filter(project -> SpringProjectUtil.isBootProject(project) || SpringProjectUtil.isSpringProject(project)), + projectObserver, + indexProvider, + (SourceLinks sourceLinks, IDocument doc) -> new TypeUtil(sourceLinks, javaProjectFinder.find(new TextDocumentIdentifier(doc.getUri()))) + ); + } + }