This is an automated email from the ASF dual-hosted git repository.

jhorvath pushed a commit to branch vscode-named-output
in repository https://gitbox.apache.org/repos/asf/netbeans.git

commit 0a658dcfa3b92937837f1ab287c492c91501c8cc
Author: Jan Horvath <[email protected]>
AuthorDate: Thu Nov 28 08:32:08 2024 +0100

    Create new output channel for every LspIO
---
 .../lsp/server/protocol/NbCodeClientWrapper.java   | 21 +++++++++++++++
 .../lsp/server/protocol/NbCodeLanguageClient.java  | 12 +++++++++
 .../modules/java/lsp/server/protocol/Server.java   | 21 +++++++++++++++
 .../server/ui/AbstractLspInputOutputProvider.java  | 27 +++++++++++++++++--
 .../java/lsp/server/TestCodeLanguageClient.java    | 22 ++++++++++++++++
 .../java/lsp/server/explorer/ProjectViewTest.java  | 21 +++++++++++++++
 java/java.lsp.server/vscode/src/extension.ts       | 30 +++++++++++++++++++++-
 java/java.lsp.server/vscode/src/protocol.ts        | 21 +++++++++++++++
 8 files changed, 172 insertions(+), 3 deletions(-)

diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java
index 7f633df6758..a0c4f672ca3 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java
@@ -223,4 +223,25 @@ class NbCodeClientWrapper implements NbCodeLanguageClient {
     public CompletableFuture<Boolean> 
requestDocumentSave(SaveDocumentRequestParams documentUris) {
         return remote.requestDocumentSave(documentUris);
     }
+
+    @Override
+    public CompletableFuture<Void> writeOutput(OutputMessage lm) {
+        return remote.writeOutput(lm);
+    }
+
+    @Override
+    public CompletableFuture<Void> showOutput(String outputName) {
+        return remote.showOutput(outputName);
+    }
+
+    @Override
+    public CompletableFuture<Void> closeOutput(String outputName) {
+        return remote.closeOutput(outputName);
+    }
+    
+    @Override
+    public CompletableFuture<Void> resetOutput(String outputName) {
+        return remote.resetOutput(outputName);
+    }
+    
 }
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java
index 1c44d56fa5f..767edb696c2 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java
@@ -154,4 +154,16 @@ public interface NbCodeLanguageClient extends 
LanguageClient {
     @JsonRequest("window/documentSave")
     public CompletableFuture<Boolean> requestDocumentSave(@NonNull 
SaveDocumentRequestParams documentUri);
     
+    @JsonRequest("output/write")
+    public CompletableFuture<Void> writeOutput(OutputMessage message);
+    
+    @JsonRequest("output/show")
+    public CompletableFuture<Void> showOutput(String outputName);
+    
+    @JsonRequest("output/close")
+    public CompletableFuture<Void> closeOutput(String outputName);
+
+    @JsonRequest("output/reset")
+    public CompletableFuture<Void> resetOutput(String outputName);
+    
 }
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
index 120c8590877..6060385d63c 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
@@ -1358,6 +1358,27 @@ public final class Server {
             logWarning(Arrays.asList(documentUris));
             return CompletableFuture.completedFuture(false);
         }
+
+        @Override
+        public CompletableFuture<Void> writeOutput(OutputMessage lm) {
+            logWarning(lm.message);
+            return CompletableFuture.completedFuture(null);
+        }
+
+        @Override
+        public CompletableFuture<Void> showOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
+
+        @Override
+        public CompletableFuture<Void> closeOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
+        
+        @Override
+        public CompletableFuture<Void> resetOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
     };
 
 
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java
index 34c3407af84..5160e367f22 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java
@@ -18,6 +18,7 @@
  */
 package org.netbeans.modules.java.lsp.server.ui;
 
+import org.netbeans.modules.java.lsp.server.protocol.OutputMessage;
 import java.io.CharArrayReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -29,6 +30,8 @@ import java.util.Set;
 import org.netbeans.api.io.Hyperlink;
 import org.netbeans.api.io.OutputColor;
 import org.netbeans.api.io.ShowOperation;
+import org.netbeans.modules.java.lsp.server.LspServerUtils;
+import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
 import 
org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider.LspIO;
 import org.netbeans.spi.io.InputOutputProvider;
 import org.openide.util.Lookup;
@@ -82,14 +85,26 @@ public abstract class AbstractLspInputOutputProvider 
implements InputOutputProvi
 
     @Override
     public final void resetIO(LspIO io) {
+        NbCodeLanguageClient client = 
LspServerUtils.findLspClient(Lookup.getDefault());
+        if (client != null) {
+            client.resetOutput(io.name);
+        }
     }
 
     @Override
     public final void showIO(LspIO io, Set<ShowOperation> operations) {
+        NbCodeLanguageClient client = 
LspServerUtils.findLspClient(Lookup.getDefault());
+        if (client != null) {
+            client.showOutput(io.name);
+        }
     }
 
     @Override
     public final void closeIO(LspIO io) {
+        NbCodeLanguageClient client = 
LspServerUtils.findLspClient(Lookup.getDefault());
+        if (client != null) {
+            client.closeOutput(io.name);
+        }
     }
 
     @Override
@@ -131,6 +146,7 @@ public abstract class AbstractLspInputOutputProvider 
implements InputOutputProvi
     public static final class LspIO {
         private final String name;
         private final IOContext ctx;
+        private final NbCodeLanguageClient client;
         final Lookup lookup;
         final Reader in;
         final LspWriter out;
@@ -164,12 +180,16 @@ public abstract class AbstractLspInputOutputProvider 
implements InputOutputProvi
                 };
             }
             this.in = in;
+            client = LspServerUtils.findLspClient(Lookup.getDefault());
+            if (client == null) {
+                throw new IllegalStateException("Unable to find LspClient");
+            }
         }
 
         boolean isClosed() {
             return out.closed && err.closed;
         }
-
+        
         private final class LspWriter extends Writer {
             private final boolean stdIO;
             volatile boolean closed;
@@ -186,6 +206,9 @@ public abstract class AbstractLspInputOutputProvider 
implements InputOutputProvi
                 } else {
                     ctx.stdErr(chunk);
                 }
+                if (len > 0) {
+                    client.writeOutput(new OutputMessage(name, chunk));
+                }
             }
 
             @Override
@@ -198,5 +221,5 @@ public abstract class AbstractLspInputOutputProvider 
implements InputOutputProvi
             }
         }
     }
-
+    
 }
diff --git 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java
 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java
index 489670f5725..31f9a128ece 100644
--- 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java
+++ 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java
@@ -43,6 +43,7 @@ import 
org.netbeans.modules.java.lsp.server.protocol.SetTextEditorDecorationPara
 import org.netbeans.modules.java.lsp.server.input.ShowInputBoxParams;
 import org.netbeans.modules.java.lsp.server.input.ShowMutliStepInputParams;
 import org.netbeans.modules.java.lsp.server.input.ShowQuickPickParams;
+import org.netbeans.modules.java.lsp.server.protocol.OutputMessage;
 import org.netbeans.modules.java.lsp.server.protocol.SaveDocumentRequestParams;
 import org.netbeans.modules.java.lsp.server.protocol.ShowStatusMessageParams;
 import org.netbeans.modules.java.lsp.server.protocol.TestProgressParams;
@@ -160,4 +161,25 @@ public abstract class TestCodeLanguageClient implements 
NbCodeLanguageClient {
     public CompletableFuture<Boolean> 
requestDocumentSave(SaveDocumentRequestParams documentUris) {
         return CompletableFuture.completedFuture(false);
     }
+    
+    @Override
+    public CompletableFuture<Void> writeOutput(OutputMessage message) {
+        System.out.println(message);
+        return CompletableFuture.completedFuture(null);
+    }
+
+    @Override
+    public CompletableFuture<Void> showOutput(String outputName) {
+        return CompletableFuture.completedFuture(null);
+    }
+
+    @Override
+    public CompletableFuture<Void> closeOutput(String outputName) {
+        return CompletableFuture.completedFuture(null);
+    }
+    
+    @Override
+    public CompletableFuture<Void> resetOutput(String outputName) {
+        return CompletableFuture.completedFuture(null);
+    }
 }
diff --git 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java
 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java
index 592ad8a726b..a8edbcb45bb 100644
--- 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java
+++ 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java
@@ -77,6 +77,7 @@ import 
org.netbeans.modules.java.lsp.server.input.QuickPickItem;
 import org.netbeans.modules.java.lsp.server.input.ShowInputBoxParams;
 import org.netbeans.modules.java.lsp.server.input.ShowMutliStepInputParams;
 import org.netbeans.modules.java.lsp.server.input.ShowQuickPickParams;
+import org.netbeans.modules.java.lsp.server.protocol.OutputMessage;
 import org.netbeans.modules.java.lsp.server.protocol.SaveDocumentRequestParams;
 import 
org.netbeans.modules.java.lsp.server.protocol.SetTextEditorDecorationParams;
 import org.netbeans.modules.java.lsp.server.protocol.ShowStatusMessageParams;
@@ -285,6 +286,26 @@ public class ProjectViewTest extends NbTestCase {
         public CompletableFuture<Boolean> 
requestDocumentSave(SaveDocumentRequestParams documentUris) {
             return CompletableFuture.completedFuture(false);
         }
+
+        @Override
+        public CompletableFuture<Void> writeOutput(OutputMessage message) {
+            return CompletableFuture.completedFuture(null);
+        }
+
+        @Override
+        public CompletableFuture<Void> showOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
+
+        @Override
+        public CompletableFuture<Void> closeOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
+        
+        @Override
+        public CompletableFuture<Void> resetOutput(String outputName) {
+            return CompletableFuture.completedFuture(null);
+        }
     }
 
     private static Launcher<NbLanguageServer> 
createLauncher(NbCodeLanguageClient client, InputStream in, OutputStream out,
diff --git a/java/java.lsp.server/vscode/src/extension.ts 
b/java/java.lsp.server/vscode/src/extension.ts
index 8db683de509..16a0f12cacf 100644
--- a/java/java.lsp.server/vscode/src/extension.ts
+++ b/java/java.lsp.server/vscode/src/extension.ts
@@ -52,7 +52,7 @@ import * as launcher from './nbcode';
 import {NbTestAdapter} from './testAdapter';
 import { asRanges, StatusMessageRequest, ShowStatusMessageParams, 
QuickPickRequest, InputBoxRequest, MutliStepInputRequest, 
TestProgressNotification, DebugConnector,
          TextEditorDecorationCreateRequest, 
TextEditorDecorationSetNotification, TextEditorDecorationDisposeNotification, 
HtmlPageRequest, HtmlPageParams,
-         ExecInHtmlPageRequest, SetTextEditorDecorationParams, 
ProjectActionParams, UpdateConfigurationRequest, QuickPickStep, InputBoxStep, 
SaveDocumentsRequest, SaveDocumentRequestParams
+         ExecInHtmlPageRequest, SetTextEditorDecorationParams, 
ProjectActionParams, UpdateConfigurationRequest, QuickPickStep, InputBoxStep, 
SaveDocumentsRequest, SaveDocumentRequestParams, OutputMessage, 
WriteOutputRequest, ShowOutputRequest, CloseOutputRequest, ResetOutputRequest 
 } from './protocol';
 import * as launchConfigurations from './launchConfigurations';
 import { createTreeViewService, TreeViewService, TreeItemDecorator, 
Visualizer, CustomizableTreeDataProvider } from './explorer';
@@ -81,6 +81,8 @@ let debugPort: number = -1;
 let consoleLog: boolean = !!process.env['ENABLE_CONSOLE_LOG'];
 let specifiedJDKWarned : string[] = [];
 
+const outputChannels: Map<string, vscode.OutputChannel> = new Map();
+
 export class NbLanguageClient extends LanguageClient {
     private _treeViewService: TreeViewService;
 
@@ -377,6 +379,15 @@ function getValueAfterPrefix(input: string | undefined, 
prefix: string): string
     return '';
 }
 
+function getOrCreateOutputChannel(name: string): vscode.OutputChannel {
+    let outputChannel = outputChannels.get(name);
+    if (!outputChannel) {
+        outputChannel = vscode.window.createOutputChannel(name);
+        outputChannels.set(name, outputChannel);
+    }
+    return outputChannel;
+}
+
 export function activate(context: ExtensionContext): VSNetBeansAPI {    
     const provider = new StringContentProvider();
     const scheme = 'in-memory';
@@ -1508,6 +1519,23 @@ function doActivateWithJDK(specifiedJDK: string | null, 
context: ExtensionContex
             decorations.set(decorationType.key, decorationType);
             return decorationType.key;
         });
+        c.onRequest(WriteOutputRequest.type, param => {
+            const outputChannel = getOrCreateOutputChannel(param.outputName);
+            outputChannel.append(param.message);
+        });
+        c.onRequest(ShowOutputRequest.type, param => {
+            const outputChannel = getOrCreateOutputChannel(param);
+            outputChannel.show();
+        });
+        c.onRequest(CloseOutputRequest.type, param => {
+            const outputChannel = getOrCreateOutputChannel(param);
+            outputChannel.clear();
+            outputChannel.hide();
+        });
+        c.onRequest(ResetOutputRequest.type, param => {
+            const outputChannel = getOrCreateOutputChannel(param);
+            outputChannel.clear();
+        });
         c.onNotification(TextEditorDecorationSetNotification.type, param => {
             let decorationType = decorations.get(param.key);
             if (decorationType) {
diff --git a/java/java.lsp.server/vscode/src/protocol.ts 
b/java/java.lsp.server/vscode/src/protocol.ts
index fbe70181121..8b7ec6a972f 100644
--- a/java/java.lsp.server/vscode/src/protocol.ts
+++ b/java/java.lsp.server/vscode/src/protocol.ts
@@ -323,3 +323,24 @@ export function asRange(value: Range | undefined | null): 
vscode.Range | undefin
 export function asRanges(value: Range[]): vscode.Range[] {
     return value.map(value => asRange(value));
 }
+
+export interface OutputMessage {
+    outputName: string;
+    message: string;
+}
+
+export namespace WriteOutputRequest {
+    export const type = new ProtocolRequestType<OutputMessage, void, void, 
void, void>('output/write');
+}
+
+export namespace ShowOutputRequest {
+    export const type = new ProtocolRequestType<string, void, void, void, 
void>('output/show');
+}
+
+export namespace CloseOutputRequest {
+    export const type = new ProtocolRequestType<string, void, void, void, 
void>('output/close');
+}
+
+export namespace ResetOutputRequest {
+    export const type = new ProtocolRequestType<string, void, void, void, 
void>('output/reset');
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to