From e136a6b53691be711a639477a93ef2fe96ee200d Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 22 Aug 2019 18:00:35 -0400 Subject: [PATCH] WIP 2 --- .../languageserver/Sts4LanguageServer.java | 9 ++----- .../util/SimpleLanguageServer.java | 15 +++++++++++- .../util/SprottyMessageHandler.java | 8 +++++++ .../commons/protocol/STS4LanguageClient.java | 3 ++- .../commons/protocol/SprottyClient.java | 12 ---------- .../protocol/java/SprottyProtocol.java} | 4 ++-- .../commons/commons-sprotty/pom.xml | 5 ++++ .../sprotty/scan/DiagramWebsocketServer.java | 24 +++++++++++++++---- .../testharness/LanguageServerHarness.java | 5 ++++ 9 files changed, 57 insertions(+), 28 deletions(-) create mode 100644 headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SprottyMessageHandler.java delete mode 100644 headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/SprottyClient.java rename headless-services/commons/{commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/sprotty/SprottyService.java => commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/SprottyProtocol.java} (63%) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/Sts4LanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/Sts4LanguageServer.java index b22b798a3..8b29c305b 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/Sts4LanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/Sts4LanguageServer.java @@ -10,11 +10,10 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.languageserver; -import org.eclipse.lsp4j.jsonrpc.services.JsonDelegate; import org.eclipse.lsp4j.services.LanguageServer; -import org.springframework.ide.vscode.commons.languageserver.sprotty.SprottyService; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspaceService; +import org.springframework.ide.vscode.commons.protocol.java.SprottyProtocol; /** * STS4 language server @@ -22,7 +21,7 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleWorkspac * @author Alex Boyko * */ -public interface Sts4LanguageServer extends LanguageServer { +public interface Sts4LanguageServer extends LanguageServer, SprottyProtocol { @Override SimpleTextDocumentService getTextDocumentService(); @@ -42,8 +41,4 @@ public interface Sts4LanguageServer extends LanguageServer { */ DiagnosticService getDiagnosticService(); - @JsonDelegate - SprottyService getSprottyService(); - - } 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 15e7fc330..0fbf14fcc 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 @@ -32,7 +32,6 @@ import org.eclipse.lsp4j.ApplyWorkspaceEditParams; import org.eclipse.lsp4j.ApplyWorkspaceEditResponse; import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.CodeLensOptions; -import org.eclipse.lsp4j.CompletionOptions; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DiagnosticSeverity; import org.eclipse.lsp4j.ExecuteCommandOptions; @@ -513,6 +512,8 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC private DiagnosticSeverityProvider severityProvider = DiagnosticSeverityProvider.DEFAULT; + private SprottyMessageHandler sprottyMessageHandler; + /** * Convenience method. Subclasses can call this to use a {@link IReconcileEngine} ported * from old STS codebase to validate a given {@link TextDocument} and publish Diagnostics. @@ -718,4 +719,16 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC return hasCompletionSnippetSupport; } + @Override + public void sprottyMessage(JsonObject message) { + if (this.sprottyMessageHandler != null) { + async.execute(() -> this.sprottyMessageHandler.handleMessage(message)); + } + } + + public void onSprottyMessage(SprottyMessageHandler h) { + Assert.isNull("Multiple handlers not supported!", this.sprottyMessageHandler); + this.sprottyMessageHandler = h; + } + } diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SprottyMessageHandler.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SprottyMessageHandler.java new file mode 100644 index 000000000..de835b45f --- /dev/null +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SprottyMessageHandler.java @@ -0,0 +1,8 @@ +package org.springframework.ide.vscode.commons.languageserver.util; + +import com.google.gson.JsonObject; + +@FunctionalInterface +public interface SprottyMessageHandler { + void handleMessage(JsonObject message); +} 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 626590859..4e6543f9a 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 @@ -24,6 +24,7 @@ import org.springframework.ide.vscode.commons.protocol.java.JavaCodeCompletePara import org.springframework.ide.vscode.commons.protocol.java.JavaDataParams; import org.springframework.ide.vscode.commons.protocol.java.JavaSearchParams; import org.springframework.ide.vscode.commons.protocol.java.JavaTypeHierarchyParams; +import org.springframework.ide.vscode.commons.protocol.java.SprottyProtocol; import org.springframework.ide.vscode.commons.protocol.java.TypeData; import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; @@ -32,7 +33,7 @@ import org.springframework.ide.vscode.commons.protocol.java.TypeDescriptorData; * * @author Kris De Volder */ -public interface STS4LanguageClient extends LanguageClient { +public interface STS4LanguageClient extends LanguageClient, SprottyProtocol { @JsonNotification("sts/highlight") void highlight(HighlightParams highlights); diff --git a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/SprottyClient.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/SprottyClient.java deleted file mode 100644 index bea4f6c7e..000000000 --- a/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/SprottyClient.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.springframework.ide.vscode.commons.protocol; - -import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; - -import com.google.gson.JsonObject; - -public interface SprottyClient { - - @JsonNotification("sts/progress") - void sprottyMessage(JsonObject message); - -} diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/sprotty/SprottyService.java b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/SprottyProtocol.java similarity index 63% rename from headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/sprotty/SprottyService.java rename to headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/SprottyProtocol.java index 71ebac8e8..8fb155d20 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/sprotty/SprottyService.java +++ b/headless-services/commons/commons-lsp-extensions/src/main/java/org/springframework/ide/vscode/commons/protocol/java/SprottyProtocol.java @@ -1,10 +1,10 @@ -package org.springframework.ide.vscode.commons.languageserver.sprotty; +package org.springframework.ide.vscode.commons.protocol.java; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; import com.google.gson.JsonObject; -public interface SprottyService { +public interface SprottyProtocol { @JsonNotification("sts/sprotty") void sprottyMessage(JsonObject message); diff --git a/headless-services/commons/commons-sprotty/pom.xml b/headless-services/commons/commons-sprotty/pom.xml index 669175c08..c0f680c71 100644 --- a/headless-services/commons/commons-sprotty/pom.xml +++ b/headless-services/commons/commons-sprotty/pom.xml @@ -8,6 +8,11 @@ commons-sprotty + + org.springframework.ide.vscode + commons-language-server + ${project.version} + org.springframework.boot spring-boot-starter diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramWebsocketServer.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramWebsocketServer.java index 12b02d010..29435c58f 100644 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramWebsocketServer.java +++ b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramWebsocketServer.java @@ -11,6 +11,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; +import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.stereotype.Controller; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; @@ -22,6 +23,9 @@ import org.springframework.web.socket.handler.TextWebSocketHandler; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; + +import reactor.core.publisher.Mono; @Controller public class DiagramWebsocketServer implements WebSocketConfigurer, InitializingBean { @@ -35,6 +39,9 @@ public class DiagramWebsocketServer implements WebSocketConfigurer, Initializing @Autowired private IDiagramServer diagramServer; + @Autowired + private SimpleLanguageServer server; + private void initializeGson() { if (gson == null) { GsonBuilder builder = new GsonBuilder(); @@ -46,6 +53,15 @@ public class DiagramWebsocketServer implements WebSocketConfigurer, Initializing @Override public void afterPropertiesSet() throws Exception { initializeGson(); + server.onSprottyMessage((jsonMessage) -> { + ActionMessage actionMessage = gson.fromJson(jsonMessage, ActionMessage.class); + diagramServer.accept(actionMessage); + }); + server.doOnInitialized(() -> { + diagramServer.setRemoteEndpoint(message -> { + sendMessage((JsonObject)gson.toJsonTree(message)); + }); + }); } @Override @@ -73,9 +89,6 @@ public class DiagramWebsocketServer implements WebSocketConfigurer, Initializing } log.info("Websocket connection OPENED in: "+this); log.info("Number of active sessions = {}", ws_sessions.size()); - diagramServer.setRemoteEndpoint(message -> { - sendMessage(gson.toJson(message, ActionMessage.class)); - }); } @Override @@ -116,13 +129,14 @@ public class DiagramWebsocketServer implements WebSocketConfigurer, Initializing }; } - private void sendMessage(String msg) { + private void sendMessage(JsonObject msg) { + server.getClient().sprottyMessage(msg); synchronized (ws_sessions) { for (WebSocketSession ws : ws_sessions) { try { if (ws.isOpen()) { log.info("Sent: {}", msg); - ws.sendMessage(new TextMessage(msg)); + ws.sendMessage(new TextMessage(msg.toString())); } } catch (Exception e) { log.error("Error forwarding message to ws session", e); 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 1b94688f3..6b1685f09 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 @@ -132,6 +132,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.MultimapBuilder; import com.google.gson.Gson; import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import reactor.core.publisher.Mono; @@ -394,6 +395,10 @@ public class LanguageServerHarness { return CompletableFuture.completedFuture(Collections.emptyList()); } + @Override + public void sprottyMessage(JsonObject message) { + } + }); }