Skip to content

Commit ed7b018

Browse files
committed
fixed disableNbJavac issue, refactored server startup code into multiple files
1 parent 0c664a4 commit ed7b018

File tree

8 files changed

+137
-142
lines changed

8 files changed

+137
-142
lines changed

vscode/src/configurations/configuration.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const configKeys = {
2828
runConfigCwd: 'runConfig.cwd',
2929
verbose: 'verbose',
3030
userdir: 'userdir',
31+
revealInActivteProj: "revealActiveInProjects"
3132
};
3233

3334
export const builtInConfigKeys = {

vscode/src/configurations/handlers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,5 +136,5 @@ export const userdirHandler = (): string => {
136136
}
137137

138138
export const isNbJavacDisabledHandler = (): boolean => {
139-
return getConfigurationValue(configKeys.verbose, false);
139+
return getConfigurationValue(configKeys.disableNbJavac, false);
140140
}

vscode/src/extension.ts

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import { ExtensionInfo } from './extensionInfo';
4545
import { ClientPromise } from './lsp/clientPromise';
4646
import { ExtensionLogger } from './logger';
4747
import { NbProcessManager } from './lsp/nbProcessManager';
48-
import { initializeServer } from './lsp/initializer';
48+
import { clientInit, serverOptionsBuilder } from './lsp/initializer';
4949
import { NbLanguageClient } from './lsp/nbLanguageClient';
5050
import { subscribeCommands } from './commands/register';
5151
import { VSNetBeansAPI } from './lsp/types';
@@ -90,7 +90,7 @@ export function activate(context: ExtensionContext): VSNetBeansAPI {
9090

9191
globalVars.clientPromise.initialize();
9292
registerListenersBeforeClientInit();
93-
doActivateWithJDK();
93+
clientInit();
9494

9595
//register debugger:
9696
let debugTrackerFactory =new NetBeansDebugAdapterTrackerFactory();
@@ -242,53 +242,6 @@ export function activate(context: ExtensionContext): VSNetBeansAPI {
242242
});
243243
}
244244

245-
function doActivateWithJDK(): void {
246-
const connection: () => Promise<StreamInfo> = initializeServer();
247-
const client = NbLanguageClient.build(connection, LOGGER);
248-
249-
LOGGER.log('Language Client: Starting');
250-
client.start().then(() => {
251-
globalVars.testAdapter = new NbTestAdapter();
252-
registerListenersAfterClientInit();
253-
registerNotificationListeners(client);
254-
registerRequestListeners(client);
255-
LOGGER.log('Language Client: Ready');
256-
globalVars.clientPromise.initializedSuccessfully(client);
257-
258-
createProjectView(client);
259-
}).catch(globalVars.clientPromise.setClient[1]);
260-
}
261-
async function createProjectView(client : NbLanguageClient) {
262-
const ts : TreeViewService = client.findTreeViewService();
263-
let tv : vscode.TreeView<Visualizer> = await ts.createView('foundProjects', 'Projects', { canSelectMany : false });
264-
265-
async function revealActiveEditor(ed? : vscode.TextEditor) {
266-
const uri = window.activeTextEditor?.document?.uri;
267-
if (!uri || uri.scheme.toLowerCase() !== 'file') {
268-
return;
269-
}
270-
if (!tv.visible) {
271-
return;
272-
}
273-
let vis : Visualizer | undefined = await ts.findPath(tv, uri.toString());
274-
if (!vis) {
275-
return;
276-
}
277-
tv.reveal(vis, { select : true, focus : false, expand : false });
278-
}
279-
const netbeansConfig = workspace.getConfiguration(extConstants.COMMAND_PREFIX);
280-
globalVars.extensionInfo.pushSubscription(window.onDidChangeActiveTextEditor(ed => {
281-
if (netbeansConfig.get("revealActiveInProjects")) {
282-
revealActiveEditor(ed);
283-
}
284-
}));
285-
globalVars.extensionInfo.pushSubscription(vscode.commands.registerCommand(extConstants.COMMAND_PREFIX + ".select.editor.projects", () => revealActiveEditor()));
286-
287-
// attempt to reveal NOW:
288-
if (netbeansConfig.get("revealActiveInProjects")) {
289-
revealActiveEditor();
290-
}
291-
}
292245

293246

294247
export function deactivate(): Thenable<void> {

vscode/src/lsp/clientPromise.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class ClientPromise {
7171
await this.stopClient();
7272
await nbProcessManager.killProcess(notifyKill);
7373
this.initialize();
74-
initializeServer();
74+
clientInit();
7575
} catch (error) {
7676
LOGGER.log(`Error during activation: ${error}`, LogLevel.ERROR);
7777
throw error;

vscode/src/lsp/initializer.ts

Lines changed: 16 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,23 @@
1414
limitations under the License.
1515
*/
1616
import { StreamInfo } from "vscode-languageclient/node";
17-
import { getUserConfigLaunchOptionsDefaults, prepareNbcodeLaunchOptions } from "./launchOptions";
17+
import { getUserConfigLaunchOptionsDefaults } from "./launchOptions";
1818
import { globalVars, LOGGER } from "../extension";
1919
import { configKeys } from "../configurations/configuration";
20-
import { NbProcessManager } from "./nbProcessManager";
21-
import { enableDisableModules, findNbcode } from "./utils";
20+
import { enableDisableModules } from "./utils";
2221
import * as net from 'net';
23-
import { extConstants, NODE_WINDOWS_LABEL } from "../constants";
24-
import { l10n } from "../localiser";
25-
import { window } from "vscode";
2622
import { ChildProcess } from "child_process";
27-
import { jdkDownloaderPrompt } from "../webviews/jdkDownloader/prompt";
28-
import * as os from 'os';
29-
import { LogLevel } from "../logger";
30-
import { isNbJavacDisabledHandler } from "../configurations/handlers";
31-
32-
const launchNbcode = (): void => {
33-
const ideLaunchOptions = prepareNbcodeLaunchOptions();
34-
const userdir = getUserConfigLaunchOptionsDefaults()[configKeys.userdir].value;
35-
const specifiedJDK = getUserConfigLaunchOptionsDefaults()[configKeys.jdkHome].value;
36-
const extensionPath = globalVars.extensionInfo.getExtensionStorageUri().fsPath;
37-
const nbcodePath = findNbcode(extensionPath);
38-
39-
const requiredJdk = specifiedJDK ? specifiedJDK : 'default system JDK';
40-
let launchMsg = l10n.value("jdk.extension.lspServer.statusBar.message.launching", {
41-
SERVER_NAME: extConstants.SERVER_NAME,
42-
requiredJdk: requiredJdk,
43-
userdir: userdir
44-
});
45-
LOGGER.log(launchMsg);
46-
window.setStatusBarMessage(launchMsg, 2000);
47-
48-
globalVars.nbProcessManager = new NbProcessManager(userdir, nbcodePath, ideLaunchOptions);
49-
globalVars.nbProcessManager.startProcess();
50-
}
23+
import { getConfigurationValue, isNbJavacDisabledHandler } from "../configurations/handlers";
24+
import { attachNbProcessListeners, launchNbcode } from "./nbcode";
25+
import { NbLanguageClient } from "./nbLanguageClient";
26+
import { NbTestAdapter } from "../testAdapter";
27+
import { registerListenersAfterClientInit } from "../listener";
28+
import { registerNotificationListeners } from "./notifications/register";
29+
import { registerRequestListeners } from "./requests/register";
30+
import { TreeViewService, Visualizer } from "../explorer";
31+
import { commands, TextEditor, TreeView, window, workspace } from "vscode";
32+
import { extConstants } from "../constants";
33+
import { extCommands } from "../commands/commands";
5134

5235
const establishConnection = () => new Promise<StreamInfo>((resolve, reject) => {
5336
const nbProcess = globalVars.nbProcessManager?.getProcess();
@@ -61,21 +44,8 @@ const establishConnection = () => new Promise<StreamInfo>((resolve, reject) => {
6144
LOGGER.log(`LSP server launching: ${nbProcessManager.getProcessId()}`);
6245
LOGGER.log(`LSP server user directory: ${getUserConfigLaunchOptionsDefaults()[configKeys.userdir].value}`);
6346

64-
let status = false;
65-
nbProcess.stdout?.on('data', (d: any) => {
66-
status = processOnDataHandler(nbProcessManager, d.toString(), true);
67-
});
68-
nbProcess.stderr?.on('data', (d: any) => {
69-
processOnDataHandler(nbProcessManager, d.toString(), false);
70-
});
71-
nbProcess.on('close', (code: number) => {
72-
const status = processOnCloseHandler(nbProcessManager, code)
73-
if (status != null) {
74-
reject(status);
75-
}
76-
});
77-
7847
try {
48+
attachNbProcessListeners(nbProcessManager);
7949
connectToServer(nbProcess).then(server => resolve({
8050
reader: server,
8151
writer: server
@@ -121,55 +91,11 @@ const connectToServer = (nbProcess: ChildProcess): Promise<net.Socket> => {
12191
});
12292
}
12393

124-
const processOnDataHandler = (nbProcessManager: NbProcessManager, text: string, isOut: boolean) => {
125-
if (nbProcessManager) {
126-
globalVars.clientPromise.activationPending = false;
127-
}
128-
LOGGER.logNoNL(text);
129-
isOut ? nbProcessManager.appendStdOut(text) : nbProcessManager.appendStdErr(text);
130-
131-
if (nbProcessManager.getStdOut()?.match(/org.netbeans.modules.java.lsp.server/)) {
132-
return true;
133-
}
134-
return false;
135-
}
136-
137-
138-
const processOnCloseHandler = (nbProcessManager: NbProcessManager, code: number): string | null => {
139-
const globalnbProcessManager = globalVars.nbProcessManager;
140-
if (globalnbProcessManager == nbProcessManager) {
141-
globalVars.nbProcessManager = null;
142-
if (code != 0) {
143-
window.showWarningMessage(l10n.value("jdk.extension.lspServer.warning_message.serverExited", { SERVER_NAME: extConstants.SERVER_NAME, code: code }));
144-
}
145-
}
146-
if (nbProcessManager.getStdOut()?.match(/Cannot find java/) || (os.type() === NODE_WINDOWS_LABEL && !globalVars.deactivated)) {
147-
jdkDownloaderPrompt();
148-
}
149-
if (nbProcessManager.getStdOut() != null) {
150-
let match = nbProcessManager.getStdOut()!.match(/org.netbeans.modules.java.lsp.server[^\n]*/)
151-
if (match?.length == 1) {
152-
LOGGER.log(match[0]);
153-
} else {
154-
LOGGER.log("Cannot find org.netbeans.modules.java.lsp.server in the log!", LogLevel.ERROR);
155-
}
156-
LOGGER.log(`Please refer to troubleshooting section for more info: https://github.com/oracle/javavscode/blob/main/README.md#troubleshooting`);
157-
LOGGER.showOutputChannelUI(false);
158-
159-
nbProcessManager.killProcess(false);
160-
return l10n.value("jdk.extension.error_msg.notEnabled", { SERVER_NAME: extConstants.SERVER_NAME });
161-
} else {
162-
LOGGER.log(`LSP server ${nbProcessManager.getProcessId()} terminated with ${code}`);
163-
LOGGER.log(`Exit code ${code}`);
164-
}
165-
return null;
166-
}
167-
16894
const enableDisableNbjavacModule = () => {
16995
const userdirPath = getUserConfigLaunchOptionsDefaults()[configKeys.userdir].value
17096
const nbjavacValue = isNbJavacDisabledHandler();
17197
const extensionPath = globalVars.extensionInfo.getExtensionStorageUri().fsPath;
172-
enableDisableModules(extensionPath, userdirPath, ['org.netbeans.libs.nbjavacapi'], nbjavacValue);
98+
enableDisableModules(extensionPath, userdirPath, ['org.netbeans.libs.nbjavacapi'], !nbjavacValue);
17399
}
174100

175101
const serverBuilder = () => {
@@ -179,7 +105,7 @@ const serverBuilder = () => {
179105
}
180106

181107
export const clientInit = () => {
182-
const connection: () => Promise<StreamInfo> = serverBuilder();
108+
const connection: () => Promise<StreamInfo> = serverOptionsBuilder();
183109
const client = NbLanguageClient.build(connection, LOGGER);
184110

185111
LOGGER.log('Language Client: Starting');

vscode/src/lsp/launchOptions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import { builtInConfigKeys, configKeys } from "../configurations/configuration"
1717
import { isDarkColorThemeHandler, isNbJavacDisabledHandler, jdkHomeValueHandler, lspServerVmOptionsHandler, projectSearchRootsValueHandler, userdirHandler } from "../configurations/handlers";
1818
import { l10n } from "../localiser";
19+
import { isString } from "../typesUtil";
1920
import { userDefinedLaunchOptionsType } from "./types"
2021

2122
export const getUserConfigLaunchOptionsDefaults = (): userDefinedLaunchOptionsType => {
@@ -63,7 +64,7 @@ const prepareUserConfigLaunchOptions = (): string[] => {
6364
if (!optionToPass && Array.isArray(value)) {
6465
launchOptions.push(...value);
6566
}
66-
else if (typeof (optionToPass) === "string") {
67+
else if (isString(optionToPass)) {
6768
launchOptions.push(`${optionToPass}${value}`);
6869
} else if (Array.isArray(optionToPass)) {
6970
const arg: string[] = [...optionToPass, value];

vscode/src/lsp/nbProcessManager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ export class NbProcessManager {
9999
getStdOut = () => {
100100
return this.stdOutText
101101
}
102+
103+
setStdOut = (stdOut: string | null) => {
104+
this.stdOutText = stdOut;
105+
}
102106

103107
getStdErr = () => {
104108
return this.stdErrText;

vscode/src/lsp/nbcode.ts

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/*
2+
Copyright (c) 2023-2024, Oracle and/or its affiliates.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
https://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import { window } from "vscode";
18+
import { configKeys } from "../configurations/configuration";
19+
import { extConstants, NODE_WINDOWS_LABEL } from "../constants";
20+
import { globalVars, LOGGER } from "../extension";
21+
import { prepareNbcodeLaunchOptions, getUserConfigLaunchOptionsDefaults } from "./launchOptions";
22+
import { NbProcessManager } from "./nbProcessManager";
23+
import { findNbcode } from "./utils";
24+
import { l10n } from "../localiser";
25+
import { jdkDownloaderPrompt } from "../webviews/jdkDownloader/prompt";
26+
import { LogLevel } from "../logger";
27+
import * as os from 'os';
28+
29+
export const launchNbcode = (): void => {
30+
const ideLaunchOptions = prepareNbcodeLaunchOptions();
31+
const userdir = getUserConfigLaunchOptionsDefaults()[configKeys.userdir].value;
32+
const specifiedJDK = getUserConfigLaunchOptionsDefaults()[configKeys.jdkHome].value;
33+
const extensionPath = globalVars.extensionInfo.getExtensionStorageUri().fsPath;
34+
const nbcodePath = findNbcode(extensionPath);
35+
36+
const requiredJdk = specifiedJDK ? specifiedJDK : 'default system JDK';
37+
let launchMsg = l10n.value("jdk.extension.lspServer.statusBar.message.launching", {
38+
SERVER_NAME: extConstants.SERVER_NAME,
39+
requiredJdk: requiredJdk,
40+
userdir: userdir
41+
});
42+
LOGGER.log(launchMsg);
43+
window.setStatusBarMessage(launchMsg, 2000);
44+
45+
globalVars.nbProcessManager = new NbProcessManager(userdir, nbcodePath, ideLaunchOptions);
46+
globalVars.nbProcessManager.startProcess();
47+
}
48+
49+
50+
export const attachNbProcessListeners = (nbProcessManager: NbProcessManager): void => {
51+
const nbProcess = nbProcessManager.getProcess();
52+
nbProcess?.stdout?.on('data', chunk => {
53+
processOnDataHandler(nbProcessManager, chunk.toString(), true);
54+
});
55+
nbProcess?.stderr?.on('data', chunk => {
56+
processOnDataHandler(nbProcessManager, chunk.toString(), false);
57+
});
58+
nbProcess?.on('close', (code: number) => {
59+
const status = processOnCloseHandler(nbProcessManager, code)
60+
if (status != null) {
61+
throw status;
62+
}
63+
});
64+
}
65+
66+
const processOnDataHandler = (nbProcessManager: NbProcessManager, text: string, isOut: boolean) => {
67+
if (nbProcessManager) {
68+
globalVars.clientPromise.activationPending = false;
69+
}
70+
if (nbProcessManager.getStdOut() == null) {
71+
return;
72+
}
73+
LOGGER.logNoNL(text);
74+
isOut ? nbProcessManager.appendStdOut(text) : nbProcessManager.appendStdErr(text);
75+
76+
if (nbProcessManager.getStdOut()?.match(/org.netbeans.modules.java.lsp.server/)) {
77+
nbProcessManager.setStdOut(null);
78+
}
79+
}
80+
81+
82+
const processOnCloseHandler = (nbProcessManager: NbProcessManager, code: number): string | null => {
83+
const globalnbProcessManager = globalVars.nbProcessManager;
84+
if (globalnbProcessManager == nbProcessManager) {
85+
globalVars.nbProcessManager = null;
86+
if (code && code != 0) {
87+
window.showWarningMessage(l10n.value("jdk.extension.lspServer.warning_message.serverExited", { SERVER_NAME: extConstants.SERVER_NAME, code }));
88+
}
89+
}
90+
if (nbProcessManager.getStdOut()?.match(/Cannot find java/) || (os.type() === NODE_WINDOWS_LABEL && !globalVars.deactivated)) {
91+
jdkDownloaderPrompt();
92+
}
93+
if (nbProcessManager.getStdOut() != null) {
94+
let match = nbProcessManager.getStdOut()!.match(/org.netbeans.modules.java.lsp.server[^\n]*/)
95+
if (match?.length == 1) {
96+
LOGGER.log(match[0]);
97+
} else {
98+
LOGGER.log("Cannot find org.netbeans.modules.java.lsp.server in the log!", LogLevel.ERROR);
99+
}
100+
LOGGER.log(`Please refer to troubleshooting section for more info: https://github.com/oracle/javavscode/blob/main/README.md#troubleshooting`);
101+
LOGGER.showOutputChannelUI(false);
102+
103+
nbProcessManager.killProcess(false);
104+
return l10n.value("jdk.extension.error_msg.notEnabled", { SERVER_NAME: extConstants.SERVER_NAME });
105+
} else {
106+
LOGGER.log(`LSP server ${nbProcessManager.getProcessId()} terminated with ${code}`);
107+
LOGGER.log(`Exit code ${code}`);
108+
}
109+
return null;
110+
}

0 commit comments

Comments
 (0)