From 331b9acfe4d4029b871a6098248198559cc0818c Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Tue, 17 Mar 2020 14:56:54 -0700 Subject: [PATCH] Fix for race condition in cf server initializion on Eclipse - sometimes cf server would not receive initial information about targets defined in boot dash. See: https://www.pivotaltracker.com/story/show/171827114 --- .../DelegatingStreamConnectionProvider.java | 6 ----- .../CloudFoundryManifestLanguageServer.java | 22 +++++-------------- .../client/cftarget/CfTargetsInfo.java | 6 +++++ .../languageserver/LanguageServerRunner.java | 8 +++---- 4 files changed, 16 insertions(+), 26 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java index cd9877d6a..35122cfa0 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java @@ -18,17 +18,13 @@ import java.nio.file.FileSystems; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; import org.apache.commons.lang3.tuple.Pair; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.lsp4e.server.StreamConnectionProvider; import org.eclipse.lsp4j.DidChangeConfigurationParams; import org.eclipse.lsp4j.InitializeResult; @@ -37,10 +33,8 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; import org.eclipse.lsp4j.services.LanguageServer; import org.springframework.ide.eclipse.boot.dash.remoteapps.RemoteBootAppsDataHolder; import org.springframework.ide.eclipse.boot.dash.remoteapps.RemoteBootAppsDataHolder.RemoteAppData; -import org.springframework.tooling.boot.ls.prefs.RemoteAppsPrefs; import org.springframework.tooling.ls.eclipse.commons.LanguageServerCommonsActivator; import org.springsource.ide.eclipse.commons.livexp.core.ValueListener; -import org.springsource.ide.eclipse.commons.livexp.ui.Disposable; import com.google.common.collect.ImmutableSet; import com.google.gson.Gson; diff --git a/eclipse-language-servers/org.springframework.tooling.cloudfoundry.manifest.ls/src/org/springframework/tooling/cloudfoundry/manifest/ls/CloudFoundryManifestLanguageServer.java b/eclipse-language-servers/org.springframework.tooling.cloudfoundry.manifest.ls/src/org/springframework/tooling/cloudfoundry/manifest/ls/CloudFoundryManifestLanguageServer.java index dcedbf5af..3fb93bcb9 100644 --- a/eclipse-language-servers/org.springframework.tooling.cloudfoundry.manifest.ls/src/org/springframework/tooling/cloudfoundry/manifest/ls/CloudFoundryManifestLanguageServer.java +++ b/eclipse-language-servers/org.springframework.tooling.cloudfoundry.manifest.ls/src/org/springframework/tooling/cloudfoundry/manifest/ls/CloudFoundryManifestLanguageServer.java @@ -25,7 +25,7 @@ import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage; import org.eclipse.lsp4j.services.LanguageServer; import org.springframework.tooling.ls.eclipse.commons.STS4LanguageServerProcessStreamConnector; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableMap; /** * @author Martin Lippert @@ -63,9 +63,9 @@ public class CloudFoundryManifestLanguageServer extends STS4LanguageServerProces if (responseMessage.getResult() instanceof InitializeResult) { this.languageServer = languageServer; this.rootPath = rootPath; - updateLanguageServer(); - addLanguageServer(this); + servers.add(this); + BootDashTargetInfoSynchronizer.start(); } } } @@ -80,31 +80,21 @@ public class CloudFoundryManifestLanguageServer extends STS4LanguageServerProces @Override public void stop() { - removeLanguageServer(this); + servers.remove(this); super.stop(); } @Override public Object getInitializationOptions(URI rootUri) { Object opts = cfTargetOptionSettings; - return opts!=null?opts:ImmutableSet.of(); + return opts!=null?opts:ImmutableMap.of(); } - protected void updateLanguageServer() { + private void updateLanguageServer() { DidChangeConfigurationParams params = new DidChangeConfigurationParams(getInitializationOptions(rootPath)); languageServer.getWorkspaceService().didChangeConfiguration(params); } - private static void addLanguageServer(CloudFoundryManifestLanguageServer server) { - BootDashTargetInfoSynchronizer.start(); - servers.add(server); - } - - - private static void removeLanguageServer(CloudFoundryManifestLanguageServer server) { - servers.remove(server); - } - @Override protected String getPluginId() { return Constants.PLUGIN_ID; diff --git a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfTargetsInfo.java b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfTargetsInfo.java index f0962fff9..5c55ac1b3 100644 --- a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfTargetsInfo.java +++ b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CfTargetsInfo.java @@ -144,4 +144,10 @@ public class CfTargetsInfo { return "Target [api=" + api + ", org=" + org + ", space=" + space + "]"; } } + + @Override + public String toString() { + return "CfTargetsInfo "+cfTargets; + } + } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java index 84fa70774..d0b668018 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LanguageServerRunner.java @@ -240,13 +240,13 @@ public class LanguageServerRunner implements CommandLineRunner { Function wrapper = (MessageConsumer consumer) -> { return (msg) -> { try { - long beforeConsumingMessage = System.currentTimeMillis(); +// long beforeConsumingMessage = System.currentTimeMillis(); consumer.consume(msg); - long afterConsumingMessage = System.currentTimeMillis(); - String shortMessage = StringUtils.left(msg.toString(), 140); - log.info("working on message took " + (afterConsumingMessage - beforeConsumingMessage) + "ms - message content: " + shortMessage); +// long afterConsumingMessage = System.currentTimeMillis(); +// String shortMessage = StringUtils.left(msg.toString(), 140); +// log.info("working on message took " + (afterConsumingMessage - beforeConsumingMessage) + "ms - message content: " + shortMessage); } catch (UnsupportedOperationException e) { //log a warning and ignore. We are getting some messages from vsCode the server doesn't know about