ProjectReconcileSchedulers as beans

This commit is contained in:
aboyko
2023-01-25 21:13:15 -05:00
parent 80fbf2f983
commit 8b1ac911ad
6 changed files with 58 additions and 82 deletions

View File

@@ -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<RewriteRecipeRepository> 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<JavaCodeActionHandler> 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<RewriteRecipeRepository> 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);
}
});
}
};
}
}

View File

@@ -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<ProjectReconcileScheduler> 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);

View File

@@ -18,6 +18,4 @@ public interface IJavaProjectReconcileEngine {
void clear(IJavaProject project);
ProjectReconcileScheduler getScheduler();
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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