You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by en...@apache.org on 2022/10/10 07:56:51 UTC

[netbeans] branch master updated: Add debugger listening connector to LSP.

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

entl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new dfe012cdd4 Add debugger listening connector to LSP.
dfe012cdd4 is described below

commit dfe012cdd4a5a488d6f55e33bb7f2b47c08d7080
Author: Martin Entlicher <ma...@oracle.com>
AuthorDate: Fri Oct 7 17:24:58 2022 +0200

    Add debugger listening connector to LSP.
---
 .../debugging/attach/AttachConfigurations.java     | 18 ++++++++++++---
 .../debugging/attach/ConfigurationAttributes.java  | 22 ++++++++++++++----
 .../debugging/attach/NbAttachRequestHandler.java   | 27 ++++++++++++++--------
 java/java.lsp.server/vscode/package.json           |  5 ++++
 4 files changed, 56 insertions(+), 16 deletions(-)

diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/AttachConfigurations.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/AttachConfigurations.java
index 6e501784cb..3a79ead521 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/AttachConfigurations.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/AttachConfigurations.java
@@ -20,6 +20,8 @@ package org.netbeans.modules.java.lsp.server.debugging.attach;
 
 import com.sun.jdi.Bootstrap;
 import com.sun.jdi.connect.AttachingConnector;
+import com.sun.jdi.connect.Connector;
+import com.sun.jdi.connect.ListeningConnector;
 import com.sun.tools.attach.AttachNotSupportedException;
 import com.sun.tools.attach.VirtualMachine;
 import com.sun.tools.attach.VirtualMachineDescriptor;
@@ -59,16 +61,21 @@ public final class AttachConfigurations {
 
     private final List<ConfigurationAttributes> configurations;
 
-    private AttachConfigurations(List<AttachingConnector> attachingConnectors) {
+    private AttachConfigurations(List<Connector> attachingConnectors) {
         List<ConfigurationAttributes> configs = new ArrayList<>(5);
-        for (AttachingConnector ac : attachingConnectors) {
+        for (Connector ac : attachingConnectors) {
             configs.add(new ConfigurationAttributes(ac));
         }
         this.configurations = Collections.unmodifiableList(configs);
     }
 
     public static AttachConfigurations get() {
-        return new AttachConfigurations(Bootstrap.virtualMachineManager().attachingConnectors());
+        List<AttachingConnector> attachingConnectors = Bootstrap.virtualMachineManager().attachingConnectors();
+        List<ListeningConnector> listeningConnectors = Bootstrap.virtualMachineManager().listeningConnectors();
+        List<Connector> connectors = new ArrayList<>(attachingConnectors.size() + listeningConnectors.size());
+        connectors.addAll(attachingConnectors);
+        connectors.addAll(listeningConnectors);
+        return new AttachConfigurations(connectors);
     }
 
     public static CompletableFuture<Object> findConnectors() {
@@ -111,7 +118,12 @@ public final class AttachConfigurations {
             return null;
         }
         Set<String> names = attributes.keySet();
+        Object listenValue = attributes.get("listen");
+        boolean listen = listenValue != null && ("true".equals(listenValue) || Boolean.TRUE.equals(listenValue));
         for (ConfigurationAttributes config : configurations) {
+            if (listen != (config.getConnector() instanceof ListeningConnector)) {
+                continue;
+            }
             if (config.areMandatoryAttributesIn(names)) {
                 return config;
             }
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/ConfigurationAttributes.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/ConfigurationAttributes.java
index 82d4083faf..58ba4f9d21 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/ConfigurationAttributes.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/ConfigurationAttributes.java
@@ -20,6 +20,7 @@ package org.netbeans.modules.java.lsp.server.debugging.attach;
 
 import com.sun.jdi.connect.AttachingConnector;
 import com.sun.jdi.connect.Connector;
+import com.sun.jdi.connect.ListeningConnector;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -39,13 +40,14 @@ final class ConfigurationAttributes {
     private static final String CONNECTOR_PROCESS = "com.sun.jdi.ProcessAttach";    // NOI18N
     private static final String CONNECTOR_SOCKET = "com.sun.jdi.SocketAttach";      // NOI18N
     private static final String CONNECTOR_SHMEM = "com.sun.jdi.SharedMemoryAttach"; // NOI18N
+    private static final String CONNECTOR_SOCKET_LISTEN = "com.sun.jdi.SocketListen";      // NOI18N
 
     static final String PROCESS_ARG_PID = "processId";          // NOI18N
     static final String SOCKET_ARG_HOST = "hostName";           // NOI18N
     static final String SOCKET_ARG_PORT = "port";               // NOI18N
     static final String SHMEM_ARG_NAME = "sharedMemoryName";    // NOI18N
 
-    private final AttachingConnector ac;
+    private final Connector ac;
     private final String id;
     private final String name;
     private final String description;
@@ -54,12 +56,14 @@ final class ConfigurationAttributes {
     @NbBundle.Messages({"LBL_AttachToProcess=Attach to Process",
                         "LBL_AttachToPort=Attach to Port",
                         "LBL_AttachToShmem=Attach to Shared Memory",
+                        "LBL_ListenOnPort=Listen on Port",
+                        "LBL_ListenForAttach=Listen for the debuggee to attach",
                         "# {0} - connector name", "LBL_AttachBy=Attach by {0}",
                         "DESC_Process=Process Id of the debuggee",
                         "DESC_HostName=Name or IP address of the host machine to connect to",
                         "DESC_Port=Port number to connect to",
                         "DESC_ShMem=Shared memory transport address at which the target VM is listening"})
-    ConfigurationAttributes(AttachingConnector ac) {
+    ConfigurationAttributes(Connector ac) {
         this.ac = ac;
         String connectorName = ac.name();
         this.id = connectorName;
@@ -82,6 +86,13 @@ final class ConfigurationAttributes {
                 String shmName = getArgumentOrDefault(defaultArguments.get("name"), ""); // NOI18N
                 attributes.put(SHMEM_ARG_NAME, new ConfigurationAttribute(shmName, Bundle.DESC_ShMem(), true));
                 break;
+            case CONNECTOR_SOCKET_LISTEN:
+                this.name = Bundle.LBL_ListenOnPort();
+                hostName = getArgumentOrDefault(defaultArguments.get("hostname"), "localhost"); // NOI18N
+                port = getArgumentOrDefault(defaultArguments.get("port"), "8000"); // NOI18N
+                attributes.put(SOCKET_ARG_HOST, new ConfigurationAttribute(hostName, Bundle.DESC_HostName(), true));
+                attributes.put(SOCKET_ARG_PORT, new ConfigurationAttribute(port, Bundle.DESC_Port(), true));
+                break;
             default:
                 this.name = Bundle.LBL_AttachBy(connectorName);
                 for (Connector.Argument arg : defaultArguments.values()) {
@@ -91,10 +102,13 @@ final class ConfigurationAttributes {
                 }
         }
         for (Connector.Argument arg : defaultArguments.values()) {
-            if (!arg.mustSpecify()) {
+            if (!arg.mustSpecify() && !attributes.containsKey(arg.name())) {
                 attributes.put(arg.name(), new ConfigurationAttribute(arg.value(), arg.description(), false));
             }
         }
+        if (ac instanceof ListeningConnector) {
+            attributes.put("listen", new ConfigurationAttribute("true", Bundle.LBL_ListenForAttach(), true));
+        }
     }
 
     public String getId() {
@@ -109,7 +123,7 @@ final class ConfigurationAttributes {
         return description;
     }
 
-    public AttachingConnector getConnector() {
+    public Connector getConnector() {
         return ac;
     }
 
diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/NbAttachRequestHandler.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/NbAttachRequestHandler.java
index cc22ad72c2..9563381f26 100644
--- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/NbAttachRequestHandler.java
+++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/debugging/attach/NbAttachRequestHandler.java
@@ -19,7 +19,9 @@
 package org.netbeans.modules.java.lsp.server.debugging.attach;
 
 import com.sun.jdi.connect.AttachingConnector;
+import com.sun.jdi.connect.Connector;
 import com.sun.jdi.connect.Connector.Argument;
+import com.sun.jdi.connect.ListeningConnector;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -44,6 +46,7 @@ import org.netbeans.api.debugger.Session;
 import org.netbeans.api.debugger.jpda.AttachingDICookie;
 import org.netbeans.api.debugger.jpda.DebuggerStartException;
 import org.netbeans.api.debugger.jpda.JPDADebugger;
+import org.netbeans.api.debugger.jpda.ListeningDICookie;
 import org.netbeans.modules.java.lsp.server.debugging.DebugAdapterContext;
 import org.netbeans.modules.java.lsp.server.debugging.launch.NbDebugSession;
 import org.netbeans.modules.java.lsp.server.debugging.ni.NILocationVisualizer;
@@ -162,7 +165,7 @@ public final class NbAttachRequestHandler {
         CompletableFuture<Void> resultFuture = new CompletableFuture<>();
         ConfigurationAttributes configurationAttributes = AttachConfigurations.get().findConfiguration(attachArguments);
         if (configurationAttributes != null) {
-            AttachingConnector connector = configurationAttributes.getConnector();
+            Connector connector = configurationAttributes.getConnector();
             RP.post(() -> attachTo(connector, attachArguments, context, resultFuture));
         } else {
             context.setDebugMode(true);
@@ -175,7 +178,7 @@ public final class NbAttachRequestHandler {
     }
 
     @Messages({"# {0} - argument name", "# {1} - value", "MSG_ConnectorInvalidValue=Invalid value of {0}: {1}"})
-    private void attachTo(AttachingConnector connector, Map<String, Object> arguments, DebugAdapterContext context, CompletableFuture<Void> resultFuture) {
+    private void attachTo(Connector connector, Map<String, Object> arguments, DebugAdapterContext context, CompletableFuture<Void> resultFuture) {
         Map<String, Argument> args = connector.defaultArguments();
         for (String argName : arguments.keySet()) {
             String argNameTranslated = ATTR_CONFIG_TO_CONNECTOR.getOrDefault(argName, argName);
@@ -192,16 +195,22 @@ public final class NbAttachRequestHandler {
             }
             arg.setValue(value);
         }
-        AttachingDICookie attachingCookie = AttachingDICookie.create(connector, args);
-        resultFuture.complete(null);
-        startAttaching(attachingCookie, context);
+        DebuggerInfo debuggerInfo;
+        if (connector instanceof AttachingConnector) {
+            AttachingDICookie attachingCookie = AttachingDICookie.create((AttachingConnector) connector, args);
+            resultFuture.complete(null);
+            debuggerInfo = DebuggerInfo.create(AttachingDICookie.ID, new Object [] { attachingCookie });
+        } else {
+            assert connector instanceof ListeningConnector : connector;
+            ListeningDICookie listeningCookie = ListeningDICookie.create((ListeningConnector) connector, args);
+            debuggerInfo = DebuggerInfo.create(ListeningDICookie.ID, new Object [] { listeningCookie });
+        }
+        startAttaching(debuggerInfo, context);
     }
 
     @Messages("MSG_FailedToAttach=Failed to attach.")
-    private void startAttaching(AttachingDICookie attachingCookie, DebugAdapterContext context) {
-        DebuggerEngine[] es = DebuggerManager.getDebuggerManager ().startDebugging(
-            DebuggerInfo.create(AttachingDICookie.ID, new Object [] { attachingCookie })
-        );
+    private void startAttaching(DebuggerInfo debuggerInfo, DebugAdapterContext context) {
+        DebuggerEngine[] es = DebuggerManager.getDebuggerManager ().startDebugging(debuggerInfo);
         if (es.length > 0) {
             JPDADebugger debugger = es[0].lookupFirst(null, JPDADebugger.class);
             if (debugger != null) {
diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json
index 29483c7c7e..8b6139bd17 100644
--- a/java/java.lsp.server/vscode/package.json
+++ b/java/java.lsp.server/vscode/package.json
@@ -326,6 +326,11 @@
 								"default": "${command:java.attachDebugger.pickProcess}",
 								"description": "Process Id of the debuggee"
 							},
+							"listen": {
+								"type": "string",
+								"default": "false",
+								"description": "Listen for the debuggee to attach"
+							},
 							"timeout": {
 								"type": "string",
 								"default": "30000",


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

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