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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -144,4 +144,10 @@ public class CfTargetsInfo {
|
||||
return "Target [api=" + api + ", org=" + org + ", space=" + space + "]";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "CfTargetsInfo "+cfTargets;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -240,13 +240,13 @@ public class LanguageServerRunner implements CommandLineRunner {
|
||||
Function<MessageConsumer, MessageConsumer> 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
|
||||
|
||||
Reference in New Issue
Block a user