diff --git a/vscode-extensions/vscode-spring-cli/package.json b/vscode-extensions/vscode-spring-cli/package.json index 07ec151d4..73095750a 100644 --- a/vscode-extensions/vscode-spring-cli/package.json +++ b/vscode-extensions/vscode-spring-cli/package.json @@ -25,10 +25,31 @@ "onStartupFinished" ], "contributes": { + "menus": { + "editor/context": [ + { + "when": "resourceFilename == pom.xml", + "command": "vscode-spring-cli.boot.add", + "group": "Spring-CLI" + } + ], + "explorer/context": [ + { + "when": "resourceFilename == pom.xml", + "command": "vscode-spring-cli.boot.add", + "group": "Spring-CLI" + } + ] + }, "commands": [ { - "command": "vscode-spring-cli.new-project", - "title": "New Project", + "command": "vscode-spring-cli.boot.new", + "title": "New Boot Project", + "category": "Spring CLI" + }, + { + "command": "vscode-spring-cli.boot.add", + "title": "Add to Boot Project", "category": "Spring CLI" } ] diff --git a/vscode-extensions/vscode-spring-cli/src/cli/core.ts b/vscode-extensions/vscode-spring-cli/src/cli/core.ts index cb55823c3..10bc04bca 100644 --- a/vscode-extensions/vscode-spring-cli/src/cli/core.ts +++ b/vscode-extensions/vscode-spring-cli/src/cli/core.ts @@ -1,4 +1,4 @@ -import { BootNewProjectMetadata, ProjectType } from "./types"; +import { BootAddMetadata, BootNewMetadata, ProjectType } from "./types"; import vscode from "vscode"; const SPRING_CLI_TASK_TYPE = 'spring-cli'; @@ -31,7 +31,7 @@ export class Cli { ]; } - createBootProject(metadata: BootNewProjectMetadata): Promise { + bootNew(metadata: BootNewMetadata): Promise { const args = [ "boot", "new", @@ -52,7 +52,17 @@ export class Cli { args.push("--package-name"); args.push(`"${metadata.rootPackage}"`); } - return this.exec('Create Spring Boot project', `'${metadata.catalogType}'`, metadata.targetFolder, args); + return this.exec("New Boot Project", `'${metadata.catalogType}'`, metadata.targetFolder, args); + } + + bootAdd(metadata: BootAddMetadata): Promise { + const args = [ + "boot", + "add", + "--from", + metadata.catalogType + ]; + return this.exec("Add to Boot Project", `'${metadata.catalogType}'`, metadata.targetFolder, args); } private async exec(title: string, message: string, cwd: string, args: string[]): Promise { diff --git a/vscode-extensions/vscode-spring-cli/src/cli/types.ts b/vscode-extensions/vscode-spring-cli/src/cli/types.ts index be926e143..f04e23fd6 100644 --- a/vscode-extensions/vscode-spring-cli/src/cli/types.ts +++ b/vscode-extensions/vscode-spring-cli/src/cli/types.ts @@ -6,11 +6,16 @@ export interface ProjectType { tags?: string[] } -export interface BootNewProjectMetadata { +export interface BootNewMetadata { name?: string; groupId?: string; artifactId?: string; catalogType?: string; rootPackage?: string; targetFolder?: string; +} + +export interface BootAddMetadata { + targetFolder?: string; + catalogType?: string; } \ No newline at end of file diff --git a/vscode-extensions/vscode-spring-cli/src/extension.ts b/vscode-extensions/vscode-spring-cli/src/extension.ts index f25fa2b8e..f8d85f101 100644 --- a/vscode-extensions/vscode-spring-cli/src/extension.ts +++ b/vscode-extensions/vscode-spring-cli/src/extension.ts @@ -4,14 +4,13 @@ "use strict"; import * as vscode from "vscode"; import { Cli } from "./cli/core"; -import { handleNew } from "./boot-project/boot-project"; +import { handleAdd, handleNew } from "./boot-project/boot-project"; export const CLI = new Cli(); export async function activate(context: vscode.ExtensionContext): Promise { - vscode.commands.registerCommand('vscode-spring-cli.new-project', () => { - handleNew({}); - }); + vscode.commands.registerCommand('vscode-spring-cli.boot.new', handleNew); + vscode.commands.registerCommand('vscode-spring-cli.boot.add', handleAdd); } export async function deactivate(): Promise { diff --git a/vscode-extensions/vscode-spring-cli/src/utils.ts b/vscode-extensions/vscode-spring-cli/src/utils.ts index aa69e8be9..8ce82966a 100644 --- a/vscode-extensions/vscode-spring-cli/src/utils.ts +++ b/vscode-extensions/vscode-spring-cli/src/utils.ts @@ -1,4 +1,5 @@ -import { InputBox, OpenDialogOptions, Uri, window, workspace } from "vscode"; +import { InputBox, OpenDialogOptions, Uri, WorkspaceFolder, window, workspace } from "vscode"; +import path from "path" export async function openDialogForFolder(customOptions: OpenDialogOptions): Promise { const options: OpenDialogOptions = { @@ -42,3 +43,46 @@ export function enterText(opts: { inputBox.show(); }); } + +function getRelativePathToWorkspaceFolder(file: Uri): string { + if (file) { + const wf: WorkspaceFolder = workspace.getWorkspaceFolder(file); + if (wf) { + return path.relative(wf.uri.fsPath, file.fsPath); + } + } + return ''; +} + +function getWorkspaceFolderName(file: Uri): string { + if (file) { + const wf: WorkspaceFolder = workspace.getWorkspaceFolder(file); + if (wf) { + return wf.name; + } + } + return ''; +} + +export async function getTargetPomXml(): Promise { + if (window.activeTextEditor) { + const activeUri = window.activeTextEditor.document.uri; + if ("pom.xml" === path.basename(activeUri.path).toLowerCase()) { + return activeUri; + } + } + + const candidates: Uri[] = await workspace.findFiles("**/pom.xml"); + if (candidates.length > 0) { + if (candidates.length === 1) { + return candidates[0]; + } else { + return await window.showQuickPick( + candidates.map((c: Uri) => ({ value: c, label: getRelativePathToWorkspaceFolder(c), description: getWorkspaceFolderName(c) })), + { placeHolder: "Select the target project." }, + ).then(res => res && res.value); + } + } + return undefined; +} +