From 54188bf8f211baec994e81c2d2a9e8a5d318d1ee Mon Sep 17 00:00:00 2001 From: Burning_TNT <88144530+burningtnt@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:27:56 +0800 Subject: [PATCH] Enhance booting (#2531) * Enhance booting * Delete @Booting * Rollback OperatingSystem * Delete Booting * cleanup * Update FractureiserDetector --------- Co-authored-by: Glavo --- .../java/org/jackhuang/hmcl/Launcher.java | 2 +- .../main/java/org/jackhuang/hmcl/Main.java | 2 +- .../jackhuang/hmcl/setting/ConfigHolder.java | 4 +- .../hmcl/ui/export/ExportWizardProvider.java | 6 +-- .../hmcl/ui/export/ModpackInfoPage.java | 2 +- .../hmcl/upgrade/IntegrityChecker.java | 5 +- .../jackhuang/hmcl/upgrade/UpdateHandler.java | 13 +++-- .../hmcl/util/FractureiserDetector.java | 38 ++++++------- .../org/jackhuang/hmcl/util/io/JarUtils.java | 54 +++++++++++-------- .../hmcl/util/platform/OperatingSystem.java | 3 +- 10 files changed, 72 insertions(+), 57 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java index 89169b8a3..717cfa548 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Launcher.java @@ -272,7 +272,7 @@ public final class Launcher extends Application { LOG.info("Java Home: " + System.getProperty("java.home")); LOG.info("Current Directory: " + System.getProperty("user.dir")); LOG.info("HMCL Directory: " + Metadata.HMCL_DIRECTORY); - LOG.info("HMCL Jar Path: " + JarUtils.thisJar().map(it -> it.toAbsolutePath().toString()).orElse("Not Found")); + LOG.info("HMCL Jar Path: " + Lang.requireNonNullElse(JarUtils.thisJarPath(), "Not Found")); LOG.info("Memory: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 + "MB"); LOG.info("Physical memory: " + OperatingSystem.TOTAL_MEMORY + " MB"); LOG.info("Metaspace: " + ManagementFactory.getMemoryPoolMXBeans().stream() diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index c9fc157cc..f6961f54c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -163,7 +163,7 @@ public final class Main { SwingUtils.showWarningDialog(message); } - static void fixLetsEncrypt() { + private static void fixLetsEncrypt() { try { KeyStore defaultKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); Path ksPath = Paths.get(System.getProperty("java.home"), "lib", "security", "cacerts"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index e94bd2bec..33c8e8d53 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -74,7 +74,7 @@ public final class ConfigHolder { return ownerChanged; } - public synchronized static void init() throws IOException { + public static void init() throws IOException { if (configInstance != null) { throw new IllegalStateException("Configuration is already loaded"); } @@ -121,7 +121,7 @@ public final class ConfigHolder { private static Path locateConfig() { Path exePath = Paths.get("").toAbsolutePath(); try { - Path jarPath = JarUtils.thisJar().orElse(null); + Path jarPath = JarUtils.thisJarPath(); if (jarPath != null && Files.isRegularFile(jarPath) && Files.isWritable(jarPath)) { jarPath = jarPath.getParent(); exePath = jarPath; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 1e8a70aff..c4087f038 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -68,8 +68,8 @@ public final class ExportWizardProvider implements WizardProvider { } private Task exportWithLauncher(String modpackType, ModpackExportInfo exportInfo, File modpackFile) { - Optional launcherJar = JarUtils.thisJar(); - boolean packWithLauncher = exportInfo.isPackWithLauncher() && launcherJar.isPresent(); + Path launcherJar = JarUtils.thisJarPath(); + boolean packWithLauncher = exportInfo.isPackWithLauncher() && launcherJar != null; return new Task() { File tempModpack; Task exportTask; @@ -141,7 +141,7 @@ public final class ExportWizardProvider implements WizardProvider { if (background_gif.isFile()) zip.putFile(background_gif, "background.gif"); - zip.putFile(launcherJar.get(), launcherJar.get().getFileName().toString()); + zip.putFile(launcherJar, launcherJar.getFileName().toString()); } } }; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java index ba77e77f5..af5829d44 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackInfoPage.java @@ -96,7 +96,7 @@ public final class ModpackInfoPage extends Control implements WizardPage { launchArguments.set(versionSetting.getMinecraftArgs()); javaArguments.set(versionSetting.getJavaArgs()); - canIncludeLauncher = JarUtils.thisJar().isPresent(); + canIncludeLauncher = JarUtils.thisJarPath() != null; next.set(e -> onNext()); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java index 5faaaf8c1..06c3829b2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/IntegrityChecker.java @@ -142,7 +142,10 @@ public final class IntegrityChecker { } private static void verifySelf() throws IOException { - Path self = JarUtils.thisJar().orElseThrow(() -> new IOException("Failed to find current HMCL location")); + Path self = JarUtils.thisJarPath(); + if (self == null) { + throw new IOException("Failed to find current HMCL location"); + } requireVerifiedJar(self); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index 4cd06ef8c..fef6802ca 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -186,7 +186,11 @@ public final class UpdateHandler { } private static Path getCurrentLocation() throws IOException { - return JarUtils.thisJar().orElseThrow(() -> new IOException("Failed to find current HMCL location")); + Path path = JarUtils.thisJarPath(); + if (path == null) { + throw new IOException("Failed to find current HMCL location"); + } + return path; } // ==== support for old versions === @@ -226,10 +230,10 @@ public final class UpdateHandler { } private static boolean isFirstLaunchAfterUpgrade() { - Optional currentPath = JarUtils.thisJar(); - if (currentPath.isPresent()) { + Path currentPath = JarUtils.thisJarPath(); + if (currentPath != null) { Path updated = Metadata.HMCL_DIRECTORY.resolve("HMCL-" + Metadata.VERSION + ".jar"); - if (currentPath.get().toAbsolutePath().equals(updated.toAbsolutePath())) { + if (currentPath.equals(updated.toAbsolutePath())) { return true; } } @@ -253,5 +257,4 @@ public final class UpdateHandler { } } } - // ==== } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/FractureiserDetector.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/FractureiserDetector.java index abcaf4fa3..f5e5cfd70 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/FractureiserDetector.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/FractureiserDetector.java @@ -5,7 +5,6 @@ import org.jackhuang.hmcl.util.platform.OperatingSystem; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; /** * @see fractureiser-investigation/fractureiser @@ -15,41 +14,44 @@ public final class FractureiserDetector { private FractureiserDetector() { } + private static final class FractureiserException extends Exception { + } + public static boolean detect() { try { - ArrayList badPaths = new ArrayList<>(); - if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { Path appdata = Paths.get(System.getProperty("user.home"), "AppData"); if (Files.isDirectory(appdata)) { - badPaths.add(appdata.resolve("Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\run.bat")); + check(appdata.resolve("Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\run.bat")); Path falseEdgePath = appdata.resolve("Local\\Microsoft Edge"); if (Files.exists(falseEdgePath)) { - badPaths.add(falseEdgePath.resolve(".ref")); - badPaths.add(falseEdgePath.resolve("client.jar")); - badPaths.add(falseEdgePath.resolve("lib.dll")); - badPaths.add(falseEdgePath.resolve("libWebGL64.jar")); - badPaths.add(falseEdgePath.resolve("run.bat")); + check(falseEdgePath.resolve(".ref")); + check(falseEdgePath.resolve("client.jar")); + check(falseEdgePath.resolve("lib.dll")); + check(falseEdgePath.resolve("libWebGL64.jar")); + check(falseEdgePath.resolve("run.bat")); } } } else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) { Path dataDir = Paths.get(System.getProperty("user.home"), ".config", ".data"); if (Files.exists(dataDir)) { - badPaths.add(dataDir.resolve(".ref")); - badPaths.add(dataDir.resolve("client.jar")); - badPaths.add(dataDir.resolve("lib.jar")); - } - } - - for (Path badPath : badPaths) { - if (Files.isRegularFile(badPath)) { - return true; + check(dataDir.resolve(".ref")); + check(dataDir.resolve("client.jar")); + check(dataDir.resolve("lib.jar")); } } + } catch (FractureiserException e) { + return true; } catch (Throwable ignored) { } return false; } + + private static void check(Path path) throws FractureiserException { + if (Files.isRegularFile(path)) { + throw new FractureiserException(); + } + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/JarUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/JarUtils.java index bcaec07a0..548aa32da 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/JarUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/JarUtils.java @@ -17,13 +17,15 @@ */ package org.jackhuang.hmcl.util.io; +import org.jetbrains.annotations.Nullable; + import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.FileSystemNotFoundException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Optional; +import java.security.CodeSource; import java.util.jar.JarFile; import java.util.jar.Manifest; @@ -31,26 +33,40 @@ public final class JarUtils { private JarUtils() { } - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - private static final Optional THIS_JAR; + private static final Path THIS_JAR; private static final Manifest manifest; static { - THIS_JAR = Optional.ofNullable(JarUtils.class.getProtectionDomain().getCodeSource()) - .map(codeSource -> { - try { - return Paths.get(codeSource.getLocation().toURI()); - } catch (FileSystemNotFoundException | IllegalArgumentException | URISyntaxException e) { - return null; - } - }) - .filter(Files::isRegularFile); - - manifest = THIS_JAR.flatMap(JarUtils::getManifest).orElseGet(Manifest::new); + CodeSource cs = JarUtils.class.getProtectionDomain().getCodeSource(); + if (cs == null) { + THIS_JAR = null; + manifest = new Manifest(); + } else { + Path path; + try { + path = Paths.get(cs.getLocation().toURI()).toAbsolutePath(); + } catch (FileSystemNotFoundException | IllegalArgumentException | URISyntaxException e) { + path = null; + } + if (path == null || !Files.isRegularFile(path)) { + THIS_JAR = null; + manifest = new Manifest(); + } else { + THIS_JAR = path; + Manifest mn; + try (JarFile file = new JarFile(path.toFile())) { + mn = file.getManifest(); + } catch (IOException e) { + mn = new Manifest(); + } + manifest = mn; + } + } } - public static Optional thisJar() { + @Nullable + public static Path thisJarPath() { return THIS_JAR; } @@ -58,12 +74,4 @@ public final class JarUtils { String value = manifest.getMainAttributes().getValue(name); return value != null ? value : defaultValue; } - - public static Optional getManifest(Path jar) { - try (JarFile file = new JarFile(jar.toFile())) { - return Optional.ofNullable(file.getManifest()); - } catch (IOException e) { - return Optional.empty(); - } - } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java index f662d3b7f..8990840b1 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/OperatingSystem.java @@ -176,8 +176,7 @@ public enum OperatingSystem { } TOTAL_MEMORY = getPhysicalMemoryStatus() - .map(PhysicalMemoryStatus::getTotal) - .map(bytes -> (int) (bytes / 1024 / 1024)) + .map(physicalMemoryStatus -> (int) (physicalMemoryStatus.getTotal() / 1024 / 1024)) .orElse(1024); SUGGESTED_MEMORY = TOTAL_MEMORY >= 32768 ? 8192 : (int) (Math.round(1.0 * TOTAL_MEMORY / 4.0 / 128.0) * 128);