Skip to content

Commit c3fd1e0

Browse files
authored
Add command to add JDK to settings (#4162)
1 parent b8b83b3 commit c3fd1e0

File tree

7 files changed

+87
-6
lines changed

7 files changed

+87
-6
lines changed

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -930,9 +930,6 @@
930930
"name": {
931931
"type": "string",
932932
"enum": [
933-
"J2SE-1.5",
934-
"JavaSE-1.6",
935-
"JavaSE-1.7",
936933
"JavaSE-1.8",
937934
"JavaSE-9",
938935
"JavaSE-10",
@@ -1794,6 +1791,11 @@
17941791
"category": "Java",
17951792
"title": "Open Java Dashboard",
17961793
"icon": "$(dashboard)"
1794+
},
1795+
{
1796+
"command": "java.runtimes.add",
1797+
"title": "%java.runtimes.add%",
1798+
"category": "Java"
17971799
}
17981800
],
17991801
"keybindings": [

package.nls.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,6 @@
2929
"java.action.filesExplorerPasteAction": "Paste Clipboard Text Into a File",
3030
"java.action.doCleanup": "Performs Cleanup Actions",
3131
"java.change.searchScope": "Change Search Scope",
32-
"java.action.showExtendedOutline": "Open Extended Outline"
32+
"java.action.showExtendedOutline": "Open Extended Outline",
33+
"java.runtimes.add": "Add Java Runtime"
3334
}

src/commands.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,11 @@ export namespace Commands {
380380
* Open Java Dashboard
381381
*/
382382
export const OPEN_JAVA_DASHBOARD = 'java.dashboard.open';
383+
384+
/**
385+
* Add Java Runtime
386+
*/
387+
export const ADD_JAVA_RUNTIME = 'java.runtimes.add';
383388
}
384389

385390
/**

src/extension.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import { StandardLanguageClient } from './standardLanguageClient';
4444
import { SyntaxLanguageClient } from './syntaxLanguageClient';
4545
import { Telemetry } from './telemetry';
4646
import { cleanJavaLSConfiguration, convertToGlob, deleteClientLog, deleteDirectory, ensureExists, getBuildFilePatterns, getExclusionGlob, getInclusionPatternsFromNegatedExclusion, getJavaConfig, getJavaConfiguration, getVersion, hasBuildToolConflicts, resolveActualCause } from './utils';
47+
import { JavaRuntimes } from './javaRuntimes';
4748

4849
const syntaxClient: SyntaxLanguageClient = new SyntaxLanguageClient();
4950
const standardClient: StandardLanguageClient = new StandardLanguageClient();
@@ -136,6 +137,7 @@ export async function activate(context: ExtensionContext): Promise<ExtensionAPI>
136137
Dashboard.initialize(context);
137138

138139
await loadSupportedJreNames(context);
140+
await JavaRuntimes.initialize(context);
139141
context.subscriptions.push(commands.registerCommand(Commands.FILESEXPLORER_ONPASTE, async () => {
140142
const originalClipboard = await env.clipboard.readText();
141143
// Hack in order to get path to selected folder if applicable (see https://github.com/microsoft/vscode/issues/3553#issuecomment-1098562676)

src/javaRuntimes.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { getRuntime, IJavaRuntime } from "jdk-utils";
2+
import * as vscode from "vscode";
3+
import { getSupportedJreNames } from "./jdkUtils";
4+
import { Commands } from "./commands";
5+
import * as path from "path";
6+
7+
8+
export namespace JavaRuntimes {
9+
function compatible(runtime: IJavaRuntime, jreName: string): boolean {
10+
if (!runtime.version) {
11+
return true;
12+
}
13+
const majorVersion = runtime.version.major;
14+
if (majorVersion === 8) {
15+
return jreName === 'JavaSE-1.8';
16+
}
17+
const versionStrings = /[0-9]+/g.exec(jreName);
18+
if (versionStrings && versionStrings.length > 0) {
19+
return majorVersion >= parseInt(versionStrings[0]);
20+
}
21+
return false;
22+
}
23+
24+
export async function initialize(context: vscode.ExtensionContext): Promise<void> {
25+
context.subscriptions.push(vscode.commands.registerCommand(Commands.ADD_JAVA_RUNTIME, async () => {
26+
const lastSelectedDirectory: vscode.Uri | undefined = context.workspaceState.get('java.runtimes.lastSelectedDirectory');
27+
const directory = await vscode.window.showOpenDialog({
28+
canSelectFiles: false,
29+
canSelectFolders: true,
30+
canSelectMany: false,
31+
title: 'Select JDK Directory',
32+
defaultUri: lastSelectedDirectory,
33+
});
34+
if (directory) {
35+
context.workspaceState.update('java.runtimes.lastSelectedDirectory', vscode.Uri.file(path.dirname(directory[0].fsPath)));
36+
const runtime = await getRuntime(directory[0].fsPath, {withVersion: true});
37+
if (runtime) {
38+
const config = vscode.workspace.getConfiguration('java.configuration').get('runtimes');
39+
if (Array.isArray(config)) {
40+
const candidates = getSupportedJreNames().filter(name => compatible(runtime, name)).reverse();
41+
if (candidates.length > 0) {
42+
const name = await vscode.window.showQuickPick(candidates, {
43+
title: 'Select Java Runtime',
44+
});
45+
if (name) {
46+
const newConfig = {
47+
name: name,
48+
path: directory[0].fsPath,
49+
};
50+
const index = config.findIndex(r => r.name === name);
51+
if (index >= 0) {
52+
config[index] = newConfig;
53+
} else {
54+
config.push(newConfig);
55+
}
56+
vscode.workspace.getConfiguration('java.configuration').update('runtimes', config, vscode.ConfigurationTarget.Global);
57+
vscode.window.showInformationMessage(`JDK Directory ${directory[0].fsPath} added`);
58+
}
59+
} else {
60+
vscode.window.showErrorMessage('No compatible environment available');
61+
}
62+
}
63+
} else {
64+
vscode.window.showErrorMessage(`Invalid JDK Directory ${directory[0].fsPath}`);
65+
}
66+
}
67+
}));
68+
}
69+
}

test/lightweight-mode-suite/extension.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ suite('Java Language Extension - LightWeight', () => {
2929
Commands.RESTART_LANGUAGE_SERVER,
3030
Commands.FILESEXPLORER_ONPASTE,
3131
Commands.CHANGE_JAVA_SEARCH_SCOPE,
32-
Commands.OPEN_JAVA_DASHBOARD
32+
Commands.OPEN_JAVA_DASHBOARD,
33+
Commands.ADD_JAVA_RUNTIME
3334
].sort();
3435
const foundJavaCommands = commands.filter((value) => {
3536
return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.');

test/standard-mode-suite/extension.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ suite('Java Language Extension - Standard', () => {
128128
Commands.FILESEXPLORER_ONPASTE,
129129
Commands.RESOLVE_PASTED_TEXT,
130130
Commands.CHANGE_JAVA_SEARCH_SCOPE,
131-
Commands.OPEN_JAVA_DASHBOARD
131+
Commands.OPEN_JAVA_DASHBOARD,
132+
Commands.ADD_JAVA_RUNTIME
132133
].sort();
133134
const foundJavaCommands = commands.filter((value) => {
134135
return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.');

0 commit comments

Comments
 (0)