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..81acddabc 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 @@ -84,6 +84,7 @@ import org.springframework.ide.vscode.commons.util.CollectionUtil; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableList.Builder; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -401,10 +402,16 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC codeLensOptions.setResolveProvider(hasCodeLensResolveProvider()); c.setCodeLensProvider(codeLensOptions ); } - if (hasExecuteCommandSupport && hasQuickFixes()) { - c.setExecuteCommandProvider(new ExecuteCommandOptions(ImmutableList.of( - CODE_ACTION_COMMAND_ID - ))); + if (hasExecuteCommandSupport && ( + hasQuickFixes() || + !commands.isEmpty() + )) { + ImmutableList.Builder supportedCommands = ImmutableList.builder(); + if (hasQuickFixes()) { + supportedCommands.add(CODE_ACTION_COMMAND_ID); + } + supportedCommands.addAll(commands.keySet()); + c.setExecuteCommandProvider(new ExecuteCommandOptions(supportedCommands.build())); } if (hasWorkspaceSymbolHandler()) { c.setWorkspaceSymbolProvider(true); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/LiveProcessCommand.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/LiveProcessCommand.java index 25337ba29..a91eb9748 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/LiveProcessCommand.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/LiveProcessCommand.java @@ -43,4 +43,8 @@ public class LiveProcessCommand { this.action = action; } + @Override + public String toString() { + return "LiveProcessCommand [processKey=" + processKey + ", label=" + label + ", action=" + action + "]"; + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java index 932d38014..239aeb9dd 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/livehover/v2/SpringProcessCommandHandler.java @@ -18,7 +18,10 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.ExecuteCommandParams; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.boot.java.livehover.v2.SpringProcessConnectorRemote.RemoteBootAppData; +import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import com.google.gson.JsonElement; @@ -29,6 +32,8 @@ import com.google.gson.JsonObject; */ public class SpringProcessCommandHandler { + private static final Logger log = LoggerFactory.getLogger(SpringProcessCommandHandler.class); + private static final String COMMAND_LIST_PROCESSES = "sts/livedata/listProcesses"; private static final String COMMAND_CONNECT = "sts/livedata/connect"; private static final String COMMAND_REFRESH = "sts/livedata/refresh"; @@ -47,19 +52,22 @@ public class SpringProcessCommandHandler { server.onCommand(COMMAND_LIST_PROCESSES, (params) -> { return getProcessCommands(); }); + log.info("Registered command handler: {}",COMMAND_LIST_PROCESSES); server.onCommand(COMMAND_CONNECT, (params) -> { return connect(params); }); + log.info("Registered command handler: {}",COMMAND_CONNECT); server.onCommand(COMMAND_REFRESH, (params) -> { return refresh(params); }); + log.info("Registered command handler: {}",COMMAND_REFRESH); server.onCommand(COMMAND_DISCONNECT, (params) -> { return disconnect(params); }); - + log.info("Registered command handler: {}",COMMAND_DISCONNECT); } private CompletableFuture connect(ExecuteCommandParams params) { @@ -166,7 +174,7 @@ public class SpringProcessCommandHandler { result.add(command); } } - + log.info("getProcessCommands => {}", result); return CompletableFuture.completedFuture((Object[]) result.toArray(new Object[result.size()])); } diff --git a/vscode-extensions/vscode-spring-boot/lib/Main.ts b/vscode-extensions/vscode-spring-boot/lib/Main.ts index ff83022ec..94b5de896 100644 --- a/vscode-extensions/vscode-spring-boot/lib/Main.ts +++ b/vscode-extensions/vscode-spring-boot/lib/Main.ts @@ -4,6 +4,7 @@ import * as VSCode from 'vscode'; import {workspace} from 'vscode'; import * as commons from '@pivotal-tools/commons-vscode'; +import * as liveHoverUi from './live-hover-connect-ui'; import {LanguageClient} from "vscode-languageclient"; @@ -67,5 +68,8 @@ export function activate(context: VSCode.ExtensionContext): Thenable { + liveHoverUi.activate(client, options, context); + return client; + }); } diff --git a/vscode-extensions/vscode-spring-boot/lib/live-hover-connect-ui.ts b/vscode-extensions/vscode-spring-boot/lib/live-hover-connect-ui.ts new file mode 100644 index 000000000..d33d6edef --- /dev/null +++ b/vscode-extensions/vscode-spring-boot/lib/live-hover-connect-ui.ts @@ -0,0 +1,48 @@ +'use strict'; + +import * as VSCode from 'vscode'; +import { LanguageClient } from "vscode-languageclient"; +import { ActivatorOptions } from '@pivotal-tools/commons-vscode'; +import { stringify } from 'querystring'; + +interface ProcessCommandInfo { + processKey : string; + label: string; + action: string +} + +async function liveHoverConnectHandler() { + + //sts.vscode-spring-boot.codeAction + const processData : ProcessCommandInfo[] = await VSCode.commands.executeCommand('sts/livedata/listProcesses'); + const choiceMap = new Map(); + const choices : string[] = []; + processData.forEach(p => { + const slash = p.action.lastIndexOf('/'); + if (slash>=0) { + var actionLabel = p.action.substring(slash+1); + actionLabel = actionLabel.substring(0, 1).toUpperCase() + actionLabel.substring(1); + const choiceLabel = actionLabel + " " + p.label; + choiceMap.set(choiceLabel, p); + choices.push(choiceLabel); + } + }); + if (choices) { + const picked = await VSCode.window.showQuickPick(choices); + if (picked) { + const chosen = choiceMap.get(picked); + await VSCode.commands.executeCommand(chosen.action, chosen); + } + } +} + +/** Called when extension is activated */ +export function activate( + client: LanguageClient, + options: ActivatorOptions, + context: VSCode.ExtensionContext +) { + context.subscriptions.push( + VSCode.commands.registerCommand('vscode-spring-boot.live-hover.connect', liveHoverConnectHandler) + ); +} diff --git a/vscode-extensions/vscode-spring-boot/package.json b/vscode-extensions/vscode-spring-boot/package.json index 26d5949ac..37cc49d5b 100644 --- a/vscode-extensions/vscode-spring-boot/package.json +++ b/vscode-extensions/vscode-spring-boot/package.json @@ -64,6 +64,11 @@ "configuration": "./properties-support/language-configuration.json" } ], + "commands": [ { + "command": "vscode-spring-boot.live-hover.connect", + "title": "Manage Live Spring Boot Process Connections" + } + ], "configuration": { "type": "object", "title": "Boot-Java Configuration",