Skip to content

Commit c76a5dc

Browse files
committed
[FEATURE] Implement custom java download
1 parent 3adf2bc commit c76a5dc

6 files changed

Lines changed: 74 additions & 7 deletions

File tree

components/launcher-api/src/main/java/pro/gravit/launcher/base/LauncherConfig.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public final class LauncherConfig extends StreamObject {
5656
public LauncherEnvironment environment;
5757
@LauncherInject("runtimeconfig.buildNumber")
5858
public long buildNumber;
59+
@LauncherInject("runtimeconfig.customJavaDownload")
60+
public Map<String, String> customJavaDownload;
61+
@LauncherInject("runtimeconfig.forceUseCustomJava")
62+
public boolean forceUseCustomJava;
5963

6064
private static class ModernModulesClass {
6165
@LauncherInject("launcher.modules")

components/launcher-runtime/src/main/java/pro/gravit/launcher/runtime/backend/ClientDownloadImpl.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ CompletableFuture<LauncherBackendAPI.ReadyProfile> downloadProfile(ClientProfile
4343
return downloadAsset(profile.getAssetDir(), profile.getAssetUpdateMatcher(), profile.getAssetIndex(), callback);
4444
})).thenCompose(assetDir -> {
4545
assetRef.set(assetDir);
46-
return CompletableFuture.completedFuture((DownloadedDir)null); // TODO Custom Java
46+
Path javaPath = settings.getSelectedJava().getPath();
47+
if(javaPath.startsWith(DirBridge.dirUpdates)) {
48+
String javaDirName = DirBridge.dirUpdates.relativize(javaPath).getFileName().toString();
49+
return downloadDir(javaDirName, null, callback);
50+
}
51+
return CompletableFuture.completedFuture((DownloadedDir)null);
4752
}).thenCompose(javaDir -> {
4853
javaRef.set(javaDir);
4954
return CompletableFuture.completedFuture(null);

components/launcher-runtime/src/main/java/pro/gravit/launcher/runtime/backend/LauncherBackendImpl.java

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@
2727
import pro.gravit.launcher.runtime.managers.SettingsManager;
2828
import pro.gravit.launcher.runtime.utils.HWIDProvider;
2929
import pro.gravit.launcher.runtime.utils.LauncherUpdater;
30-
import pro.gravit.utils.helper.IOHelper;
31-
import pro.gravit.utils.helper.JavaHelper;
32-
import pro.gravit.utils.helper.LogHelper;
33-
import pro.gravit.utils.helper.SecurityHelper;
30+
import pro.gravit.utils.helper.*;
3431

3532
import java.io.IOException;
3633
import java.net.URI;
@@ -40,6 +37,7 @@
4037
import java.time.LocalDateTime;
4138
import java.time.ZoneOffset;
4239
import java.time.temporal.ChronoUnit;
40+
import java.util.ArrayList;
4341
import java.util.List;
4442
import java.util.Map;
4543
import java.util.UUID;
@@ -48,6 +46,8 @@
4846
import java.util.concurrent.ExecutorService;
4947
import java.util.concurrent.Executors;
5048
import java.util.function.Function;
49+
import java.util.regex.Matcher;
50+
import java.util.regex.Pattern;
5151
import java.util.stream.Collectors;
5252

5353
public class LauncherBackendImpl implements LauncherBackendAPI, TextureUploadExtension {
@@ -244,13 +244,16 @@ public CompletableFuture<byte[]> fetchTexture(Texture texture) {
244244
return CompletableFuture.failedFuture(new UnsupportedOperationException());
245245
}
246246

247-
@SuppressWarnings({"rawtypes", "unchecked"})
248247
@Override
249248
public CompletableFuture<List<Java>> getAvailableJava() {
250249
if(availableJavas == null) {
251250
if(availableJavasFuture == null) {
252251
availableJavasFuture = CompletableFuture.supplyAsync(() -> {
253-
return (List) JavaHelper.findJava(); // TODO: Custom Java
252+
List<Java> javas = getCustomJava();
253+
if(!Launcher.getConfig().forceUseCustomJava && !javas.isEmpty()) {
254+
javas.addAll(JavaHelper.findJava());
255+
}
256+
return javas;
254257
}, executorService).thenApply(e -> {
255258
availableJavas = e;
256259
return e;
@@ -261,6 +264,54 @@ public CompletableFuture<List<Java>> getAvailableJava() {
261264
return CompletableFuture.completedFuture(availableJavas);
262265
}
263266

267+
private static final Pattern JAVA_VERSION_PATTERN = Pattern.compile(
268+
"Java (?<version>.+) b(?<build>.+) (?<os>.+) (?<arch>.+) javafx (?<javafx>.+)");
269+
270+
public List<Java> getCustomJava() {
271+
List<Java> versions = new ArrayList<>();
272+
for (Map.Entry<String, String> entry : Launcher.getConfig().customJavaDownload.entrySet()) {
273+
String javaDir = entry.getKey();
274+
String javaVersionString = entry.getValue();
275+
Matcher matcher = JAVA_VERSION_PATTERN.matcher(javaVersionString);
276+
if (matcher.matches()) {
277+
String os = matcher.group("os");
278+
int version = Integer.parseInt(matcher.group("version"));
279+
int build = Integer.parseInt(matcher.group("build"));
280+
JVMHelper.ARCH arch = JVMHelper.ARCH.valueOf(matcher.group("arch"));
281+
boolean javafx = Boolean.parseBoolean(matcher.group("javafx"));
282+
if (!isArchAvailable(arch)) {
283+
continue;
284+
}
285+
if (!JVMHelper.OS_TYPE.name.equals(os)) {
286+
continue;
287+
}
288+
Path javaDirectory = DirBridge.dirUpdates.resolve(javaDir);
289+
LogHelper.debug("In-Launcher Java Version found: Java %d b%d %s javafx %s", version, build,
290+
arch.name, Boolean.toString(javafx));
291+
JavaHelper.JavaVersion javaVersion = new JavaHelper.JavaVersion(javaDirectory, version, build,
292+
arch, javafx);
293+
versions.add(javaVersion);
294+
} else {
295+
LogHelper.warning("Java Version: %s does not match", javaVersionString);
296+
}
297+
}
298+
return versions;
299+
}
300+
301+
public boolean isArchAvailable(JVMHelper.ARCH arch) {
302+
if (JVMHelper.ARCH_TYPE == arch) {
303+
return true;
304+
}
305+
if (arch == JVMHelper.ARCH.X86_64 && JVMHelper.OS_TYPE == JVMHelper.OS.MUSTDIE
306+
&& ((JVMHelper.ARCH_TYPE == JVMHelper.ARCH.X86 && !JVMHelper.isJVMMatchesSystemArch())
307+
|| JVMHelper.ARCH_TYPE == JVMHelper.ARCH.ARM64)) {
308+
return true;
309+
}
310+
return arch == JVMHelper.ARCH.X86_64
311+
&& JVMHelper.OS_TYPE == JVMHelper.OS.MACOSX
312+
&& JVMHelper.ARCH_TYPE == JVMHelper.ARCH.ARM64;
313+
}
314+
264315
@Override
265316
public CompletableFuture<ServerPingInfo> pingServer(ProfileFeatureAPI.ClientProfile profile) {
266317
return pingFutures.computeIfAbsent(profile.getUUID(), (k) -> {

components/launcher-runtime/src/main/java/pro/gravit/launcher/runtime/backend/ProfileSettingsImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ public void disableOptional(ProfileFeatureAPI.OptionalMod mod, ChangedOptionalSt
124124

125125
@Override
126126
public JavaHelper.JavaVersion getSelectedJava() {
127+
if(selectedJava == null) {
128+
selectedJava = getRecommendedJava();
129+
}
127130
return selectedJava;
128131
}
129132

components/launchserver/src/main/java/pro/gravit/launchserver/binary/tasks/MainBuildTask.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ protected void initProps(BuildContext context) {
113113
context.properties.put("launchercore.env", server.config.env);
114114
context.properties.put("launcher.memory", server.config.launcher.memoryLimit);
115115
context.properties.put("launcher.customJvmOptions", server.config.launcher.customJvmOptions);
116+
context.properties.put("runtimeconfig.customJavaDownload", server.config.launcher.customJavaDownload);
117+
context.properties.put("runtimeconfig.forceUseCustomJava", server.config.launcher.forceUseCustomJava);
116118
if (server.config.launcher.encryptRuntime) {
117119
String runtimeEncryptKey = SecurityHelper.randomStringToken();
118120
context.pipelineContext.putProperty("runtimeEncryptKey", runtimeEncryptKey);

components/launchserver/src/main/java/pro/gravit/launchserver/config/LaunchServerConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,8 @@ public static class LauncherConf {
251251
public boolean certificatePinning;
252252
public boolean encryptRuntime;
253253
public List<String> customJvmOptions = new ArrayList<>();
254+
public Map<String, String> customJavaDownload = new HashMap<>();
255+
public boolean forceUseCustomJava;
254256
public int memoryLimit = 256;
255257
}
256258

0 commit comments

Comments
 (0)