diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java index e58b8f265..e7382ad4c 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java @@ -37,9 +37,11 @@ import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoCon import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; +import org.springframework.ide.vscode.boot.common.ProjectReconcileScheduler; import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory; import org.springframework.ide.vscode.boot.common.RelaxedNameConfig; import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeActionProvider; +import org.springframework.ide.vscode.boot.java.handlers.BootJavaProjectReconcilerScheduler; import org.springframework.ide.vscode.boot.java.handlers.BootJavaReconcileEngine; import org.springframework.ide.vscode.boot.java.handlers.JavaCodeActionHandler; import org.springframework.ide.vscode.boot.java.links.DefaultJavaElementLocationProvider; @@ -70,9 +72,11 @@ import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexPro import org.springframework.ide.vscode.boot.metadata.SpringPropertyIndex; import org.springframework.ide.vscode.boot.metadata.ValueProviderRegistry; import org.springframework.ide.vscode.boot.properties.completions.SpringPropertiesCompletionEngine; +import org.springframework.ide.vscode.boot.validation.BootVersionValidationEngine; import org.springframework.ide.vscode.boot.xml.SpringXMLCompletionEngine; import org.springframework.ide.vscode.boot.yaml.completions.ApplicationYamlAssistContext; import org.springframework.ide.vscode.boot.yaml.completions.SpringYamlCompletionEngine; +import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.LanguageServerRunner; import org.springframework.ide.vscode.commons.languageserver.java.FutureProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; @@ -339,13 +343,54 @@ public class BootLanguageServerBootApp { } @Bean - BootJavaReconcileEngine getBootJavaReconcileEngine(JavaProjectFinder projectFinder, JavaReconciler[] javaReconcilers, SimpleLanguageServer server, - BootJavaConfig config, ProjectObserver projectObserver, Optional recipeRepoOpt) { - return new BootJavaReconcileEngine(projectFinder, javaReconcilers, server, config, projectObserver, recipeRepoOpt.orElse(null)); + BootJavaReconcileEngine getBootJavaReconcileEngine(JavaProjectFinder projectFinder, JavaReconciler[] javaReconcilers, SimpleLanguageServer server) { + return new BootJavaReconcileEngine(projectFinder, javaReconcilers, server); } @Bean BootJavaCodeActionProvider getBootJavaCodeActionProvider(JavaProjectFinder projectFinder, Collection codeActionHandlers) { return new BootJavaCodeActionProvider(projectFinder, codeActionHandlers); } + + @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") + @Bean + BootJavaProjectReconcilerScheduler bootJavaProjectReconcilerScheduler(SimpleLanguageServer server, + BootJavaReconcileEngine bootJavaReconciler, ProjectObserver projectObserver, BootJavaConfig config, + Optional recipeRepoOpt, JavaProjectFinder projectFinder) { + return new BootJavaProjectReconcilerScheduler(bootJavaReconciler, + server.getWorkspaceService().getFileObserver(), projectObserver, config, recipeRepoOpt.orElse(null), + server.getTextDocumentService(), projectFinder); + } + + @ConditionalOnMissingClass("org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness") + @Bean + ProjectReconcileScheduler bootVersionValidationScheduler(SimpleLanguageServer server, JavaProjectFinder projectFinder, BootJavaConfig config, ProjectObserver projectObserver) { + return new ProjectReconcileScheduler(new BootVersionValidationEngine(server, config, projectObserver, projectFinder), projectFinder) { + + @Override + protected void init() { + super.init(); + config.addListener(evt -> scheduleValidationForAllProjects()); + projectObserver.addListener(new ProjectObserver.Listener() { + + @Override + public void deleted(IJavaProject project) { + unscheduleValidation(project); + clear(project, true); + } + + @Override + public void created(IJavaProject project) { + scheduleValidation(project); + } + + @Override + public void changed(IJavaProject project) { + scheduleValidation(project); + } + }); + } + + }; + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java index 5bd4f7e67..a6be28d96 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java @@ -10,7 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.app; -import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; @@ -19,7 +18,6 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.ApplicationContext; -import org.springframework.ide.vscode.boot.common.IJavaProjectReconcileEngine; import org.springframework.ide.vscode.boot.common.ProjectReconcileScheduler; import org.springframework.ide.vscode.boot.factories.SpringFactoriesLanguageServerComponents; import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; @@ -31,7 +29,6 @@ import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache; import org.springframework.ide.vscode.boot.java.utils.SymbolCache; import org.springframework.ide.vscode.boot.metadata.ProjectBasedPropertyIndexProvider; import org.springframework.ide.vscode.boot.properties.BootPropertiesLanguageServerComponents; -import org.springframework.ide.vscode.boot.validation.BootVersionValidationEngine; import org.springframework.ide.vscode.boot.xml.SpringXMLLanguageServerComponents; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.completion.CompositeCompletionEngine; @@ -72,6 +69,7 @@ public class BootLanguageServerInitializer implements InitializingBean { @Autowired private JavaProjectFinder projectFinder; @Autowired private LanguageServerProperties configProps; @Autowired(required = false) private RewriteRecipeRepository recipesRepo; + @Autowired(required = false) private ProjectReconcileScheduler[] reconcileSchedulers; @Qualifier("adHocProperties") @Autowired ProjectBasedPropertyIndexProvider adHocProperties; @@ -123,27 +121,16 @@ public class BootLanguageServerInitializer implements InitializingBean { new SpringFactoriesLanguageServerComponents(projectFinder, springIndexer, config) ); - List reconcileSchedulers = new ArrayList<>(componentsList.size() + 1); for (LanguageServerComponents c : componentsList) { - builder.add(c); - - if (!configProps.isReconcileOnlyOpenedDocs()) { - c.getReconcileEngine() - .filter(IJavaProjectReconcileEngine.class::isInstance) - .map(IJavaProjectReconcileEngine.class::cast) - .map(r -> r.getScheduler()) - .ifPresent(reconcileSchedulers::add); - } + builder.add(c); } - // Version reconciler is for Maven/Gradle build files which are not part of - // server components because they come from docs we don't support at the moment - reconcileSchedulers.add(new BootVersionValidationEngine(server, config, params.projectObserver, projectFinder).getScheduler()); - - // Kick off project reconcile schedulers - for (ProjectReconcileScheduler scheduler : reconcileSchedulers) { - scheduler.start(); - server.onShutdown(() -> scheduler.stop()); + if (reconcileSchedulers != null && !configProps.isReconcileOnlyOpenedDocs()) { + // Kick off project reconcile schedulers + for (ProjectReconcileScheduler scheduler : reconcileSchedulers) { + scheduler.start(); + server.onShutdown(() -> scheduler.stop()); + } } components = builder.build(server); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/common/IJavaProjectReconcileEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/common/IJavaProjectReconcileEngine.java index 45173ac51..6472951a8 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/common/IJavaProjectReconcileEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/common/IJavaProjectReconcileEngine.java @@ -18,6 +18,4 @@ public interface IJavaProjectReconcileEngine { void clear(IJavaProject project); - ProjectReconcileScheduler getScheduler(); - } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java index 0fd137800..899f73f87 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java @@ -24,15 +24,11 @@ import java.util.stream.Stream; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.boot.common.IJavaProjectReconcileEngine; -import org.springframework.ide.vscode.boot.common.ProjectReconcileScheduler; import org.springframework.ide.vscode.boot.java.reconcilers.JavaReconciler; -import org.springframework.ide.vscode.boot.java.rewrite.RewriteRecipeRepository; import org.springframework.ide.vscode.commons.java.IClasspathUtil; 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.commons.languageserver.reconcile.IProblemCollector; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; @@ -52,24 +48,13 @@ public class BootJavaReconcileEngine implements IReconcileEngine, IJavaProjectRe private final JavaProjectFinder projectFinder; private final JavaReconciler[] javaReconcilers; - private final BootJavaProjectReconcilerScheduler projectReconeilerScheduler; private final SimpleLanguageServer server; public BootJavaReconcileEngine(JavaProjectFinder projectFinder, JavaReconciler[] javaReconcilers, - SimpleLanguageServer server, BootJavaConfig config, ProjectObserver projectObserver, - RewriteRecipeRepository recipeRepo) { + SimpleLanguageServer server) { this.projectFinder = projectFinder; this.javaReconcilers = javaReconcilers; this.server = server; - this.projectReconeilerScheduler = new BootJavaProjectReconcilerScheduler( - this, - server.getWorkspaceService().getFileObserver(), - projectObserver, - config, - recipeRepo, - server.getTextDocumentService(), - projectFinder - ); } @Override @@ -181,9 +166,4 @@ public class BootJavaReconcileEngine implements IReconcileEngine, IJavaProjectRe } - @Override - public ProjectReconcileScheduler getScheduler() { - return projectReconeilerScheduler; - } - } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/BootVersionValidationEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/BootVersionValidationEngine.java index 509ff2dab..cedfec750 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/BootVersionValidationEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/validation/BootVersionValidationEngine.java @@ -17,7 +17,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.app.BootJavaConfig; import org.springframework.ide.vscode.boot.common.IJavaProjectReconcileEngine; -import org.springframework.ide.vscode.boot.common.ProjectReconcileScheduler; import org.springframework.ide.vscode.boot.validation.generations.ProjectVersionDiagnosticProvider; import org.springframework.ide.vscode.boot.validation.generations.ProjectVersionDiagnosticProvider.DiagnosticResult; import org.springframework.ide.vscode.boot.validation.generations.SpringIoProjectsProvider; @@ -36,38 +35,10 @@ public class BootVersionValidationEngine implements IJavaProjectReconcileEngine private SimpleLanguageServer server; private BootJavaConfig config; - private ProjectReconcileScheduler projectReconcileScheduler; public BootVersionValidationEngine(SimpleLanguageServer server, BootJavaConfig config, ProjectObserver projectObserver, JavaProjectFinder projectFinder) { this.server = server; this.config = config; - this.projectReconcileScheduler = new ProjectReconcileScheduler(this, projectFinder) { - - @Override - protected void init() { - super.init(); - config.addListener(evt -> scheduleValidationForAllProjects()); - projectObserver.addListener(new ProjectObserver.Listener() { - - @Override - public void deleted(IJavaProject project) { - unscheduleValidation(project); - clear(project, true); - } - - @Override - public void created(IJavaProject project) { - scheduleValidation(project); - } - - @Override - public void changed(IJavaProject project) { - scheduleValidation(project); - } - }); - } - - }; } public void reconcile(IJavaProject project) { @@ -115,8 +86,4 @@ public class BootVersionValidationEngine implements IJavaProjectReconcileEngine } } - @Override - public ProjectReconcileScheduler getScheduler() { - return projectReconcileScheduler; - } } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueSpelExpressionValidationTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueSpelExpressionValidationTest.java index 419fbbe62..46ec5f24a 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueSpelExpressionValidationTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/value/test/ValueSpelExpressionValidationTest.java @@ -77,7 +77,6 @@ public class ValueSpelExpressionValidationTest { @Autowired private CompilationUnitCache compilationUnitCache; @Autowired private SimpleLanguageServer server; @Autowired private BootJavaConfig config; - @Autowired private ProjectObserver projectObserver; private File directory; private String docUri; @@ -150,7 +149,7 @@ public class ValueSpelExpressionValidationTest { problemCollector = new TestProblemCollector(); reconcileEngine = new BootJavaReconcileEngine(projectFinder, new JavaReconciler[] { new JdtReconciler(compilationUnitCache, config) - }, server, config, projectObserver, null); + }, server); } @AfterEach