From 64a45984ce00fee61b622ecbfc62bd7eef75438a Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 15 Mar 2018 15:54:49 -0700 Subject: [PATCH] Make 'initialized' callbacks execute on async thread --- .../.settings/org.eclipse.jdt.ui.prefs | 2 +- .../jdt/ls/ClasspathListenerManager.java | 4 ++-- .../commons/languageserver/util/AsyncRunner.java | 13 ++++++++++++- .../languageserver/util/SimpleLanguageServer.java | 6 ++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/headless-services/commons/commons-language-server/.settings/org.eclipse.jdt.ui.prefs b/headless-services/commons/commons-language-server/.settings/org.eclipse.jdt.ui.prefs index 68f26e829..c743e1c07 100644 --- a/headless-services/commons/commons-language-server/.settings/org.eclipse.jdt.ui.prefs +++ b/headless-services/commons/commons-language-server/.settings/org.eclipse.jdt.ui.prefs @@ -38,7 +38,7 @@ sp_cleanup.remove_redundant_type_arguments=false sp_cleanup.remove_trailing_whitespaces=true sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_casts=false sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false sp_cleanup.remove_unused_local_variables=false diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java index a06ed6b7d..b360816b6 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/jdt/ls/ClasspathListenerManager.java @@ -67,8 +67,8 @@ public class ClasspathListenerManager { CompletableFuture future2 = server.getClient().registerCapability(params); // Wait for async work - //future1.join(); - //future2.join(); + future1.join(); + future2.join(); // Cleanups: return () -> { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/AsyncRunner.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/AsyncRunner.java index 6a90a4359..830f084fb 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/AsyncRunner.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/AsyncRunner.java @@ -13,6 +13,7 @@ package org.springframework.ide.vscode.commons.languageserver.util; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; +import org.slf4j.Logger; import org.springframework.ide.vscode.commons.util.RunnableWithException; import reactor.core.publisher.Mono; @@ -36,15 +37,25 @@ public class AsyncRunner { return x; } + public synchronized void withLog(Logger logger, RunnableWithException runnable) { + execute(runnable).handle((v, e) -> { + if (e!=null) { + logger.error("", e); + } + return null; + }); + } + public synchronized CompletableFuture execute(RunnableWithException runnable) { CompletableFuture x = Mono.fromCallable(() -> { runnable.run(); - return (Void) null; + return (Void)null; }).subscribeOn(executor).toFuture(); lastRequest = x; return x; } + public synchronized void waitForAll() { while (lastRequest != null) { try { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 311f436ea..8cfd5c66f 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -47,6 +47,8 @@ import org.eclipse.lsp4j.WorkspaceFoldersOptions; import org.eclipse.lsp4j.WorkspaceServerCapabilities; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageClientAware; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.commons.languageserver.DiagnosticService; import org.springframework.ide.vscode.commons.languageserver.ProgressParams; import org.springframework.ide.vscode.commons.languageserver.ProgressService; @@ -90,6 +92,8 @@ import reactor.core.scheduler.Schedulers; */ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientAware, ServiceNotificationsClient, SimpleLanguageServerWrapper { + private static Logger log = LoggerFactory.getLogger(SimpleLanguageServer.class); + private static final String WORKSPACE_FOLDERS_CAPABILITY_ID = UUID.randomUUID().toString(); public static final String WORKSPACE_FOLDERS_CAPABILITY_NAME = "workspace/didChangeWorkspaceFolders"; @@ -254,6 +258,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA @Override public void initialized() { + async.withLog(log, () -> { Registration registration = new Registration(WORKSPACE_FOLDERS_CAPABILITY_ID, WORKSPACE_FOLDERS_CAPABILITY_NAME, null); RegistrationParams registrationParams = new RegistrationParams(Collections.singletonList(registration)); getClient().registerCapability(registrationParams); @@ -261,6 +266,7 @@ public class SimpleLanguageServer implements Sts4LanguageServer, LanguageClientA if (h!=null) { h.run(); } + }); } private List getWorkspaceFolders(InitializeParams params) {