Skip to content

Commit a4265b3

Browse files
authored
refactor: Move Gradle Daemons implementation from Java into Typescript (#1489)
1 parent 3cc4338 commit a4265b3

16 files changed

+394
-180
lines changed

extension/src/Extension.ts

+1-5
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,7 @@ export class Extension {
111111
treeDataProvider: this.gradleTasksTreeDataProvider,
112112
showCollapseAll: true,
113113
});
114-
this.gradleDaemonsTreeDataProvider = new GradleDaemonsTreeDataProvider(
115-
this.context,
116-
this.rootProjectsStore,
117-
this.client
118-
);
114+
this.gradleDaemonsTreeDataProvider = new GradleDaemonsTreeDataProvider(this.context, this.rootProjectsStore);
119115
this.gradleDaemonsTreeView = vscode.window.createTreeView(GRADLE_DAEMONS_VIEW, {
120116
treeDataProvider: this.gradleDaemonsTreeDataProvider,
121117
showCollapseAll: false,

extension/src/commands/Commands.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ export class Commands {
148148
COMMAND_REFRESH_DAEMON_STATUS,
149149
new RefreshDaemonStatusCommand(this.gradleDaemonsTreeDataProvider)
150150
);
151-
this.registerCommand(COMMAND_STOP_DAEMONS, new StopDaemonsCommand(this.client, this.rootProjectsStore));
152-
this.registerCommand(COMMAND_STOP_DAEMON, new StopDaemonCommand(this.client));
151+
this.registerCommand(COMMAND_STOP_DAEMONS, new StopDaemonsCommand(this.rootProjectsStore));
152+
this.registerCommand(COMMAND_STOP_DAEMON, new StopDaemonCommand());
153153
this.registerCommand(COMMAND_EXPLORER_TREE, new ExplorerTreeCommand(this.gradleTasksTreeDataProvider));
154154
this.registerCommand(COMMAND_EXPLORER_FLAT, new ExplorerFlatCommand(this.gradleTasksTreeDataProvider));
155155
this.registerCommand(COMMAND_OPEN_SETTINGS, new OpenSettingsCommand());

extension/src/commands/StopDaemonCommand.ts

+19-5
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,36 @@ import { GradleDaemonTreeItem } from "../views";
22
import { confirmModal } from "../util/input";
33
import { logger } from "../logger";
44
import { Command } from "./Command";
5-
import { GradleClient } from "../client";
5+
import { execAsync } from "../util/execAsync";
6+
import * as vscode from "vscode";
7+
import { COMMAND_REFRESH_DAEMON_STATUS } from "./RefreshDaemonStatusCommand";
68

79
export const COMMAND_STOP_DAEMON = "gradle.stopDaemon";
810

911
export class StopDaemonCommand extends Command {
10-
constructor(private client: GradleClient) {
12+
constructor() {
1113
super();
1214
}
1315
async run(treeItem: GradleDaemonTreeItem): Promise<void> {
1416
if (!(await confirmModal("Are you sure you want to stop the daemon?"))) {
1517
return;
1618
}
1719
const pid = treeItem.pid;
18-
const stopDaemonReply = await this.client.stopDaemon(pid);
19-
if (stopDaemonReply) {
20-
logger.info(stopDaemonReply.getMessage());
20+
try {
21+
await this.stopDaemon(pid);
22+
logger.info(`Successfully stopped daemon with PID ${pid}.`);
23+
} catch (error) {
24+
logger.error(`Failed to stop daemon with PID ${pid}: ${error.message}.`);
2125
}
2226
}
27+
28+
async stopDaemon(pid: string): Promise<void> {
29+
if (!pid) {
30+
throw new Error("PID is required to stop the daemon.");
31+
}
32+
33+
const command = process.platform === "win32" ? `taskkill /PID ${pid} /F` : `kill ${pid}`;
34+
await execAsync(command);
35+
await vscode.commands.executeCommand(COMMAND_REFRESH_DAEMON_STATUS);
36+
}
2337
}
+32-12
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import * as vscode from "vscode";
22
import { confirmModal } from "../util/input";
3-
import { StopDaemonsReply } from "../proto/gradle_pb";
43
import { logger } from "../logger";
54
import { Command } from "./Command";
65
import { RootProjectsStore } from "../stores";
7-
import { GradleClient } from "../client";
6+
import { getGradleConfig } from "../util/config";
7+
import { GradleStatus } from "../views/gradleDaemons/services/GradleStatus";
8+
import { GradleConnectionType } from "../views/gradleDaemons/models/GradleConnectionType";
9+
import { GradleWrapper } from "../views/gradleDaemons/services/GradleWrapper";
10+
import { GradleLocalInstallation } from "../views/gradleDaemons/services/GradleLocalInstallation";
11+
import { COMMAND_REFRESH_DAEMON_STATUS } from "./RefreshDaemonStatusCommand";
12+
813
export const COMMAND_STOP_DAEMONS = "gradle.stopDaemons";
914

1015
export class StopDaemonsCommand extends Command {
11-
constructor(private client: GradleClient, private rootProjectsStore: RootProjectsStore) {
16+
constructor(private rootProjectsStore: RootProjectsStore) {
1217
super();
1318
}
1419
async run(): Promise<void> {
@@ -20,14 +25,29 @@ export class StopDaemonsCommand extends Command {
2025
return;
2126
}
2227
const gradleRootFolders = await this.rootProjectsStore.getProjectRootsWithUniqueVersions();
23-
const promises: Promise<StopDaemonsReply | void>[] = gradleRootFolders.map((rootProject) =>
24-
this.client.stopDaemons(rootProject.getProjectUri().fsPath)
25-
);
26-
const replies = await Promise.all(promises);
27-
replies.forEach((reply) => {
28-
if (reply) {
29-
logger.info(reply.getMessage());
30-
}
31-
});
28+
try {
29+
const promises: Promise<void>[] = gradleRootFolders.map((rootProject) =>
30+
this.stopDaemons(rootProject.getProjectUri().fsPath)
31+
);
32+
await Promise.all(promises);
33+
logger.info(`Successfully stopped all daemons.`);
34+
await vscode.commands.executeCommand(COMMAND_REFRESH_DAEMON_STATUS);
35+
} catch (error) {
36+
logger.error(`Failed to stop daemons: ${error.message}.`);
37+
}
38+
}
39+
40+
async stopDaemons(projectFolder: string): Promise<void> {
41+
const gradleConfig = getGradleConfig();
42+
const connectType = await GradleStatus.getConnectionType(gradleConfig);
43+
if (connectType === GradleConnectionType.WRAPPER) {
44+
const gradleExecution = new GradleWrapper(projectFolder);
45+
await gradleExecution.exec(["--stop"]);
46+
} else if (connectType === GradleConnectionType.LOCALINSTALLATION) {
47+
const gradleExecution = new GradleLocalInstallation(gradleConfig.getGradleHome());
48+
await gradleExecution.exec(["--stop"]);
49+
} else {
50+
logger.info("No daemons to stop.");
51+
}
3252
}
3353
}

0 commit comments

Comments
 (0)