diff --git a/package.json b/package.json index 5238c1c1c..120a54348 100644 --- a/package.json +++ b/package.json @@ -930,9 +930,6 @@ "name": { "type": "string", "enum": [ - "J2SE-1.5", - "JavaSE-1.6", - "JavaSE-1.7", "JavaSE-1.8", "JavaSE-9", "JavaSE-10", @@ -1794,6 +1791,11 @@ "category": "Java", "title": "Open Java Dashboard", "icon": "$(dashboard)" + }, + { + "command": "java.runtimes.add", + "title": "%java.runtimes.add%", + "category": "Java" } ], "keybindings": [ diff --git a/package.nls.json b/package.nls.json index 33307fcaa..2ac32d40a 100644 --- a/package.nls.json +++ b/package.nls.json @@ -29,5 +29,6 @@ "java.action.filesExplorerPasteAction": "Paste Clipboard Text Into a File", "java.action.doCleanup": "Performs Cleanup Actions", "java.change.searchScope": "Change Search Scope", - "java.action.showExtendedOutline": "Open Extended Outline" + "java.action.showExtendedOutline": "Open Extended Outline", + "java.runtimes.add": "Add Java Runtime" } diff --git a/src/commands.ts b/src/commands.ts index 11048b3f5..be87ca431 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -380,6 +380,11 @@ export namespace Commands { * Open Java Dashboard */ export const OPEN_JAVA_DASHBOARD = 'java.dashboard.open'; + + /** + * Add Java Runtime + */ + export const ADD_JAVA_RUNTIME = 'java.runtimes.add'; } /** diff --git a/src/extension.ts b/src/extension.ts index c12cf7f15..f3a7f5c73 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -44,6 +44,7 @@ import { StandardLanguageClient } from './standardLanguageClient'; import { SyntaxLanguageClient } from './syntaxLanguageClient'; import { Telemetry } from './telemetry'; import { cleanJavaLSConfiguration, convertToGlob, deleteClientLog, deleteDirectory, ensureExists, getBuildFilePatterns, getExclusionGlob, getInclusionPatternsFromNegatedExclusion, getJavaConfig, getJavaConfiguration, getVersion, hasBuildToolConflicts, resolveActualCause } from './utils'; +import { JavaRuntimes } from './javaRuntimes'; const syntaxClient: SyntaxLanguageClient = new SyntaxLanguageClient(); const standardClient: StandardLanguageClient = new StandardLanguageClient(); @@ -136,6 +137,7 @@ export async function activate(context: ExtensionContext): Promise Dashboard.initialize(context); await loadSupportedJreNames(context); + await JavaRuntimes.initialize(context); context.subscriptions.push(commands.registerCommand(Commands.FILESEXPLORER_ONPASTE, async () => { const originalClipboard = await env.clipboard.readText(); // Hack in order to get path to selected folder if applicable (see https://github.com/microsoft/vscode/issues/3553#issuecomment-1098562676) diff --git a/src/javaRuntimes.ts b/src/javaRuntimes.ts new file mode 100644 index 000000000..4301318d5 --- /dev/null +++ b/src/javaRuntimes.ts @@ -0,0 +1,69 @@ +import { getRuntime, IJavaRuntime } from "jdk-utils"; +import * as vscode from "vscode"; +import { getSupportedJreNames } from "./jdkUtils"; +import { Commands } from "./commands"; +import * as path from "path"; + + +export namespace JavaRuntimes { + function compatible(runtime: IJavaRuntime, jreName: string): boolean { + if (!runtime.version) { + return true; + } + const majorVersion = runtime.version.major; + if (majorVersion === 8) { + return jreName === 'JavaSE-1.8'; + } + const versionStrings = /[0-9]+/g.exec(jreName); + if (versionStrings && versionStrings.length > 0) { + return majorVersion >= parseInt(versionStrings[0]); + } + return false; + } + + export async function initialize(context: vscode.ExtensionContext): Promise { + context.subscriptions.push(vscode.commands.registerCommand(Commands.ADD_JAVA_RUNTIME, async () => { + const lastSelectedDirectory: vscode.Uri | undefined = context.workspaceState.get('java.runtimes.lastSelectedDirectory'); + const directory = await vscode.window.showOpenDialog({ + canSelectFiles: false, + canSelectFolders: true, + canSelectMany: false, + title: 'Select JDK Directory', + defaultUri: lastSelectedDirectory, + }); + if (directory) { + context.workspaceState.update('java.runtimes.lastSelectedDirectory', vscode.Uri.file(path.dirname(directory[0].fsPath))); + const runtime = await getRuntime(directory[0].fsPath, {withVersion: true}); + if (runtime) { + const config = vscode.workspace.getConfiguration('java.configuration').get('runtimes'); + if (Array.isArray(config)) { + const candidates = getSupportedJreNames().filter(name => compatible(runtime, name)).reverse(); + if (candidates.length > 0) { + const name = await vscode.window.showQuickPick(candidates, { + title: 'Select Java Runtime', + }); + if (name) { + const newConfig = { + name: name, + path: directory[0].fsPath, + }; + const index = config.findIndex(r => r.name === name); + if (index >= 0) { + config[index] = newConfig; + } else { + config.push(newConfig); + } + vscode.workspace.getConfiguration('java.configuration').update('runtimes', config, vscode.ConfigurationTarget.Global); + vscode.window.showInformationMessage(`JDK Directory ${directory[0].fsPath} added`); + } + } else { + vscode.window.showErrorMessage('No compatible environment available'); + } + } + } else { + vscode.window.showErrorMessage(`Invalid JDK Directory ${directory[0].fsPath}`); + } + } + })); + } +} \ No newline at end of file diff --git a/test/lightweight-mode-suite/extension.test.ts b/test/lightweight-mode-suite/extension.test.ts index 924c34919..1c3f8e08a 100644 --- a/test/lightweight-mode-suite/extension.test.ts +++ b/test/lightweight-mode-suite/extension.test.ts @@ -29,7 +29,8 @@ suite('Java Language Extension - LightWeight', () => { Commands.RESTART_LANGUAGE_SERVER, Commands.FILESEXPLORER_ONPASTE, Commands.CHANGE_JAVA_SEARCH_SCOPE, - Commands.OPEN_JAVA_DASHBOARD + Commands.OPEN_JAVA_DASHBOARD, + Commands.ADD_JAVA_RUNTIME ].sort(); const foundJavaCommands = commands.filter((value) => { return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.'); diff --git a/test/standard-mode-suite/extension.test.ts b/test/standard-mode-suite/extension.test.ts index 807c11ed8..a1237467b 100644 --- a/test/standard-mode-suite/extension.test.ts +++ b/test/standard-mode-suite/extension.test.ts @@ -128,7 +128,8 @@ suite('Java Language Extension - Standard', () => { Commands.FILESEXPLORER_ONPASTE, Commands.RESOLVE_PASTED_TEXT, Commands.CHANGE_JAVA_SEARCH_SCOPE, - Commands.OPEN_JAVA_DASHBOARD + Commands.OPEN_JAVA_DASHBOARD, + Commands.ADD_JAVA_RUNTIME ].sort(); const foundJavaCommands = commands.filter((value) => { return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.');