diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java index a7bde6fce..822125784 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jdtls/JdtLsIndex.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.commons.jdtls; import java.net.URI; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -31,6 +32,8 @@ import org.springframework.ide.vscode.commons.protocol.java.TypeData; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; import com.google.common.base.Suppliers; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -46,6 +49,8 @@ public class JdtLsIndex implements ClasspathIndex { private final URI projectUri; private final JdtLsJavadocProvider javadocProvider; + private Cache> cache = CacheBuilder.newBuilder().expireAfterAccess(10, TimeUnit.SECONDS).build(); + public JdtLsIndex(STS4LanguageClient client, URI projectUri) { this.client = client; this.projectUri = projectUri; @@ -64,16 +69,23 @@ public class JdtLsIndex implements ClasspathIndex { @Override public IType findType(String fqName) { - JavaDataParams params = new JavaDataParams(projectUri.toString(), "L" + fqName.replace('.', '/') + ";", false); try { - TypeData data = client.javaType(params).get(500, TimeUnit.MILLISECONDS); - if (data != null) { - return toType(data); - } - } catch (InterruptedException | ExecutionException | TimeoutException e) { - log.error("", e); + return cache.get(fqName, () -> { + JavaDataParams params = new JavaDataParams(projectUri.toString(), "L" + fqName.replace('.', '/') + ";", false); + try { + TypeData data = client.javaType(params).get(500, TimeUnit.MILLISECONDS); + if (data != null) { + return Optional.ofNullable(toType(data)); + } + } catch (InterruptedException | ExecutionException | TimeoutException e) { + log.error("", e); + } + return Optional.empty(); + }).orElse(null); + } catch (ExecutionException e) { + log.error("{}", e); + return null; } - return null; } @Override diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml index d9dbd2dbd..2b66fb44e 100644 --- a/headless-services/spring-boot-language-server/pom.xml +++ b/headless-services/spring-boot-language-server/pom.xml @@ -43,6 +43,11 @@ ${dependencies.version} + + org.springframework.boot + spring-boot-configuration-processor + true + org.springframework.ide.eclipse 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 19240a66c..c6be1b3e5 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 @@ -88,8 +88,8 @@ public class BootLanguagServerBootApp { } @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") - @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { - return BootLanguageServerParams.createDefault(server, valueProviders); + @Bean BootLanguageServerParams serverParams(SimpleLanguageServer server, ValueProviderRegistry valueProviders, BootLsConfigProperties configProperties) { + return BootLanguageServerParams.createDefault(server, valueProviders, configProperties.isEnableJandexIndex()); } @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 db070560c..ef64ec887 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 @@ -87,11 +87,11 @@ public class BootLanguageServerParams { this.watchDogInterval = watchDogInterval; } - public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders) { + public static BootLanguageServerParams createDefault(SimpleLanguageServer server, ValueProviderRegistry valueProviders, boolean isJandexIndex) { // Initialize project finders, project caches and project observers JavaProjectsService jdtProjectCache = new JavaProjectsServiceWithFallback( server, - new JdtLsProjectCache(server), + new JdtLsProjectCache(server, isJandexIndex), () -> createFallbackProjectCache(server) ); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java new file mode 100644 index 000000000..16dc2e755 --- /dev/null +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLsConfigProperties.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * Copyright (c) 2019 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.boot.app; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties("languageserver.boot") +public class BootLsConfigProperties { + + /** + * Enables/disables Jandex indexing of Java types. When disabled JDT LS will be + * used for type and package searches, type finding for FQ name etc. + */ + private boolean enableJandexIndex = false; + + public boolean isEnableJandexIndex() { + return enableJandexIndex; + } + + public void setEnableJandexIndex(boolean enableJandexIndex) { + this.enableJandexIndex = enableJandexIndex; + } + + +} 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 e8eb980f9..95ff82ac3 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 @@ -43,15 +43,16 @@ import reactor.core.publisher.Mono; public class JdtLsProjectCache implements InitializableJavaProjectsService { - private static final boolean IS_JANDEX_INDEX = Boolean.getBoolean("sts.lsp.jandex.index"); + private final boolean IS_JANDEX_INDEX; private SimpleLanguageServer server; private Map table = new HashMap(); private Logger log = LoggerFactory.getLogger(JdtLsProjectCache.class); private List listeners = new ArrayList<>(); - public JdtLsProjectCache(SimpleLanguageServer server) { + public JdtLsProjectCache(SimpleLanguageServer server, boolean isJandexIndex) { this.server = server; + this.IS_JANDEX_INDEX = isJandexIndex; } private FileObserver getFileObserver() {