From 11d9eca124a4a25387a35e9fa7401eaa6b2243c2 Mon Sep 17 00:00:00 2001 From: Mickael Istria Date: Wed, 9 Nov 2022 17:46:44 +0100 Subject: [PATCH] Do not mandate LanguageServerApplication running Remove an execution path that only works if IApplication is running; so JDT-LS can be used in different deployments. Part of https://github.com/eclipse/eclipse.jdt.ls/issues/2311 --- org.eclipse.jdt.ls.core/plugin.xml | 2 +- .../internal/JavaLanguageServerPlugin.java | 6 +-- ...er.java => LanguageServerApplication.java} | 50 +++++++++---------- .../core/internal/ParentProcessWatcher.java | 4 +- .../internal/handlers/BaseInitHandler.java | 6 ++- 5 files changed, 35 insertions(+), 33 deletions(-) rename org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/{LanguageServer.java => LanguageServerApplication.java} (56%) diff --git a/org.eclipse.jdt.ls.core/plugin.xml b/org.eclipse.jdt.ls.core/plugin.xml index 246e52789b..4b704f890f 100644 --- a/org.eclipse.jdt.ls.core/plugin.xml +++ b/org.eclipse.jdt.ls.core/plugin.xml @@ -13,7 +13,7 @@ thread="main" visible="true"> + class="org.eclipse.jdt.ls.core.internal.LanguageServerApplication"> diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java index c0e0fb66ee..68ff8edc3b 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java @@ -122,7 +122,7 @@ public class JavaLanguageServerPlugin extends Plugin { private ISourceDownloader sourceDownloader; - private LanguageServer languageServer; + private LanguageServerApplication languageServer; private ProjectsManager projectsManager; private DigestStore digestStore; private ContentProviderManager contentProviderManager; @@ -140,7 +140,7 @@ public class JavaLanguageServerPlugin extends Plugin { private ExecutorService executorService; - public static LanguageServer getLanguageServer() { + public static LanguageServerApplication getLanguageServer() { return pluginInstance == null ? null : pluginInstance.languageServer; } @@ -457,7 +457,7 @@ public static void sendStatus(ServiceStatus serverStatus, String status) { } } - static void startLanguageServer(LanguageServer newLanguageServer) throws IOException { + static void startLanguageServer(LanguageServerApplication newLanguageServer) throws IOException { if (pluginInstance != null) { pluginInstance.languageServer = newLanguageServer; pluginInstance.startConnection(); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServer.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServerApplication.java similarity index 56% rename from org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServer.java rename to org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServerApplication.java index ac3c785632..0a79586e0c 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServer.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/LanguageServerApplication.java @@ -15,44 +15,44 @@ import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; -public class LanguageServer implements IApplication { +public class LanguageServerApplication implements IApplication { - private volatile boolean shutdown; - private long parentProcessId; - private final Object waitLock = new Object(); + private volatile boolean shutdown; + private long parentProcessId; + private final Object waitLock = new Object(); @Override public Object start(IApplicationContext context) throws Exception { - JavaLanguageServerPlugin.startLanguageServer(this); - synchronized(waitLock){ - while (!shutdown) { - try { - context.applicationRunning(); - JavaLanguageServerPlugin.logInfo("Main thread is waiting"); - waitLock.wait(); - } catch (InterruptedException e) { - JavaLanguageServerPlugin.logException(e.getMessage(), e); - } - } - } + JavaLanguageServerPlugin.startLanguageServer(this); + synchronized (waitLock) { + while (!shutdown) { + try { + context.applicationRunning(); + JavaLanguageServerPlugin.logInfo("Main thread is waiting"); + waitLock.wait(); + } catch (InterruptedException e) { + JavaLanguageServerPlugin.logException(e.getMessage(), e); + } + } + } return IApplication.EXIT_OK; } @Override public void stop() { - synchronized(waitLock){ - waitLock.notifyAll(); - } + synchronized (waitLock) { + waitLock.notifyAll(); + } } public void exit() { - shutdown = true; - JavaLanguageServerPlugin.logInfo("Shutdown received... waking up main thread"); - synchronized(waitLock){ - waitLock.notifyAll(); - } - } + shutdown = true; + JavaLanguageServerPlugin.logInfo("Shutdown received... waking up main thread"); + synchronized (waitLock) { + waitLock.notifyAll(); + } + } public void setParentProcessId(long pid) { this.parentProcessId = pid; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ParentProcessWatcher.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ParentProcessWatcher.java index dd7aa931fa..f86a74f6fa 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ParentProcessWatcher.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/ParentProcessWatcher.java @@ -36,11 +36,11 @@ public final class ParentProcessWatcher implements Runnable, Function task; private ScheduledExecutorService service; - public ParentProcessWatcher(LanguageServer server ) { + public ParentProcessWatcher(LanguageServerApplication server) { this.server = server; if (ProcessHandle.current().parent().isPresent()) { this.server.setParentProcessId(ProcessHandle.current().parent().get().pid()); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/BaseInitHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/BaseInitHandler.java index 8f41f26bf9..5b6bdfb5aa 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/BaseInitHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/BaseInitHandler.java @@ -30,6 +30,7 @@ import org.eclipse.jdt.ls.core.internal.JSONUtility; import org.eclipse.jdt.ls.core.internal.JVMConfigurator; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; +import org.eclipse.jdt.ls.core.internal.LanguageServerApplication; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; @@ -151,8 +152,9 @@ public InitializeResult initialize(InitializeParams param) { } Integer processId = param.getProcessId(); - if (processId != null) { - JavaLanguageServerPlugin.getLanguageServer().setParentProcessId(processId.longValue()); + LanguageServerApplication application = JavaLanguageServerPlugin.getLanguageServer(); + if (processId != null && application != null) { + application.setParentProcessId(processId.longValue()); } return initializationOptions;