in src/exportJarSteps/GenerateJarExecutor.ts [100:206]
private async generateClasspaths(stepMetadata: IStepMetadata): Promise<boolean> {
const extensionApi: any = await getExtensionApi();
const dependencyItems: IJarQuickPickItem[] = await window.withProgress({
location: ProgressLocation.Window,
title: "Exporting Jar : Resolving classpaths...",
cancellable: true,
}, (_progress, token) => {
return new Promise<IJarQuickPickItem[]>(async (resolve, reject) => {
token.onCancellationRequested(() => {
return reject();
});
const pickItems: IJarQuickPickItem[] = [];
const uriSet: Set<string> = new Set<string>();
const projectList: INodeData[] = stepMetadata.projectList;
if (_.isEmpty(projectList)) {
return reject(new Error(ExportJarMessages.WORKSPACE_EMPTY));
}
const workspaceFolder: WorkspaceFolder | undefined = stepMetadata.workspaceFolder;
if (!workspaceFolder) {
return reject(new Error(ExportJarMessages.fieldUndefinedMessage(ExportJarMessages.Field.WORKSPACEFOLDER, this.currentStep)));
}
for (const project of projectList) {
const projectUri: string = project.metaData?.UnmanagedFolderInnerPath || project.uri;
let classpaths: IClasspathResult;
let testClasspaths: IClasspathResult;
try {
classpaths = await extensionApi.getClasspaths(projectUri, { scope: "runtime" });
testClasspaths = await extensionApi.getClasspaths(projectUri, { scope: "test" });
} catch (e) {
return reject(new Error(e));
}
pickItems.push(
...await this.parseDependencyItems(classpaths.classpaths, uriSet, workspaceFolder.uri.fsPath, "runtime"),
...await this.parseDependencyItems(classpaths.modulepaths, uriSet, workspaceFolder.uri.fsPath, "runtime"));
pickItems.push(
...await this.parseDependencyItems(testClasspaths.classpaths, uriSet, workspaceFolder.uri.fsPath, "test"),
...await this.parseDependencyItems(testClasspaths.modulepaths, uriSet, workspaceFolder.uri.fsPath, "test"));
}
return resolve(pickItems);
});
});
if (_.isEmpty(dependencyItems)) {
throw new Error(ExportJarMessages.PROJECT_EMPTY);
} else if (dependencyItems.length === 1) {
await this.setStepMetadataFromOutputFolder(dependencyItems[0].path, stepMetadata.classpaths);
return true;
}
dependencyItems.sort((node1, node2) => {
if (node1.description !== node2.description) {
return (node1.description || "").localeCompare(node2.description || "");
}
if (node1.type !== node2.type) {
return node2.type.localeCompare(node1.type);
}
return node1.label.localeCompare(node2.label);
});
const pickedDependencyItems: IJarQuickPickItem[] = [];
for (const item of dependencyItems) {
if (item.picked) {
pickedDependencyItems.push(item);
}
}
const disposables: Disposable[] = [];
let result: boolean = false;
try {
result = await new Promise<boolean>(async (resolve, reject) => {
const pickBox = createPickBox<IJarQuickPickItem>("Export Jar : Determine elements", "Select the elements",
dependencyItems, stepMetadata.steps.length > 0, true);
pickBox.selectedItems = pickedDependencyItems;
disposables.push(
pickBox.onDidTriggerButton((item) => {
if (item === QuickInputButtons.Back) {
return resolve(false);
}
}),
pickBox.onDidAccept(async () => {
if (_.isEmpty(pickBox.selectedItems)) {
return;
}
for (const item of pickBox.selectedItems) {
if (item.type === "artifact") {
const classpath: IClasspath = {
source: item.path,
destination: undefined,
isArtifact: true,
};
stepMetadata.classpaths.push(classpath);
} else {
await this.setStepMetadataFromOutputFolder(item.path, stepMetadata.classpaths);
}
}
return resolve(true);
}),
pickBox.onDidHide(() => {
return reject();
}),
);
disposables.push(pickBox);
pickBox.show();
});
} finally {
for (const d of disposables) {
d.dispose();
}
}
return result;
}