@@ -8,17 +8,18 @@ import { platform } from "os";
88import { dirname , extname , isAbsolute , join , relative } from "path" ;
99import {
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" ;
1415import { Jdtls } from "../java/jdtls" ;
1516import { INodeData } from "../java/nodeData" ;
1617import { Settings } from "../settings" ;
1718import { IUriData , Trie , TrieNode } from "../views/nodeCache/Trie" ;
1819import { IClasspathResult } from "./GenerateJarExecutor" ;
1920import { IClasspath , IStepMetadata } from "./IStepMetadata" ;
2021import { 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
2324interface 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+ }
3053export 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 ( ) ;
0 commit comments