import * as core from '@actions/core' ; import * as tc from '@actions/tool-cache' ; import fs from 'fs' ; import path from 'path' ; import semver from 'semver' ; import { JavaBase } from '../base-installer' ; import { IAdoptAvailableVersions } from './models' ; import { JavaDownloadRelease , JavaInstallerOptions , JavaInstallerResults } from '../base-models' ; import { extractJdkFile , getDownloadArchiveExtension , isVersionSatisfies } from '../../util' ; export enum AdoptImplementation { Hotspot = 'Hotspot' , OpenJ9 = 'OpenJ9' } export class AdoptDistribution extends JavaBase { constructor ( installerOptions , private readonly jvmImpl ) { super ( `Adopt-${ jvmImpl }` , installerOptions ) ; } protected async findPackageForDownload ( version ) { const availableVersionsRaw = await this . getAvailableVersions ( ) ; const availableVersionsWithBinaries = availableVersionsRaw . filter ( item => item . binaries . length > 0 ) . map ( item => { return { version : item . version_data . semver , url : item . binaries [ 0 ] . package . link } as JavaDownloadRelease ; } ) ; const satisfiedVersions = availableVersionsWithBinaries . filter ( item => isVersionSatisfies ( version , item . version ) ) . sort ( ( a , b ) => { return - semver . compareBuild ( a . version , b . version ) ; } ) ; const resolvedFullVersion = satisfiedVersions . length > 0 ? satisfiedVersions [ 0 ] : null ; if ( ! resolvedFullVersion ) { const availableOptions = availableVersionsWithBinaries . map ( item => item . version ) . join ( ', ' ) ; const availableOptionsMessage = availableOptions ? `\nAvailable versions: ${ availableOptions }` : '' ; throw new Error ( `Could not find satisfied version for SemVer '${ version }'. ${ availableOptionsMessage }` ) ; } return resolvedFullVersion ; } protected async downloadTool ( javaRelease ) { let javaPath ; let extractedJavaPath ; core . info ( `Downloading Java ${ javaRelease . version } (${ this . distribution }) from ${ javaRelease . url } ...` ) ; const javaArchivePath = await tc . downloadTool ( javaRelease . url ) ; core . info ( `Extracting Java archive...` ) ; let extension = getDownloadArchiveExtension ( ) ; extractedJavaPath = await extractJdkFile ( javaArchivePath , extension ) ; const archiveName = fs . readdirSync ( extractedJavaPath ) [ 0 ] ; const archivePath = path . join ( extractedJavaPath , archiveName ) ; const version = this . getToolcacheVersionName ( javaRelease . version ) ; javaPath = await tc . cacheDir ( archivePath , this . toolcacheFolderName , version , this . architecture ) ; return { version : javaRelease . version , path : javaPath } ; } protected get toolcacheFolderName ( ) : string { if ( this . jvmImpl === AdoptImplementation . Hotspot ) { return `Java_Adopt_${ this . packageType }` ; } return super . toolcacheFolderName ; } private async getAvailableVersions ( ) { const platform = this . getPlatformOption ( ) ; const arch = this . architecture ; const imageType = this . packageType ; const versionRange = encodeURI ( '[1.0,100.0]' ) ; const releaseType = this . stable ? 'ga' : 'ea' ; console . time ( 'adopt-retrieve-available-versions' ) ; const baseRequestArguments = [ `project=jdk` , 'vendor=adoptopenjdk' , `heap_size=normal` , 'sort_method=DEFAULT' , 'sort_order=DESC' , `os=${ platform }` , `architecture=${ arch }` , `image_type=${ imageType }` , `release_type=${ releaseType }` , `jvm_impl=${ this . jvmImpl . toLowerCase ( ) }` ] . join ( '&' ) ; let page_index = 0 ; const availableVersions = [ ] ; while ( true ) { const requestArguments = `${ baseRequestArguments }&page_size=20&page=${ page_index }` ; const availableVersionsUrl = `https://api.adoptopenjdk.net/v3/assets/version/${ versionRange }?${ requestArguments }` ; if ( core . isDebug ( ) && page_index === 0 ) { core . debug ( `Gathering available versions from '${ availableVersionsUrl }'` ) ; } const paginationPage = ( await this . http . getJson < IAdoptAvailableVersions [ ] > ( availableVersionsUrl ) ) . result ; if ( paginationPage === null || paginationPage . length === 0 ) { break ; } availableVersions . push ( ... paginationPage ) ; page_index ++ ; } if ( core . isDebug ( ) ) { core . startGroup ( 'Print information about available versions' ) ; console . timeEnd ( 'adopt-retrieve-available-versions' ) ; console . log ( `Available versions: [${ availableVersions . length }]` ) ; console . log ( availableVersions . map ( item => item . version_data . semver ) . join ( ', ' ) ) ; core . endGroup ( ) ; } return availableVersions ; } private getPlatformOption ( ) { switch ( process . platform ) { case 'darwin' : return 'mac' ; case 'win32' : return 'windows' ; default : return process . platform ; } } }