Skip to content

Commit

Permalink
fix: Target path is wrong when exporting jar from a workspace node (#384
Browse files Browse the repository at this point in the history
)
  • Loading branch information
CsCherrYY authored Nov 18, 2020
1 parent 17ceb79 commit 2bbee59
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 79 deletions.
64 changes: 0 additions & 64 deletions src/exportJarFileCommand.ts

This file was deleted.

57 changes: 52 additions & 5 deletions src/exportJarSteps/ExportJarTaskProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@ import { platform } from "os";
import { dirname, extname, isAbsolute, join, relative } from "path";
import {
CustomExecution, Event, EventEmitter, Pseudoterminal, Task, TaskDefinition,
TaskProvider, TaskRevealKind, TaskScope, TerminalDimensions, Uri, workspace, WorkspaceFolder,
TaskProvider, TaskRevealKind, tasks, TerminalDimensions, Uri, workspace, WorkspaceFolder,
} from "vscode";
import { createJarFile } from "../exportJarFileCommand";
import { buildWorkspace } from "../build";
import { isStandardServerReady } from "../extension";
import { Jdtls } from "../java/jdtls";
import { INodeData } from "../java/nodeData";
import { Settings } from "../settings";
import { IUriData, Trie, TrieNode } from "../views/nodeCache/Trie";
import { IClasspathResult } from "./GenerateJarExecutor";
import { IClasspath, IStepMetadata } from "./IStepMetadata";
import { IMainClassInfo } from "./ResolveMainClassExecutor";
import { ExportJarConstants, failMessage, getExtensionApi, toPosixPath, toWinPath } from "./utility";
import { ExportJarConstants, ExportJarStep, failMessage, getExtensionApi, stepMap, successMessage, toPosixPath, toWinPath } from "./utility";

interface IExportJarTaskDefinition extends TaskDefinition {
label?: string;
Expand All @@ -27,6 +28,28 @@ interface IExportJarTaskDefinition extends TaskDefinition {
elements?: string[];
}

let isExportingJar: boolean = false;

export async function executeExportJarTask(node?: INodeData): Promise<void> {
if (!isStandardServerReady() || isExportingJar || await buildWorkspace() === false) {
return;
}
isExportingJar = true;
const stepMetadata: IStepMetadata = {
entry: node,
steps: [],
};
try {
await stepMap.get(ExportJarStep.ResolveJavaProject).execute(stepMetadata);
} catch (err) {
if (err) {
failMessage(`${err}`);
}
isExportingJar = false;
return;
}
tasks.executeTask(ExportJarTaskProvider.getTask(stepMetadata));
}
export class ExportJarTaskProvider implements TaskProvider {

public static exportJarType: string = "java";
Expand All @@ -39,7 +62,7 @@ export class ExportJarTaskProvider implements TaskProvider {
elements: [],
mainClass: undefined,
};
const task: Task = new Task(defaultDefinition, TaskScope.Workspace, "exportjar:default", ExportJarTaskProvider.exportJarType,
const task: Task = new Task(defaultDefinition, stepMetadata.workspaceFolder, "exportjar:default", ExportJarTaskProvider.exportJarType,
new CustomExecution(async (resolvedDefinition: TaskDefinition): Promise<Pseudoterminal> => {
return new ExportJarTaskTerminal(resolvedDefinition, stepMetadata);
}));
Expand Down Expand Up @@ -147,7 +170,7 @@ class ExportJarTaskTerminal implements Pseudoterminal {
this.stepMetadata.classpaths = await this.resolveClasspaths(outputFolderMap,
artifactMap, testOutputFolderMap, testArtifactMap);
}
await createJarFile(this.stepMetadata);
await this.createJarFile(this.stepMetadata);
} catch (err) {
if (err) {
failMessage(`${err}`);
Expand All @@ -161,6 +184,30 @@ class ExportJarTaskTerminal implements Pseudoterminal {

}

private async createJarFile(stepMetadata: IStepMetadata): Promise<void> {
let step: ExportJarStep = ExportJarStep.ResolveJavaProject;
while (step !== ExportJarStep.Finish) {
try {
step = await stepMap.get(step).execute(stepMetadata);
if (step === ExportJarStep.ResolveJavaProject) {
// If the user comes back to the step resolving Java project, we need to finish
// the current task and start a new task related to the new Java project.
isExportingJar = false;
executeExportJarTask(stepMetadata.entry);
return;
}
} catch (err) {
if (err) {
failMessage(`${err}`);
}
isExportingJar = false;
return;
}
}
isExportingJar = false;
successMessage(stepMetadata.outputPath);
}

private async setClasspathMap(project: INodeData, classpathScope: string,
outputFolderMap: Map<string, string[]>, artifactMap: Map<string, string[]>): Promise<void> {
const extensionApi: any = await getExtensionApi();
Expand Down
3 changes: 1 addition & 2 deletions src/exportJarSteps/GenerateJarExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import * as _ from "lodash";
import { basename, dirname, extname, isAbsolute, join, normalize, relative } from "path";
import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, Uri, window } from "vscode";
import { sendInfo } from "vscode-extension-telemetry-wrapper";
import { ExportJarStep } from "../exportJarFileCommand";
import { Jdtls } from "../java/jdtls";
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
import { IClasspath, IStepMetadata } from "./IStepMetadata";
import { createPickBox, ExportJarTargets, failMessage, getExtensionApi,
import { createPickBox, ExportJarStep, ExportJarTargets, getExtensionApi,
resetStepMetadata, saveDialog, toPosixPath } from "./utility";

export class GenerateJarExecutor implements IExportJarStepExecutor {
Expand Down
2 changes: 1 addition & 1 deletion src/exportJarSteps/IExportJarStepExecutor.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.

import { ExportJarStep } from "../exportJarFileCommand";
import { IStepMetadata } from "./IStepMetadata";
import { ExportJarStep } from "./utility";

export interface IExportJarStepExecutor {
getNextStep(): ExportJarStep;
Expand Down
2 changes: 1 addition & 1 deletion src/exportJarSteps/IStepMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
// Licensed under the MIT license.

import { WorkspaceFolder } from "vscode";
import { ExportJarStep } from "../exportJarFileCommand";
import { INodeData } from "../java/nodeData";
import { ExportJarStep } from "./utility";

export interface IStepMetadata {
entry?: INodeData;
Expand Down
3 changes: 1 addition & 2 deletions src/exportJarSteps/ResolveJavaProjectExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@

import * as _ from "lodash";
import { Disposable, QuickPickItem, Uri, workspace, WorkspaceFolder } from "vscode";
import { ExportJarStep } from "../exportJarFileCommand";
import { Jdtls } from "../java/jdtls";
import { INodeData } from "../java/nodeData";
import { WorkspaceNode } from "../views/workspaceNode";
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
import { IStepMetadata } from "./IStepMetadata";
import { createPickBox } from "./utility";
import { createPickBox, ExportJarStep } from "./utility";

export class ResolveJavaProjectExecutor implements IExportJarStepExecutor {

Expand Down
3 changes: 1 addition & 2 deletions src/exportJarSteps/ResolveMainClassExecutor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@

import * as _ from "lodash";
import { Disposable, ProgressLocation, QuickInputButtons, QuickPickItem, window } from "vscode";
import { ExportJarStep } from "../exportJarFileCommand";
import { Jdtls } from "../java/jdtls";
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
import { IStepMetadata } from "./IStepMetadata";
import { createPickBox, resetStepMetadata } from "./utility";
import { createPickBox, ExportJarStep, resetStepMetadata } from "./utility";

export class ResolveMainClassExecutor implements IExportJarStepExecutor {

Expand Down
18 changes: 17 additions & 1 deletion src/exportJarSteps/utility.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,24 @@ import { EOL, platform } from "os";
import { posix, win32 } from "path";
import { commands, Extension, extensions, QuickInputButtons, QuickPick, QuickPickItem, SaveDialogOptions, Uri, window } from "vscode";
import { sendOperationError } from "vscode-extension-telemetry-wrapper";
import { ExportJarStep } from "../exportJarFileCommand";
import { GenerateJarExecutor } from "./GenerateJarExecutor";
import { IExportJarStepExecutor } from "./IExportJarStepExecutor";
import { IStepMetadata } from "./IStepMetadata";
import { ResolveJavaProjectExecutor } from "./ResolveJavaProjectExecutor";
import { ResolveMainClassExecutor } from "./ResolveMainClassExecutor";

export enum ExportJarStep {
ResolveJavaProject = "RESOLVEJAVAPROJECT",
ResolveMainClass = "RESOLVEMAINCLASS",
GenerateJar = "GENERATEJAR",
Finish = "FINISH",
}

export const stepMap: Map<ExportJarStep, IExportJarStepExecutor> = new Map<ExportJarStep, IExportJarStepExecutor>([
[ExportJarStep.ResolveJavaProject, new ResolveJavaProjectExecutor()],
[ExportJarStep.ResolveMainClass, new ResolveMainClassExecutor()],
[ExportJarStep.GenerateJar, new GenerateJarExecutor()],
]);

export namespace ExportJarTargets {
export const SETTING_ASKUSER: string = "askUser";
Expand Down
2 changes: 1 addition & 1 deletion src/views/dependencyDataProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
import { instrumentOperation, instrumentOperationAsVsCodeCommand } from "vscode-extension-telemetry-wrapper";
import { Commands } from "../commands";
import { newJavaClass, newPackage } from "../explorerCommands/new";
import { executeExportJarTask } from "../exportJarFileCommand";
import { executeExportJarTask } from "../exportJarSteps/ExportJarTaskProvider";
import { isLightWeightMode, isSwitchingServer } from "../extension";
import { Jdtls } from "../java/jdtls";
import { INodeData, NodeKind } from "../java/nodeData";
Expand Down

0 comments on commit 2bbee59

Please sign in to comment.