From 183fef6ec8bd8f321061a108c9f2aeb3275479d7 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Mon, 12 Feb 2018 17:07:39 -0500 Subject: [PATCH] Re-index on rebuild --- .../commons/jandex/JandexClasspath.java | 7 ++++- .../vscode/commons/jandex/JandexIndex.java | 11 +++++-- .../java/DelegatingCachedClasspath.java | 8 +++++ .../ide/vscode/commons/java/IClasspath.java | 2 ++ .../java/AbstractFileToProjectCache.java | 29 ++++++++++++++----- .../java/classpathfile/FileClasspath.java | 4 +++ 6 files changed, 49 insertions(+), 12 deletions(-) diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java index 78b5878c9..ed33d4ec0 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexClasspath.java @@ -46,7 +46,7 @@ public abstract class JandexClasspath implements IClasspath { private Supplier javaIndex; public JandexClasspath() { - this.javaIndex = Suppliers.memoize(() -> createIndex()); + this.javaIndex = Suppliers.synchronizedSupplier(Suppliers.memoize(() -> createIndex())); } protected JandexIndex createIndex() { @@ -102,6 +102,11 @@ public abstract class JandexClasspath implements IClasspath { public Optional findClasspathResourceContainer(String fqName) { return javaIndex.get().findClasspathResourceForType(fqName); } + + @Override + public void reindex() { + this.javaIndex = Suppliers.synchronizedSupplier(Suppliers.memoize(() -> createIndex())); + } abstract protected IJavadocProvider createParserJavadocProvider(File classpathResource); diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java index 9c992d6a5..20690cdb2 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java @@ -127,12 +127,12 @@ public class JandexIndex { this.knownPackages = new HashMap<>(); this.javadocProviderFactory = javadocProviderFactory; classpathEntries.forEach(file -> { - index.put(file, Suppliers.memoize(() -> createIndex(file, indexFileFinder))); + index.put(file, Suppliers.synchronizedSupplier(Suppliers.memoize(() -> createIndex(file, indexFileFinder)))); knownTypes.put(file, Suppliers.memoize(() -> getKnownTypesStream(file).collect(Collectors.toList()))); knownPackages.put(file, Suppliers.memoize(() -> getKnownPackages(file).collect(Collectors.toList()))); }); } - + private Optional createIndex(File file, IndexFileFinder indexFileFinder) { if (file != null && file.isFile() && file.getName().endsWith(".jar")) { return indexJar(file, indexFileFinder); @@ -239,7 +239,12 @@ public class JandexIndex { // If not found look at indices owned by this // JandexIndex instance .orElseGet(() -> streamOfIndices() - .map(e -> Tuples.of(e.getT1(), Optional.ofNullable(e.getT2().getClassByName(fqName)))) + .map(e -> { + IndexView view = e.getT2(); + ClassInfo info = view.getClassByName(fqName); + return Tuples.of(e.getT1(), Optional.ofNullable(info)); +// return Tuples.of(e.getT1(), Optional.ofNullable(e.getT2().getClassByName(fqName))); + }) .filter(t -> t.getT2().isPresent()) .map(e -> Tuples.of(e.getT1(), e.getT2().get())).findFirst()); } diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/DelegatingCachedClasspath.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/DelegatingCachedClasspath.java index eaa01ee80..9cd5e5ec0 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/DelegatingCachedClasspath.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/DelegatingCachedClasspath.java @@ -171,4 +171,12 @@ public class DelegatingCachedClasspath implements IClasspa return t == null ? Optional.empty() : t.findClasspathResourceContainer(fqName); } + @Override + public void reindex() { + T t = cachedClasspath.get(); + if (t != null) { + t.reindex(); + } + } + } diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java index 325270ccb..fe9183b8f 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IClasspath.java @@ -62,4 +62,6 @@ public interface IClasspath { Optional findClasspathResourceContainer(String fqName); ClasspathData createClasspathData() throws Exception; + + void reindex(); } diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/AbstractFileToProjectCache.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/AbstractFileToProjectCache.java index f63306897..d1f55ffc2 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/AbstractFileToProjectCache.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/AbstractFileToProjectCache.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.commons.languageserver.java; import java.io.File; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -30,8 +31,7 @@ import org.springframework.ide.vscode.commons.languageserver.Sts4LanguageServer; */ public abstract class AbstractFileToProjectCache

extends AbstractJavaProjectCache { - private String changeSubscription; - private String deleteSubscription; + private List subscriptions; protected boolean asyncUpdate; protected final Path projectCacheFolder; private boolean alwaysFireEventOnUpdate; @@ -42,6 +42,7 @@ public abstract class AbstractFileToProjectCache

extends super(server); this.projectCacheFolder = projectCacheFolder; this.asyncUpdate = asyncUpdate; + this.subscriptions = new ArrayList<>(); } @@ -52,14 +53,26 @@ public abstract class AbstractFileToProjectCache

extends @Override protected void attachListeners(File file, P project) { super.attachListeners(file, project); - List globPattern = Arrays.asList(file.toString().replaceAll("\\\\", "/")); - changeSubscription = getFileObserver().onFileChanged(globPattern, (uri) -> performUpdate(project, asyncUpdate, true)); - deleteSubscription = getFileObserver().onFileDeleted(globPattern, (uri) -> { + List globPattern = Arrays.asList(file.toString().replace(File.separator, "/")); + subscriptions.add(getFileObserver().onFileChanged(globPattern, (uri) -> performUpdate(project, asyncUpdate, true))); + subscriptions.add(getFileObserver().onFileDeleted(globPattern, (uri) -> { cache.invalidate(file); notifyProjectDeleted(project); - getFileObserver().unsubscribe(changeSubscription); - getFileObserver().unsubscribe(deleteSubscription); - }); + dispose(); + })); + + Path outputFolder = project.getClasspath().getOutputFolder(); + if (outputFolder != null) { + final List rebuildGlobPattern = Arrays.asList(outputFolder.toString().replace(File.separator, "/") + "/**/*.class"); + subscriptions.add(getFileObserver().onFileChanged(rebuildGlobPattern, (uri) -> project.getClasspath().reindex())); + subscriptions.add(getFileObserver().onFileCreated(rebuildGlobPattern, (uri) -> project.getClasspath().reindex())); + subscriptions.add(getFileObserver().onFileDeleted(rebuildGlobPattern, (uri) -> project.getClasspath().reindex())); + } + } + + private void dispose() { + subscriptions.forEach(s -> getFileObserver().unsubscribe(s)); + subscriptions.clear(); } final protected void performUpdate(P project, boolean async, boolean notify) { diff --git a/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java b/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java index fc313c0b2..48eb0e3eb 100644 --- a/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java +++ b/headless-services/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/FileClasspath.java @@ -104,4 +104,8 @@ public class FileClasspath implements IClasspath { public ClasspathData createClasspathData() throws Exception { return ClasspathData.from(getName(), getClasspathEntries(), getClasspathResources(), getOutputFolder()); } + + @Override + public void reindex() { + } }