From 37e495f20c65332c4aba40f57893b0e241c226d7 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Tue, 5 Apr 2022 15:52:11 -0700 Subject: [PATCH] Some tweaks to PR 751 --- .../vscode/commons/protocol/STS4LanguageClient.java | 11 +++++++++++ .../testharness/LanguageServerHarness.java | 12 +++++++++++- .../vscode/boot/app/BootLanguageServerBootApp.java | 4 ++-- .../livehover/v2/SpringProcessConnectorLocal.java | 4 ++-- .../livehover/v2/SpringProcessConnectorService.java | 11 +++++------ .../livehover/v2/SpringProcessLiveDataProvider.java | 13 ++++++++----- vscode-extensions/vscode-spring-boot/lib/api.d.ts | 6 +++++- .../vscode-spring-boot/lib/apiManager.ts | 6 +++++- .../vscode-spring-boot/lib/notification.ts | 4 ++++ 9 files changed, 53 insertions(+), 18 deletions(-) diff --git a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java index 360774aa8..cf0183d5c 100644 --- a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java +++ b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/STS4LanguageClient.java @@ -36,6 +36,16 @@ import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; */ public interface STS4LanguageClient extends LanguageClient { + + @JsonNotification("sts/liveprocess/connected") + void liveProcessConnected(String processKey); + + @JsonNotification("sts/liveprocess/disconnected") + void liveProcessDisconnected(String processKey); + + @JsonNotification("sts/liveprocess/updated") + void liveProcessDataUpdated(String processKey); + @JsonNotification("sts/highlight") void highlight(HighlightParams highlights); @@ -76,5 +86,6 @@ public interface STS4LanguageClient extends LanguageClient { @JsonRequest("sts/javaCodeComplete") CompletableFuture> javaCodeComplete(JavaCodeCompleteParams params); + } diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 70bb9d008..99b08a9a4 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -296,7 +296,6 @@ public class LanguageServerHarness { @Override public void showMessage(MessageParams messageParams) { // TODO Auto-generated method stub - } @Override @@ -406,6 +405,17 @@ public class LanguageServerHarness { return CompletableFuture.completedFuture(Collections.emptyList()); } + @Override + public void liveProcessConnected(String processKey) { + } + + @Override + public void liveProcessDisconnected(String processKey) { + } + + @Override + public void liveProcessDataUpdated(String processKey) { + } }); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java index 2b8ac063d..d032f0a12 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerBootApp.java @@ -125,8 +125,8 @@ public class BootLanguageServerBootApp { } @Bean - SpringProcessLiveDataProvider liveDataProvider() { - return new SpringProcessLiveDataProvider(); + SpringProcessLiveDataProvider liveDataProvider(SimpleLanguageServer server) { + return new SpringProcessLiveDataProvider(server); } @Bean diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java index 3df2b3a83..35e63f3c6 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorLocal.java @@ -229,8 +229,8 @@ public class SpringProcessConnectorLocal { } } - public boolean isConnected(String processKey) { - return this.processConnectorService.isConnected(processKey); + public boolean isKnownProcessKey(String processKey) { + return this.processConnectorService.isKnownProcessKey(processKey); } private String getProcessID(VirtualMachineDescriptor descriptor) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java index f2ff2d7b3..3cfb51a83 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessConnectorService.java @@ -45,7 +45,6 @@ public class SpringProcessConnectorService { private int progressIdKey = 0; private int maxRetryCount; private int retryDelayInSeconds; - public SpringProcessConnectorService(SimpleLanguageServer server, SpringProcessLiveDataProvider liveDataProvider) { this.liveDataProvider = liveDataProvider; @@ -135,7 +134,7 @@ public class SpringProcessConnectorService { .filter((connector) -> connectedSuccess.get(connector.getProcessKey())).toArray(SpringProcessConnector[]::new); } - public boolean isConnected(String processKey) { + public boolean isKnownProcessKey(String processKey) { return this.connectors.containsKey(processKey); } @@ -162,13 +161,13 @@ public class SpringProcessConnectorService { catch (Exception e) { log.info("problem occured during process connect", e); - if (retryNo < maxRetryCount && isConnected(processKey)) { + if (retryNo < maxRetryCount && isKnownProcessKey(processKey)) { scheduleConnect(progressTask, processKey, connector, retryDelayInSeconds, TimeUnit.SECONDS, retryNo + 1); } else { progressTask.progressDone(); // Send message to client if maximum retries reached on error - if (isConnected(processKey)) { + if (isKnownProcessKey(processKey)) { diagnosticService.diagnosticEvent(ShowMessageException .error("Failed to connect to process " + processKey + " after retries: " + retryNo, e)); } @@ -229,7 +228,7 @@ public class SpringProcessConnectorService { log.info("problem occured during process live data refresh", e); - if (retryNo < maxRetryCount && isConnected(processKey)) { + if (retryNo < maxRetryCount && isKnownProcessKey(processKey)) { scheduleRefresh(progressTask, processKey, connector, retryDelayInSeconds, TimeUnit.SECONDS, retryNo + 1); } @@ -237,7 +236,7 @@ public class SpringProcessConnectorService { progressTask.progressDone(); // Send message to client if maximum retries reached on error - if (isConnected(processKey)) { + if (isKnownProcessKey(processKey)) { diagnosticService.diagnosticEvent(ShowMessageException .error("Failed to refresh live data from process " + processKey + " after retries: " + retryNo, e)); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataProvider.java index a24d40c28..f85ed08cd 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessLiveDataProvider.java @@ -16,6 +16,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; + /** * @author Martin Lippert */ @@ -23,8 +25,10 @@ public class SpringProcessLiveDataProvider { private final ConcurrentMap liveData; private final List listeners; + private final SimpleLanguageServer server; - public SpringProcessLiveDataProvider() { + public SpringProcessLiveDataProvider(SimpleLanguageServer server) { + this.server = server; this.liveData = new ConcurrentHashMap<>(); this.listeners = new CopyOnWriteArrayList<>(); } @@ -40,25 +44,25 @@ public class SpringProcessLiveDataProvider { */ public boolean add(String processKey, SpringProcessLiveData liveData) { SpringProcessLiveData oldData = this.liveData.putIfAbsent(processKey, liveData); - if (oldData == null) { announceChangedLiveData(); + server.getClient().liveProcessConnected(processKey); } - return oldData == null; } public void remove(String processKey) { SpringProcessLiveData removed = this.liveData.remove(processKey); - if (removed != null) { announceChangedLiveData(); + server.getClient().liveProcessDisconnected(processKey); } } public void update(String processKey, SpringProcessLiveData liveData) { this.liveData.put(processKey, liveData); announceChangedLiveData(); + server.getClient().liveProcessDataUpdated(processKey); } @@ -73,7 +77,6 @@ public class SpringProcessLiveDataProvider { private void announceChangedLiveData() { SpringProcessLiveData[] latestLiveData = getLatestLiveData(); SpringProcessLiveDataChangeEvent event = new SpringProcessLiveDataChangeEvent(latestLiveData); - for (SpringProcessLiveDataChangeListener listener : this.listeners) { listener.liveDataChanged(event); } diff --git a/vscode-extensions/vscode-spring-boot/lib/api.d.ts b/vscode-extensions/vscode-spring-boot/lib/api.d.ts index 92736a926..ce907ca67 100644 --- a/vscode-extensions/vscode-spring-boot/lib/api.d.ts +++ b/vscode-extensions/vscode-spring-boot/lib/api.d.ts @@ -14,11 +14,15 @@ export interface ExtensionAPI { */ readonly onDidLiveProcessDisconnect: Event + /** + * An event which fires on live process data change. Payload is processKey. + */ + readonly onDidLiveProcessUpdate: Event + /** * A command to get live process data. */ readonly getLiveProcessData: (query: SimpleQuery | BeansQuery) => Promise - } interface LiveProcessDataQuery { diff --git a/vscode-extensions/vscode-spring-boot/lib/apiManager.ts b/vscode-extensions/vscode-spring-boot/lib/apiManager.ts index ed576c3f3..132afb413 100644 --- a/vscode-extensions/vscode-spring-boot/lib/apiManager.ts +++ b/vscode-extensions/vscode-spring-boot/lib/apiManager.ts @@ -1,16 +1,18 @@ import { commands, Uri } from "vscode"; import { Emitter, LanguageClient } from "vscode-languageclient/node"; import { ExtensionAPI } from "./api"; -import { LiveProcessConnectedNotification, LiveProcessDisconnectedNotification } from "./notification"; +import { LiveProcessConnectedNotification, LiveProcessDisconnectedNotification, LiveProcessUpdatedNotification } from "./notification"; export class ApiManager { public api: ExtensionAPI; private onDidLiveProcessConnectEmitter: Emitter = new Emitter(); private onDidLiveProcessDisconnectEmitter: Emitter = new Emitter(); + private onDidLiveProcessUpdateEmitter: Emitter = new Emitter(); public constructor(private client: LanguageClient) { const onDidLiveProcessConnect = this.onDidLiveProcessConnectEmitter.event; const onDidLiveProcessDisconnect = this.onDidLiveProcessDisconnectEmitter.event; + const onDidLiveProcessUpdate = this.onDidLiveProcessUpdateEmitter.event; const COMMAND_LIVEDATA_GET = "sts/livedata/get"; const getLiveProcessData = async (query) => { @@ -20,11 +22,13 @@ export class ApiManager { // TODO: STS server should send corresponding notification back. client.onNotification(LiveProcessConnectedNotification.type, (processKey: string) => this.onDidLiveProcessConnectEmitter.fire(processKey)); client.onNotification(LiveProcessDisconnectedNotification.type, (processKey: string) => this.onDidLiveProcessDisconnectEmitter.fire(processKey)); + client.onNotification(LiveProcessUpdatedNotification.type, (processKey: string) => this.onDidLiveProcessUpdateEmitter.fire(processKey)); this.api = { client, onDidLiveProcessConnect, onDidLiveProcessDisconnect, + onDidLiveProcessUpdate, getLiveProcessData }; } diff --git a/vscode-extensions/vscode-spring-boot/lib/notification.ts b/vscode-extensions/vscode-spring-boot/lib/notification.ts index e553be7b1..86853eb3d 100644 --- a/vscode-extensions/vscode-spring-boot/lib/notification.ts +++ b/vscode-extensions/vscode-spring-boot/lib/notification.ts @@ -7,3 +7,7 @@ export namespace LiveProcessConnectedNotification { export namespace LiveProcessDisconnectedNotification { export const type = new NotificationType('sts/liveprocess/disconnected'); } + +export namespace LiveProcessUpdatedNotification { + export const type = new NotificationType('sts/liveprocess/updated'); +} \ No newline at end of file