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 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) { /*