Skip to content

Commit 2bbee59

Browse files
authored
fix: Target path is wrong when exporting jar from a workspace node (#384)
1 parent 17ceb79 commit 2bbee59

9 files changed

+75
-79
lines changed

src/exportJarFileCommand.ts

Lines changed: 0 additions & 64 deletions
This file was deleted.

src/exportJarSteps/ExportJarTaskProvider.ts

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@ import { platform } from "os";
88
import { dirname, extname, isAbsolute, join, relative } from "path";
99
import {
1010
CustomExecution, Event, EventEmitter, Pseudoterminal, Task, TaskDefinition,
11-
TaskProvider, TaskRevealKind, TaskScope, TerminalDimensions, Uri, workspace, WorkspaceFolder,
11+
TaskProvider, TaskRevealKind, tasks, TerminalDimensions, Uri, workspace, WorkspaceFolder,
1212
} from "vscode";
13-
import { createJarFile } from "../exportJarFileCommand";
13+
import { buildWorkspace } from "../build";
14+
import { isStandardServerReady } from "../extension";
1415
import { Jdtls } from "../java/jdtls";
1516
import { INodeData } from "../java/nodeData";
1617
import { Settings } from "../settings";
1718
import { IUriData, Trie, TrieNode } from "../views/nodeCache/Trie";
1819
import { IClasspathResult } from "./GenerateJarExecutor";
1920
import { IClasspath, IStepMetadata } from "./IStepMetadata";
2021
import { IMainClassInfo } from "./ResolveMainClassExecutor";
21-
import { ExportJarConstants, failMessage, getExtensionApi, toPosixPath, toWinPath } from "./utility";
22+
import { ExportJarConstants, ExportJarStep, failMessage, getExtensionApi, stepMap, successMessage, toPosixPath, toWinPath } from "./utility";
2223

2324
interface IExportJarTaskDefinition extends TaskDefinition {
2425
label?: string;
@@ -27,6 +28,28 @@ interface IExportJarTaskDefinition extends TaskDefinition {
2728
elements?: string[];
2829
}
2930

31+
let isExportingJar: boolean = false;
32+
33+
export async function executeExportJarTask(node?: INodeData): Promise<void> {
34+
if (!isStandardServerReady() || isExportingJar || await buildWorkspace() === false) {
35+
return;
36+
}
37+
isExportingJar = true;
38+
const stepMetadata: IStepMetadata = {
39+
entry: node,
40+
steps: [],
41+
};
42+
try {
43+
await stepMap.get(ExportJarStep.ResolveJavaProject).execute(stepMetadata);
44+
} catch (err) {
45+
if (err) {
46+
failMessage(`${err}`);
47+
}
48+
isExportingJar = false;
49+
return;
50+
}
51+
tasks.executeTask(ExportJarTaskProvider.getTask(stepMetadata));
52+
}
3053
export class ExportJarTaskProvider implements TaskProvider {
3154

3255
public static exportJarType: string = "java";
@@ -39,7 +62,7 @@ export class ExportJarTaskProvider implements TaskProvider {
3962
elements: [],
4063
mainClass: undefined,
4164
};
42-
const task: Task = new Task(defaultDefinition, TaskScope.Workspace, "exportjar:default", ExportJarTaskProvider.exportJarType,
65+
const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "exportjar:default", ExportJarTaskProvider.exportJarType,
4366
new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
4467
return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata);
4568
}));
@@ -147,7 +170,7 @@ class ExportJarTaskTerminal implements Pseudoterminal {
147170
this.stepMetadata.classpaths = await this.resolveClasspaths(outputFolderMap,
148171
artifactMap, testOutputFolderMap, testArtifactMap);
149172
}
150-
await createJarFile(this.stepMetadata);
173+
await this.createJarFile(this.stepMetadata);
151174
} catch (err) {
152175
if (err) {
153176
failMessage(`${err}`);
@@ -161,6 +184,30 @@ class ExportJarTaskTerminal implements Pseudoterminal {
161184

162185
}
163186

187+
private async createJarFile(stepMetadata: IStepMetadata): Promise<void> {
188+
let step: ExportJarStep = ExportJarStep.ResolveJavaProject;
189+
while (step !== ExportJarStep.Finish) {
190+
try {
191+
step = await stepMap.get(step).execute(stepMetadata);
192+
if (step === ExportJarStep.ResolveJavaProject) {
193+
// If the user comes back to the step resolving Java project, we need to finish
194+
// the current task and start a new task related to the new Java project.
195+
isExportingJar = false;
196+
executeExportJarTask(stepMetadata.entry);
197+
return;
198+
}
199+
} catch (err) {
200+
if (err) {
201+
failMessage(`${err}`);
202+
}
203+
isExportingJar = false;
204+
return;
205+
}
206+
}
207+
isExportingJar = false;
208+
successMessage(stepMetadata.outputPath);
209+
}
210+
164211
private async setClasspathMap(project: INodeData, classpathScope: string,
165212
outputFolderMap: Map<string, string[]>, artifactMap: Map<string, string[]>): Promise<void> {
166213
const extensionApi: any = await getExtensionApi();

src/exportJarSteps/GenerateJarExecutor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ import * as _ from "lodash";
77
import { basename, dirname, extname, isAbsolute, join, normalize, relative } from "path";
88
import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, Uri, window } from "vscode";
99
import { sendInfo } from "vscode-extension-telemetry-wrapper";
10-
import { ExportJarStep } from "../exportJarFileCommand";
1110
import { Jdtls } from "../java/jdtls";
1211
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
1312
import { IClasspath, IStepMetadata } from "./IStepMetadata";
14-
import { createPickBox, ExportJarTargets, failMessage, getExtensionApi,
13+
import { createPickBox, ExportJarStep, ExportJarTargets, getExtensionApi,
1514
resetStepMetadata, saveDialog, toPosixPath } from "./utility";
1615

1716
export class GenerateJarExecutor implements IExportJarStepExecutor {

src/exportJarSteps/IExportJarStepExecutor.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
import { ExportJarStep } from "../exportJarFileCommand";
54
import { IStepMetadata } from "./IStepMetadata";
5+
import { ExportJarStep } from "./utility";
66

77
export interface IExportJarStepExecutor {
88
getNextStep(): ExportJarStep;

src/exportJarSteps/IStepMetadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Licensed under the MIT license.
33

44
import { WorkspaceFolder } from "vscode";
5-
import { ExportJarStep } from "../exportJarFileCommand";
65
import { INodeData } from "../java/nodeData";
6+
import { ExportJarStep } from "./utility";
77

88
export interface IStepMetadata {
99
entry?: INodeData;

src/exportJarSteps/ResolveJavaProjectExecutor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33

44
import * as _ from "lodash";
55
import { Disposable, QuickPickItem, Uri, workspace, WorkspaceFolder } from "vscode";
6-
import { ExportJarStep } from "../exportJarFileCommand";
76
import { Jdtls } from "../java/jdtls";
87
import { INodeData } from "../java/nodeData";
98
import { WorkspaceNode } from "../views/workspaceNode";
109
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
1110
import { IStepMetadata } from "./IStepMetadata";
12-
import { createPickBox } from "./utility";
11+
import { createPickBox, ExportJarStep } from "./utility";
1312

1413
export class ResolveJavaProjectExecutor implements IExportJarStepExecutor {
1514

src/exportJarSteps/ResolveMainClassExecutor.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@
33

44
import * as _ from "lodash";
55
import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, window } from "vscode";
6-
import { ExportJarStep } from "../exportJarFileCommand";
76
import { Jdtls } from "../java/jdtls";
87
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
98
import { IStepMetadata } from "./IStepMetadata";
10-
import { createPickBox, resetStepMetadata } from "./utility";
9+
import { createPickBox, ExportJarStep, resetStepMetadata } from "./utility";
1110

1211
export class ResolveMainClassExecutor implements IExportJarStepExecutor {
1312

src/exportJarSteps/utility.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,24 @@ import { EOL, platform } from "os";
55
import { posix, win32 } from "path";
66
import { commands, Extension, extensions, QuickInputButtons, QuickPick, QuickPickItem, SaveDialogOptions, Uri, window } from "vscode";
77
import { sendOperationError } from "vscode-extension-telemetry-wrapper";
8-
import { ExportJarStep } from "../exportJarFileCommand";
8+
import { GenerateJarExecutor } from "./GenerateJarExecutor";
9+
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
910
import { IStepMetadata } from "./IStepMetadata";
11+
import { ResolveJavaProjectExecutor } from "./ResolveJavaProjectExecutor";
12+
import { ResolveMainClassExecutor } from "./ResolveMainClassExecutor";
13+
14+
export enum ExportJarStep {
15+
ResolveJavaProject = "RESOLVEJAVAPROJECT",
16+
ResolveMainClass = "RESOLVEMAINCLASS",
17+
GenerateJar = "GENERATEJAR",
18+
Finish = "FINISH",
19+
}
20+
21+
export const stepMap: Map<ExportJarStep, IExportJarStepExecutor> = new Map<ExportJarStep, IExportJarStepExecutor>([
22+
[ExportJarStep.ResolveJavaProject, new ResolveJavaProjectExecutor()],
23+
[ExportJarStep.ResolveMainClass, new ResolveMainClassExecutor()],
24+
[ExportJarStep.GenerateJar, new GenerateJarExecutor()],
25+
]);
1026

1127
export namespace ExportJarTargets {
1228
export const SETTING_ASKUSER: string = "askUser";

src/views/dependencyDataProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper";
1010
import { Commands } from "../commands";
1111
import { newJavaClass, newPackage } from "../explorerCommands/new";
12-
import { executeExportJarTask } from "../exportJarFileCommand";
12+
import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider";
1313
import { isLightWeightMode, isSwitchingServer } from "../extension";
1414
import { Jdtls } from "../java/jdtls";
1515
import { INodeData, NodeKind } from "../java/nodeData";

0 commit comments

Comments
 (0)