Skip to content

Commit 87c6355

Browse files
authored
adopt adoptium v3 API to download JDK 17 (#765)
Signed-off-by: Yan Zhang <[email protected]>
1 parent 730fde6 commit 87c6355

File tree

4 files changed

+148
-25
lines changed

4 files changed

+148
-25
lines changed

src/java-runtime/assets/index.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { JdkInstallationPanel } from "./jdk.installation";
1111
import { onWillListRuntimes, requestJdkInfo } from "./vscode.api";
1212
import bytes = require("bytes");
1313
import "./style.scss";
14+
import { AdoptiumAsset } from "../utils/adoptiumApi";
1415

1516
const onInitialize = (event: any) => {
1617
const { data } = event;
@@ -44,16 +45,21 @@ function showJavaRuntimeEntries(args: any) {
4445
registerTabSwitchEvents();
4546
}
4647

47-
function applyJdkInfo(jdkInfo: any) {
48-
let binary = jdkInfo.binaries[0];
49-
let downloadLink = binary.installer_link || binary.binary_link;
48+
// now use v3 API
49+
function applyJdkInfo(jdkInfo?: AdoptiumAsset) {
50+
let binary = jdkInfo?.binary?.installer || jdkInfo?.binary?.package;
51+
if (jdkInfo === undefined || binary === undefined) {
52+
return;
53+
}
54+
55+
let downloadLink = binary.link;
5056
let encodedLink = `command:java.helper.openUrl?${encodeURIComponent(JSON.stringify(downloadLink))}`;
5157

5258
const jdkData = {
5359
name: jdkInfo.release_name,
54-
os: binary.os,
55-
arch: binary.architecture,
56-
size: bytes(binary.binary_size, { unitSeparator: " " }),
60+
os: jdkInfo.binary.os,
61+
arch: jdkInfo.binary.architecture,
62+
size: bytes(binary.size, { unitSeparator: " " }),
5763
downloadLink: encodedLink
5864
};
5965

src/java-runtime/assets/jdk.installation.tsx

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export class JdkInstallationPanel extends React.Component<JdkInstallationPanelPr
3838
return {
3939
isLoading: _.isEmpty(props && props.jdkData),
4040
data: props.jdkData
41-
};
41+
};
4242
}
4343

4444
handleChange(event: any) {
@@ -72,7 +72,7 @@ export class JdkInstallationPanel extends React.Component<JdkInstallationPanelPr
7272
<div className="col">
7373
<ul className="nav nav-tabs mb-3" id="jdkSourceTab" role="tablist">
7474
<li className="nav-item">
75-
<a className="nav-link active" id="adoptOpenJdkTab" data-toggle="tab" href="#adoptOpenJdkPanel" role="tab" aria-controls="adoptOpenJdkPanel" aria-selected="true" title="Reliable source of OpenJDK binaries for all platforms">AdoptOpenJDK</a>
75+
<a className="nav-link active" id="adoptOpenJdkTab" data-toggle="tab" href="#adoptOpenJdkPanel" role="tab" aria-controls="adoptOpenJdkPanel" aria-selected="true" title="Reliable source of OpenJDK binaries for all platforms">Adoptium OpenJDK</a>
7676
</li>
7777
<li className="nav-item">
7878
<a className="nav-link" id="otherJdkTab" data-toggle="tab" href="#otherJdkPanel" role="tab" aria-controls="otherJdkPanel" aria-selected="false" title="Other choices">Others<span className="red-dot"></span></a>
@@ -100,15 +100,15 @@ export class JdkInstallationPanel extends React.Component<JdkInstallationPanelPr
100100
</label>
101101
</div>
102102
<div className="form-check">
103-
<input className="form-check-input" type="radio" name="jdkVersion" id="openjdk11Radio" value="openjdk11" defaultChecked />
103+
<input className="form-check-input" type="radio" name="jdkVersion" id="openjdk11Radio" value="openjdk11" />
104104
<label className="form-check-label" htmlFor="openjdk11Radio">
105105
OpenJDK 11 (LTS)
106106
</label>
107107
</div>
108108
<div className="form-check">
109-
<input className="form-check-input" type="radio" name="jdkVersion" id="openjdk16Radio" value="openjdk16" />
110-
<label className="form-check-label" htmlFor="openjdk16Radio">
111-
OpenJDK 16 (Latest)
109+
<input className="form-check-input" type="radio" name="jdkVersion" id="openjdk17Radio" value="openjdk17" defaultChecked />
110+
<label className="form-check-label" htmlFor="openjdk17Radio">
111+
OpenJDK 17 (LTS)
112112
</label>
113113
</div>
114114
</div>
@@ -117,13 +117,7 @@ export class JdkInstallationPanel extends React.Component<JdkInstallationPanelPr
117117
<div className="form-check">
118118
<input className="form-check-input" type="radio" name="jvmImpl" id="hotspotRadio" value="hotspot" defaultChecked />
119119
<label className="form-check-label" htmlFor="hotspotRadio">
120-
Hotspot (Recommended)
121-
</label>
122-
</div>
123-
<div className="form-check">
124-
<input className="form-check-input" type="radio" name="jvmImpl" id="openj9Radio" value="openj9" />
125-
<label className="form-check-label" htmlFor="openj9Radio">
126-
OpenJ9
120+
Hotspot
127121
</label>
128122
</div>
129123
</div>

src/java-runtime/index.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
import * as _ from "lodash";
55
import * as path from "path";
6-
import * as request from "request-promise-native";
76
import * as vscode from "vscode";
87
import { getExtensionContext, loadTextFromFile } from "../utils";
98
import { findJavaHomes, JavaRuntime } from "./utils/findJavaRuntime";
@@ -13,6 +12,7 @@ import { JavaRuntimeEntry, ProjectRuntimeEntry } from "./types";
1312
import { sourceLevelDisplayName } from "./utils/misc";
1413
import { ProjectType } from "../utils/webview";
1514
import { getProjectNameFromUri, getProjectType } from "../utils/jdt";
15+
import { latestAssets } from "./utils/adoptiumApi";
1616

1717
let javaRuntimeView: vscode.WebviewPanel | undefined;
1818
let javaHomes: JavaRuntime[];
@@ -299,7 +299,7 @@ async function getRuntimeSpec(projectRootUri: string) {
299299
};
300300
}
301301

302-
export async function suggestOpenJdk(jdkVersion: string = "openjdk11", impl: string = "hotspot") {
302+
export async function suggestOpenJdk(jdkVersion: string = "openjdk17", impl: string = "hotspot") {
303303
let os: string = process.platform;
304304
if (os === "win32") {
305305
os = "windows";
@@ -314,8 +314,7 @@ export async function suggestOpenJdk(jdkVersion: string = "openjdk11", impl: str
314314
arch = "x32";
315315
}
316316

317-
return await request.get({
318-
uri: `https://api.adoptopenjdk.net/v2/info/releases/${jdkVersion}?openjdk_impl=${impl}&arch=${arch}&os=${os}&type=jdk&release=latest`,
319-
json: true
320-
});
317+
const majorVersion = jdkVersion.replace(/^openjdk/, "");
318+
const assets = await latestAssets(majorVersion, impl);
319+
return assets.find(a => a.binary.image_type === "jdk" && a.binary.architecture === arch && a.binary.os === os);
321320
}
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT license.
3+
4+
import * as request from "request-promise-native";
5+
6+
/**
7+
*
8+
* @returns information about available releases
9+
*
10+
* Sample Response:
11+
* {
12+
* "available_lts_releases": [
13+
* 8,
14+
* 11,
15+
* 17
16+
* ],
17+
* "available_releases": [
18+
* 8,
19+
* 11,
20+
* 16,
21+
* 17
22+
* ],
23+
* "most_recent_feature_release": 17,
24+
* "most_recent_feature_version": 17,
25+
* "most_recent_lts": 17,
26+
* "tip_version": 18
27+
* }
28+
*/
29+
export async function availableReleases(): Promise<AdoptiumReleaseInfo> {
30+
const uri = "https://api.adoptium.net/v3/info/available_releases";
31+
const response = await request.get({
32+
uri,
33+
json: true
34+
})
35+
return response;
36+
}
37+
38+
39+
/**
40+
*
41+
* @returns list of latest assets for given feature version and jvm impl
42+
*
43+
* Sample Response:
44+
* [
45+
* {
46+
* "binary": {
47+
* "architecture": "x64",
48+
* "download_count": 15116,
49+
* "heap_size": "normal",
50+
* "image_type": "jdk",
51+
* "installer": {
52+
* "checksum": "a45c33691f0508a95ff291c88713088e060376e7b4e9cac03d083225b68d8f78",
53+
* "checksum_link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.pkg.sha256.txt",
54+
* "download_count": 8857,
55+
* "link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.pkg",
56+
* "metadata_link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.pkg.json",
57+
* "name": "OpenJDK17-jdk_x64_mac_hotspot_17_35.pkg",
58+
* "size": 192821728
59+
* },
60+
* "jvm_impl": "hotspot",
61+
* "os": "mac",
62+
* "package": {
63+
* "checksum": "e9de8b1b62780fe99270a5b30f0645d7a91eded60438bcf836a05fa7b93c182f",
64+
* "checksum_link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.tar.gz.sha256.txt",
65+
* "download_count": 6259,
66+
* "link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.tar.gz",
67+
* "metadata_link": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17%2B35/OpenJDK17-jdk_x64_mac_hotspot_17_35.tar.gz.json",
68+
* "name": "OpenJDK17-jdk_x64_mac_hotspot_17_35.tar.gz",
69+
* "size": 192417649
70+
* },
71+
* "project": "jdk",
72+
* "scm_ref": "jdk-17+35_adopt",
73+
* "updated_at": "2021-09-22T07:48:28Z"
74+
* },
75+
* "release_name": "jdk-17+35",
76+
* "vendor": "eclipse",
77+
* "version": {
78+
* "build": 35,
79+
* "major": 17,
80+
* "minor": 0,
81+
* "openjdk_version": "17+35",
82+
* "security": 0,
83+
* "semver": "17.0.0+35"
84+
* }
85+
* },
86+
* ...
87+
* ]
88+
*/
89+
export async function latestAssets(featureVersion: string, jvmImpl: string): Promise<AdoptiumAsset[]> {
90+
let uri = `https://api.adoptium.net/v3/assets/latest/${featureVersion}/${jvmImpl}`;
91+
const response = await request.get({
92+
uri,
93+
json: true,
94+
// workaround: certificate expired, fixed in Electron v15.1.0
95+
// see: https://github.com/node-fetch/node-fetch/issues/568#issuecomment-932435180
96+
rejectUnauthorized: false
97+
})
98+
return response;
99+
}
100+
101+
102+
103+
interface AdoptiumReleaseInfo {
104+
available_lts_releases: number[];
105+
available_releases: number[];
106+
};
107+
108+
export interface AdoptiumAsset {
109+
release_name: string;
110+
binary: {
111+
architecture: string;
112+
os: string;
113+
image_type: string;
114+
installer?: AdoptiumFileMetadata;
115+
package?: AdoptiumFileMetadata;
116+
}
117+
}
118+
119+
export interface AdoptiumFileMetadata {
120+
name: string;
121+
link: string;
122+
checksum: string;
123+
size: number;
124+
}

0 commit comments

Comments
 (0)