Show no live boot apps message in log levels UI

This commit is contained in:
aboyko
2024-04-18 10:05:50 -04:00
parent cb9c438bc8
commit 9b60d60035
2 changed files with 71 additions and 49 deletions

View File

@@ -2,6 +2,11 @@ import { LanguageClient } from "vscode-languageclient/node";
import { ActivatorOptions } from '@pivotal-tools/commons-vscode';
import { ExtensionContext, QuickPickItem, commands, window } from 'vscode';
export const CONNECT_CMD = "sts/livedata/connect";
export const DISCONNECT_CMD = "sts/livedata/disconnect";
export const REFRESH_CMD = "sts/livedata/refresh";
export const LIST_CMD = "sts/livedata/listProcesses";
interface ProcessCommandInfo {
processKey : string;
label: string;
@@ -21,7 +26,7 @@ export interface RemoteBootApp {
projectName?: string;
}
interface BootAppQuickPick extends QuickPickItem {
export interface BootAppQuickPick extends QuickPickItem {
commandInfo: ProcessCommandInfo;
}
@@ -33,23 +38,22 @@ let state: BootAppState
async function liveHoverConnectHandler() {
const quickPick = window.createQuickPick<BootAppQuickPick>();
quickPick.title = 'Searching for running Spring Boot Apps...';
quickPick.canSelectMany = true;
quickPick.canSelectMany = false;
quickPick.busy = true;
quickPick.show();
const processData : ProcessCommandInfo[] = await commands.executeCommand('sts/livedata/listProcesses');
const processData : ProcessCommandInfo[] = await commands.executeCommand(LIST_CMD);
const items = processData.map(p => {
let actionLabel = "";
switch (p.action) {
case "sts/livedata/connect":
case CONNECT_CMD:
actionLabel = "Show"
break;
case "sts/livedata/refresh":
case REFRESH_CMD:
actionLabel = "Refresh";
break;
case "sts/livedata/disconnect":
case DISCONNECT_CMD:
actionLabel = "Hide";
break;
}
@@ -92,10 +96,10 @@ async function liveHoverConnectHandler() {
async function executeLiveProcessAction(commandInfo: ProcessCommandInfo) {
if (activeBootApp?.jmxurl === commandInfo.processKey) {
switch (commandInfo.action) {
case "sts/livedata/connect":
case CONNECT_CMD:
await commands.executeCommand('vscode-spring-boot.live.show.active');
break;
case "sts/livedata/disconnect":
case DISCONNECT_CMD:
await commands.executeCommand('vscode-spring-boot.live.hide.active');
break;
default:
@@ -144,7 +148,7 @@ export function activate(
commands.registerCommand("vscode-spring-boot.live.show.active", async () => {
try {
updateBootAppState("connecting");
await commands.executeCommand('sts/livedata/connect', {
await commands.executeCommand(CONNECT_CMD, {
processKey: activeBootApp.jmxurl
});
updateBootAppState("connected");
@@ -155,7 +159,7 @@ export function activate(
}),
commands.registerCommand("vscode-spring-boot.live.refresh.active", async () => {
await commands.executeCommand('sts/livedata/refresh', {
await commands.executeCommand(REFRESH_CMD, {
processKey: activeBootApp.jmxurl
});
}),
@@ -163,7 +167,7 @@ export function activate(
commands.registerCommand("vscode-spring-boot.live.hide.active", async () => {
try {
updateBootAppState("disconnecting");
await commands.executeCommand('sts/livedata/disconnect', {
await commands.executeCommand(DISCONNECT_CMD, {
processKey: activeBootApp.jmxurl
});
updateBootAppState("disconnected");

View File

@@ -1,9 +1,8 @@
'use strict';
import * as VSCode from 'vscode';
import { LanguageClient } from "vscode-languageclient/node";
import { ActivatorOptions } from '@pivotal-tools/commons-vscode';
import { LiveProcess, LiveProcessLogLevelUpdatedNotification, LiveProcessUpdatedLogLevel } from './notification';
import { LiveProcessLogLevelUpdatedNotification, LiveProcessUpdatedLogLevel } from './notification';
import { BootAppQuickPick, CONNECT_CMD, DISCONNECT_CMD, LIST_CMD } from './live-hover-connect-ui';
import { ExtensionContext, ProgressLocation, commands, window } from "vscode";
interface ProcessCommandInfo {
processKey : string;
@@ -39,44 +38,57 @@ export interface LoggerItem {
}
async function setLogLevelHandler() {
const processData : ProcessCommandInfo[] = await VSCode.commands.executeCommand('sts/livedata/listProcesses');
const choiceMap = new Map<string, ProcessCommandInfo>();
const choices : string[] = [];
processData.forEach(p => {
const slash = p.action.lastIndexOf('/');
if (slash>=0) {
const choiceLabel = p.label;
if (!choiceMap.has(choiceLabel)) {
choiceMap.set(choiceLabel, p);
choices.push(choiceLabel);
}
}
});
if (choices) {
const picked = await VSCode.window.showQuickPick(choices);
if (picked) {
const chosen = choiceMap.get(picked);
try {
const loggers: ProcessLoggersData = await getLoggers(chosen);
await displayLoggers(loggers, chosen.processKey);
} catch (error) {
VSCode.window.showErrorMessage("Failed to fetch loggers for the process " + chosen.processKey);
}
const processInfo = await selectRunningProcess();
if (processInfo) {
try {
const loggers: ProcessLoggersData = await getLoggers(processInfo);
await displayLoggers(loggers, processInfo.processKey);
} catch (error) {
window.showErrorMessage("Failed to fetch loggers for the process " + processInfo.processKey);
}
}
}
async function selectRunningProcess(): Promise<ProcessCommandInfo | undefined> {
const quickPick = window.createQuickPick<BootAppQuickPick>();
quickPick.title = 'Searching for running Spring Boot Apps...';
quickPick.canSelectMany = false;
quickPick.busy = true;
quickPick.show();
const items = ((await commands.executeCommand(LIST_CMD)) as ProcessCommandInfo[]).filter(cp => CONNECT_CMD === cp.action || DISCONNECT_CMD === cp.action).map(cp => ({
label: cp.label,
commandInfo: cp
} as BootAppQuickPick));
quickPick.busy = false;
quickPick.title = items.length ? "Select running Spring Boot App" : "No running Spring Boot Apps found";
quickPick.items = items;
if (!items.length) {
quickPick.hide();
window.showInformationMessage("No running Spring Boot Apps found");
return;
}
return new Promise((resolve, reject) => {
quickPick.onDidChangeSelection(() => quickPick.hide());
quickPick.onDidHide(async () => resolve(Array.isArray(quickPick.selectedItems) ? quickPick.selectedItems[0]?.commandInfo : undefined))
});
}
async function getLoggers(processInfo: ProcessCommandInfo): Promise<ProcessLoggersData> {
return new Promise(async (resolve, reject) => {
await VSCode.window.withProgress({
location: VSCode.ProgressLocation.Window,
await window.withProgress({
location: ProgressLocation.Window,
title: "Fetching Loggers Data for process "+processInfo.processKey,
cancellable: false
}, async (progress) => {
try {
const loggers: ProcessLoggersData = await VSCode.commands.executeCommand('sts/livedata/getLoggers', processInfo, {"endpoint": "loggers"});
const loggers: ProcessLoggersData = await commands.executeCommand('sts/livedata/getLoggers', processInfo, {"endpoint": "loggers"});
progress.report({});
resolve(loggers);
} catch (error) {
@@ -102,17 +114,23 @@ async function displayLoggers(processLoggersData: ProcessLoggersData, processKey
});
}
if(items) {
const chosenPackage = await VSCode.window.showQuickPick(items);
const chosenPackage = await window.showQuickPick(items, {
canPickMany: false,
title: "Select Logger"
});
if (chosenPackage) {
const chosenlogLevel = await VSCode.window.showQuickPick(loggersData.levels);
await VSCode.commands.executeCommand('sts/livedata/configure/logLevel', {"processKey": processKey}, chosenPackage, {"configuredLevel":chosenlogLevel});
const chosenlogLevel = await window.showQuickPick(loggersData.levels, {
canPickMany: false,
title: "Select Level"
});
await commands.executeCommand('sts/livedata/configure/logLevel', {"processKey": processKey}, chosenPackage, {"configuredLevel":chosenlogLevel});
}
}
}
async function logLevelUpdated(process: LiveProcessUpdatedLogLevel) {
VSCode.window.showInformationMessage("The Log level for " + process.packageName + " has been updated from " +
window.showInformationMessage("The Log level for " + process.packageName + " has been updated from " +
process.effectiveLevel + " to " + process.configuredLevel);
}
@@ -120,15 +138,15 @@ async function logLevelUpdated(process: LiveProcessUpdatedLogLevel) {
export function activate(
client: LanguageClient,
options: ActivatorOptions,
context: VSCode.ExtensionContext
context: ExtensionContext
) {
client.onNotification(LiveProcessLogLevelUpdatedNotification.type, logLevelUpdated)
context.subscriptions.push(
VSCode.commands.registerCommand('vscode-spring-boot.set.log-levels', () => {
commands.registerCommand('vscode-spring-boot.set.log-levels', () => {
if (client.isRunning()) {
return setLogLevelHandler();
} else {
VSCode.window.showErrorMessage("No Spring Boot project found. Action is only available for Spring Boot Projects");
window.showErrorMessage("No Spring Boot project found. Action is only available for Spring Boot Projects");
}
})
);