-
Notifications
You must be signed in to change notification settings - Fork 76
/
serverStarter.ts
66 lines (61 loc) · 3.2 KB
/
serverStarter.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { commands, ConfigurationTarget, ExtensionContext, window } from "vscode";
import { Executable } from "vscode-languageclient/node";
import { getXMLConfiguration } from "../settings/settings";
import * as Telemetry from "../telemetry";
import { ABORTED_ERROR, prepareBinaryExecutable } from "./binary/binaryServerStarter";
import { prepareJavaExecutable } from "./java/javaServerStarter";
import { getOpenJDKDownloadLink, RequirementsData } from "./requirements";
/**
* Returns the executable to use to launch LemMinX (the XML Language Server)
*
* @param requirements the java information, or an empty object if there is no java
* @param xmlJavaExtensions a list of all the java extension jars
* @param context the extensions context
* @throws if neither the binary nor the java version of the extension can be launched
* @returns the executable to launch LemMinX with (the XML language server)
*/
export async function prepareExecutable(
requirements: RequirementsData,
xmlJavaExtensions: string[],
context: ExtensionContext): Promise<Executable> {
const hasJava: boolean = requirements.java_home !== undefined;
const hasExtensions: boolean = xmlJavaExtensions.length !== 0;
const preferBinary: boolean = getXMLConfiguration().get("server.preferBinary", false);
const silenceExtensionWarning: boolean = getXMLConfiguration().get("server.silenceExtensionWarning", false);
const useBinary: boolean = (!hasJava) || (preferBinary && !hasExtensions);
if (hasExtensions && !hasJava && !silenceExtensionWarning) {
const DOWNLOAD_JAVA = 'Get Java';
const CONFIGURE_JAVA = 'More Info';
const DISABLE_WARNING = 'Disable Warning';
window.showInformationMessage('Extensions to the XML language server were detected, but no Java was found. '
+ 'In order to use these extensions, please install and configure a Java runtime (Java 8 or more recent).',
DOWNLOAD_JAVA, CONFIGURE_JAVA, DISABLE_WARNING)
.then((selection: string) => {
if (selection === DOWNLOAD_JAVA) {
Telemetry.sendTelemetry(Telemetry.OPEN_JAVA_DOWNLOAD_LINK_EVT).then(() => {
commands.executeCommand('vscode.open', getOpenJDKDownloadLink());
});
} else if (selection === CONFIGURE_JAVA) {
commands.executeCommand('xml.open.docs', { page: 'Preferences.md', section: 'java-home' });
} else if (selection === DISABLE_WARNING) {
getXMLConfiguration().update('server.silenceExtensionWarning', true, ConfigurationTarget.Global);
}
});
}
if (useBinary) {
return prepareBinaryExecutable(context)
.catch((e) => {
const javaServerMessage = hasJava ? 'Falling back to the Java server.' : 'Cannot start XML language server, since Java is missing.';
if (e === ABORTED_ERROR) {
window.showWarningMessage(`${e.message}. ${javaServerMessage}`);
} else {
window.showErrorMessage(`${e}. ${javaServerMessage}`);
}
if (!hasJava) {
throw new Error("Failed to launch binary XML language server and no Java is installed");
}
return prepareJavaExecutable(context, requirements, xmlJavaExtensions);
});
}
return prepareJavaExecutable(context, requirements, xmlJavaExtensions);
}