forked from elastic/elasticsearch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
OracleOpenJdkToolchainResolver.java
126 lines (113 loc) · 5.08 KB
/
OracleOpenJdkToolchainResolver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
package org.elasticsearch.gradle.internal.toolchain;
import org.elasticsearch.gradle.VersionProperties;
import org.gradle.jvm.toolchain.JavaLanguageVersion;
import org.gradle.jvm.toolchain.JavaToolchainDownload;
import org.gradle.jvm.toolchain.JavaToolchainRequest;
import org.gradle.jvm.toolchain.JavaToolchainSpec;
import org.gradle.jvm.toolchain.JvmVendorSpec;
import org.gradle.platform.Architecture;
import org.gradle.platform.BuildPlatform;
import org.gradle.platform.OperatingSystem;
import java.net.URI;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public abstract class OracleOpenJdkToolchainResolver extends AbstractCustomJavaToolchainResolver {
record JdkBuild(JavaLanguageVersion languageVersion, String version, String buildNumber, String hash) {}
private static final Pattern VERSION_PATTERN = Pattern.compile(
"(\\d+)(\\.\\d+\\.\\d+(?:\\.\\d+)?)?\\+(\\d+(?:\\.\\d+)?)(@([a-f0-9]{32}))?"
);
private static final List<OperatingSystem> supportedOperatingSystems = List.of(
OperatingSystem.MAC_OS,
OperatingSystem.LINUX,
OperatingSystem.WINDOWS
);
// package private so it can be replaced by tests
List<JdkBuild> builds = List.of(
getBundledJdkBuild(),
// 22 release candidate
new JdkBuild(JavaLanguageVersion.of(22), "22", "36", "830ec9fcccef480bb3e73fb7ecafe059")
);
private JdkBuild getBundledJdkBuild() {
String bundledJdkVersion = VersionProperties.getBundledJdkVersion();
JavaLanguageVersion bundledJdkMajorVersion = JavaLanguageVersion.of(VersionProperties.getBundledJdkMajorVersion());
Matcher jdkVersionMatcher = VERSION_PATTERN.matcher(bundledJdkVersion);
if (jdkVersionMatcher.matches() == false) {
throw new IllegalStateException("Unable to parse bundled JDK version " + bundledJdkVersion);
}
String baseVersion = jdkVersionMatcher.group(1) + (jdkVersionMatcher.group(2) != null ? (jdkVersionMatcher.group(2)) : "");
String build = jdkVersionMatcher.group(3);
String hash = jdkVersionMatcher.group(5);
return new JdkBuild(bundledJdkMajorVersion, baseVersion, build, hash);
}
/**
* We need some place to map JavaLanguageVersion to buildNumber, minor version etc.
* */
@Override
public Optional<JavaToolchainDownload> resolve(JavaToolchainRequest request) {
JdkBuild build = findSupportedBuild(request);
if (build == null) {
return Optional.empty();
}
OperatingSystem operatingSystem = request.getBuildPlatform().getOperatingSystem();
String extension = operatingSystem.equals(OperatingSystem.WINDOWS) ? "zip" : "tar.gz";
String arch = toArchString(request.getBuildPlatform().getArchitecture());
String os = toOsString(operatingSystem);
return Optional.of(
() -> URI.create(
"https://download.oracle.com/java/GA/jdk"
+ build.version
+ "/"
+ build.hash
+ "/"
+ build.buildNumber
+ "/GPL/openjdk-"
+ build.version
+ "_"
+ os
+ "-"
+ arch
+ "_bin."
+ extension
)
);
}
/**
* Check if request can be full-filled by this resolver:
* 1. BundledJdkVendor should match openjdk
* 2. language version should match bundled jdk version
* 3. vendor must be any or oracle
* 4. Aarch64 windows images are not supported
*/
private JdkBuild findSupportedBuild(JavaToolchainRequest request) {
if (VersionProperties.getBundledJdkVendor().toLowerCase().equals("openjdk") == false) {
return null;
}
JavaToolchainSpec javaToolchainSpec = request.getJavaToolchainSpec();
if (anyVendorOr(javaToolchainSpec.getVendor().get(), JvmVendorSpec.ORACLE) == false) {
return null;
}
BuildPlatform buildPlatform = request.getBuildPlatform();
Architecture architecture = buildPlatform.getArchitecture();
OperatingSystem operatingSystem = buildPlatform.getOperatingSystem();
if (supportedOperatingSystems.contains(operatingSystem) == false
|| Architecture.AARCH64 == architecture && OperatingSystem.WINDOWS == operatingSystem) {
return null;
}
JavaLanguageVersion languageVersion = javaToolchainSpec.getLanguageVersion().get();
for (JdkBuild build : builds) {
if (build.languageVersion.equals(languageVersion)) {
return build;
}
}
return null;
}
}