From 749c0b794355af10d8c944a3ee660be56fd2a215 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Tue, 27 Mar 2018 13:32:52 -0700 Subject: [PATCH] Fix some more race conditions in JdtLsProjectCache --- .../vscode/boot/jdt/ls/JdtLsProjectCache.java | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java index 1f10d4e45..554ea5d34 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/jdt/ls/JdtLsProjectCache.java @@ -65,21 +65,23 @@ public class JdtLsProjectCache implements JavaProjectsService { disposable.complete(server.addClasspathListener(new ClasspathListener() { @Override public void changed(Event event) { - synchronized (table) { - String uri = UriUtil.normalize(event.projectUri); - if (event.deleted) { - JdtLsProject deleted = table.remove(uri); - notifyDelete(deleted); - } else { - JdtLsProject newProject = new JdtLsProject(event.name, uri, event.classpath); - JdtLsProject oldProject = table.put(uri, newProject); - if (oldProject != null) { - notifyChanged(newProject); + initialized.thenRun(() -> { + synchronized (table) { + String uri = UriUtil.normalize(event.projectUri); + if (event.deleted) { + JdtLsProject deleted = table.remove(uri); + notifyDelete(deleted); } else { - notifyCreated(newProject); + JdtLsProject newProject = new JdtLsProject(event.name, uri, event.classpath); + JdtLsProject oldProject = table.put(uri, newProject); + if (oldProject != null) { + notifyChanged(newProject); + } else { + notifyCreated(newProject); + } } } - } + }); } })); initialized.complete(null); @@ -135,7 +137,16 @@ public class JdtLsProjectCache implements JavaProjectsService { return null; }); } - + + private void notifyCreated(JdtLsProject newProject) { + logEvent("Created", newProject); + synchronized (listeners) { + for (Listener listener : listeners) { + listener.created(newProject); + } + } + } + private void notifyDelete(JdtLsProject deleted) { logEvent("Deleted", deleted); synchronized (listeners) { @@ -162,37 +173,32 @@ public class JdtLsProjectCache implements JavaProjectsService { } } - private void notifyCreated(JdtLsProject newProject) { - logEvent("Created", newProject); - synchronized (listeners) { - for (Listener listener : listeners) { - listener.created(newProject); - } - } - } - @Override public Optional find(TextDocumentIdentifier doc) { - log.info("find {} ",doc.getUri()); + String uri = UriUtil.normalize(doc.getUri()); + log.debug("find {} ", uri); if (initialized.isDone()) { if (initialized.isCompletedExceptionally()) { - log.info("find {} delegating to fallback", doc.getUri()); + log.debug("find {} delegating to fallback", uri); Optional result = fallback.get().find(doc); - log.info("find => {}", result); + log.debug("find => {}", result); return result; } - String uri = UriUtil.normalize(doc.getUri()); synchronized (table) { for (Entry e : table.entrySet()) { String projectUri = e.getKey(); + log.debug("projectUri = '{}'", projectUri); if (UriUtil.contains(projectUri, uri) ) { + log.debug("found {} for {}", e.getValue(), uri); return Optional.of(e.getValue()); } } } + } else { + log.debug("find => NOT INITIALIZED YET"); } - log.info("find => NOT INITIALIZED YET"); + log.debug("NOT FOUND {} ", uri); return Optional.empty(); }