diff --git a/headless-services/spring-boot-language-server/pom.xml b/headless-services/spring-boot-language-server/pom.xml
index 5da8931b6..a33c2e3d3 100644
--- a/headless-services/spring-boot-language-server/pom.xml
+++ b/headless-services/spring-boot-language-server/pom.xml
@@ -153,6 +153,13 @@
+
+ org.rocksdb
+ rocksdbjni
+ 7.9.2
+ runtime
+
+
diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java
index 4597ef5e9..0b592f03c 100644
--- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java
+++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/rewrite/RewriteRecipeRepository.java
@@ -53,7 +53,12 @@ import org.openrewrite.config.RecipeDescriptor;
import org.openrewrite.config.YamlResourceLoader;
import org.openrewrite.java.JavaParser;
import org.openrewrite.java.tree.J.CompilationUnit;
+import org.openrewrite.maven.MavenExecutionContextView;
import org.openrewrite.maven.MavenParser;
+import org.openrewrite.maven.cache.CompositeMavenPomCache;
+import org.openrewrite.maven.cache.InMemoryMavenPomCache;
+import org.openrewrite.maven.cache.MavenPomCache;
+import org.openrewrite.maven.cache.RocksdbMavenPomCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
@@ -122,6 +127,8 @@ public class RewriteRecipeRepository implements ApplicationContextAware {
CompletableFuture loaded;
+ private MavenPomCache mavenPomCache;
+
private Set scanFiles;
private Set scanDirs;
private Set recipeFilters;
@@ -139,6 +146,7 @@ public class RewriteRecipeRepository implements ApplicationContextAware {
this.scanDirs = UNINITIALIZED_SET;
this.scanFiles = UNINITIALIZED_SET;
this.recipeFilters = UNINITIALIZED_SET;
+ this.mavenPomCache = new CompositeMavenPomCache(new InMemoryMavenPomCache(), new RocksdbMavenPomCache(Paths.get(System.getProperty("user.home"))));
CompletableFuture firstConfigLoaded = new CompletableFuture<>();
config.addListener(l -> {
@@ -309,7 +317,7 @@ public class RewriteRecipeRepository implements ApplicationContextAware {
for (RecipeCodeActionDescriptor d : descriptors) {
TreeVisitor, ExecutionContext> markVisitor = d.getMarkerVisitor(applicationContext);
if (markVisitor != null) {
- cu = (CompilationUnit) markVisitor.visit(cu, new InMemoryExecutionContext(e -> log.error("Marker visitor failed!", e)));
+ cu = (CompilationUnit) markVisitor.visit(cu, createExecutionContext(e -> log.error("Marker visitor failed!", e)));
}
}
return cu;
@@ -414,8 +422,10 @@ public class RewriteRecipeRepository implements ApplicationContextAware {
private Optional computeWorkspaceEdit(Recipe r, IJavaProject project, String progressToken) {
Path absoluteProjectDir = Paths.get(project.getLocationUri());
server.getProgressService().progressEvent(progressToken, "Parsing files...");
+ log.info("Start Applying Recipe: " + r.getName());
+ long start = System.currentTimeMillis();
MavenProjectParser projectParser = createRewriteMavenParser(absoluteProjectDir,
- new InMemoryExecutionContext(), p -> {
+ createExecutionContext(t -> {}), p -> {
TextDocument doc = server.getTextDocumentService().getLatestSnapshot(p.toUri().toASCIIString());
if (doc != null) {
return new Parser.Input(p, () -> new ByteArrayInputStream(doc.get().getBytes()));
@@ -424,11 +434,21 @@ public class RewriteRecipeRepository implements ApplicationContextAware {
});
List sources = projectParser.parse(absoluteProjectDir, getClasspathEntries(project));
server.getProgressService().progressEvent(progressToken, "Computing changes...");
- RecipeRun reciperun = r.run(sources, new InMemoryExecutionContext(e -> log.error("Recipe execution failed", e)));
+ RecipeRun reciperun = r.run(sources, createExecutionContext(e -> log.error("Recipe execution failed", e)));
+ log.info(("Done applying recipe in " + String.valueOf(System.currentTimeMillis() - start)));
List results = reciperun.getResults();
return ORDocUtils.createWorkspaceEdit(absoluteProjectDir, server.getTextDocumentService(), results);
}
+ private ExecutionContext createExecutionContext(Consumer c) {
+ InMemoryExecutionContext ctx = new InMemoryExecutionContext(c);
+ MavenExecutionContextView mvnContext = MavenExecutionContextView.view(ctx);
+ if (mavenPomCache != null) {
+ mvnContext.setPomCache(mavenPomCache);
+ }
+ return mvnContext;
+ }
+
private List listProjectRefactoringRecipes(String uri) {
if (uri != null) {
/*