From adc7f7defdac29a592cf80e08c3ce570baf41b57 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Tue, 30 Jun 2026 16:57:30 +0800 Subject: [PATCH 1/3] record --- .../hmcl/game/HMCLGameRepository.java | 2 +- .../hmcl/game/HMCLModpackInstallTask.java | 2 +- .../jackhuang/hmcl/game/LauncherHelper.java | 2 +- .../game/LocalizedRemoteAddonRepository.java | 8 +- .../jackhuang/hmcl/game/ModpackHelper.java | 8 +- .../hmcl/java/HMCLJavaRepository.java | 2 +- .../hmcl/ui/download/RemoteModpackPage.java | 12 +- .../jackhuang/hmcl/ui/versions/GameItem.java | 2 +- .../hmcl/ui/versions/ModListPageSkin.java | 4 +- .../hmcl/ui/versions/ModTranslations.java | 92 ++------ .../ui/versions/ResourcePackListPage.java | 2 +- .../jackhuang/hmcl/addon/LocalAddonFile.java | 34 +-- .../hmcl/addon/meta/ForgeNewModMetadata.java | 117 ++-------- .../hmcl/addon/meta/QuiltModMetadata.java | 26 +-- .../download/fabric/FabricInstallTask.java | 81 +------ .../download/fabric/FabricVersionList.java | 27 +-- .../download/forge/ForgeBMCLVersionList.java | 34 +-- .../hmcl/download/forge/ForgeInstall.java | 61 +---- .../download/forge/ForgeInstallProfile.java | 20 +- .../hmcl/download/forge/ForgeInstallTask.java | 10 +- .../forge/ForgeNewInstallProfile.java | 27 +-- .../download/forge/ForgeOldInstallTask.java | 8 +- .../java/mojang/MojangJavaDownloadTask.java | 2 +- .../java/mojang/MojangJavaRemoteFiles.java | 11 +- .../java/mojang/MojangJavaRemoteVersion.java | 14 +- .../legacyfabric/LegacyFabricInstallTask.java | 6 +- .../legacyfabric/LegacyFabricVersionList.java | 27 +-- .../liteloader/LiteLoaderBMCLVersionList.java | 12 +- .../download/liteloader/LiteLoaderBranch.java | 23 +- .../liteloader/LiteLoaderGameVersions.java | 28 +-- .../liteloader/LiteLoaderRepository.java | 38 +--- .../liteloader/LiteLoaderVersion.java | 50 +--- .../liteloader/LiteLoaderVersionList.java | 20 +- .../liteloader/LiteLoaderVersionsMeta.java | 30 +-- .../liteloader/LiteLoaderVersionsRoot.java | 21 +- .../neoforge/NeoForgeBMCLVersionList.java | 15 +- .../optifine/OptiFineBMCLVersionList.java | 74 +----- .../hmcl/download/quilt/QuiltInstallTask.java | 81 +------ .../hmcl/download/quilt/QuiltVersionList.java | 27 +-- .../hmcl/modpack/ModpackConfiguration.java | 60 +---- .../hmcl/modpack/ModpackInstallTask.java | 10 +- .../hmcl/modpack/curse/CurseInstallTask.java | 4 +- .../hmcl/modpack/curse/CurseMetaMod.java | 39 +--- .../mcbbs/McbbsModpackCompletionTask.java | 30 +-- .../mcbbs/McbbsModpackLocalInstallTask.java | 10 +- .../modpack/mcbbs/McbbsModpackManifest.java | 213 +++--------------- .../modpack/mcbbs/McbbsModpackProvider.java | 6 +- .../mcbbs/McbbsModpackRemoteInstallTask.java | 8 +- .../modrinth/ModrinthCompletionTask.java | 12 +- .../modpack/modrinth/ModrinthInstallTask.java | 14 +- .../modpack/modrinth/ModrinthManifest.java | 102 +-------- .../modrinth/ModrinthModpackProvider.java | 2 +- .../multimc/MultiMCInstanceConfiguration.java | 4 +- .../modpack/multimc/MultiMCInstancePatch.java | 39 +--- .../hmcl/modpack/multimc/MultiMCManifest.java | 126 ++--------- .../multimc/MultiMCModpackInstallTask.java | 36 +-- .../server/ServerModpackCompletionTask.java | 48 ++-- .../server/ServerModpackLocalInstallTask.java | 6 +- .../modpack/server/ServerModpackManifest.java | 69 +----- .../ServerModpackRemoteInstallTask.java | 8 +- 60 files changed, 346 insertions(+), 1560 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index 87b4473578e..c25cc074175 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -699,7 +699,7 @@ public LaunchOptions.Builder getLaunchOptions(String version, JavaRuntime javaVe try { String jsonText = Files.readString(json); ModpackConfiguration modpackConfiguration = JsonUtils.GSON.fromJson(jsonText, ModpackConfiguration.class); - ModpackProvider provider = ModpackHelper.getProviderByType(modpackConfiguration.getType()); + ModpackProvider provider = ModpackHelper.getProviderByType(modpackConfiguration.type()); if (provider != null) provider.injectLaunchOptions(jsonText, builder); } catch (IOException | JsonParseException e) { LOG.warning("Failed to parse modpack configuration file " + json, e); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java index 248e9b90336..ea270d4f8d7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java @@ -68,7 +68,7 @@ public HMCLModpackInstallTask(Profile profile, Path zipFile, Modpack modpack, St if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(Modpack.class)); - if (!HMCLModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!HMCLModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a HMCL modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index 34f0d77f347..8a2d738f0a6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -164,7 +164,7 @@ private void launch0() { Task.composeAsync(() -> { try { ModpackConfiguration configuration = ModpackHelper.readModpackConfiguration(repository.getModpackConfiguration(selectedVersion)); - ModpackProvider provider = ModpackHelper.getProviderByType(configuration.getType()); + ModpackProvider provider = ModpackHelper.getProviderByType(configuration.type()); if (provider == null) return null; else return provider.createCompletionTask(dependencyManager, selectedVersion); } catch (IOException e) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteAddonRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteAddonRepository.java index 3c531b0dd6a..24d75df0e35 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteAddonRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LocalizedRemoteAddonRepository.java @@ -50,7 +50,7 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion int count = 0; for (ModTranslations.Mod mod : ModTranslations.getTranslationsByRepositoryType(getType()).searchMod(searchFilter)) { - String englishSearchFilter = String.join(" ", StringUtils.tokenize(StringUtils.isNotBlank(mod.getSubname()) ? mod.getSubname() : mod.getName())); + String englishSearchFilter = String.join(" ", StringUtils.tokenize(StringUtils.isNotBlank(mod.subname()) ? mod.subname() : mod.name())); if (StringUtils.isNotBlank(englishSearchFilter)) { englishSearchFiltersSet.add(englishSearchFilter); } @@ -83,7 +83,7 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion } ModTranslations.Mod chineseTranslation = ModTranslations.getTranslationsByRepositoryType(getType()).getModByCurseForgeId(remoteAddon.slug()); - if (chineseTranslation != null && !StringUtils.isBlank(chineseTranslation.getName()) && StringUtils.containsChinese(chineseTranslation.getName())) { + if (chineseTranslation != null && !StringUtils.isBlank(chineseTranslation.name()) && StringUtils.containsChinese(chineseTranslation.name())) { searchResultArray[chineseIndex++] = remoteAddon; } else { searchResultArray[englishIndex--] = remoteAddon; @@ -95,10 +95,10 @@ public SearchResult search(DownloadProvider downloadProvider, String gameVersion StringUtils.LevCalculator levCalculator = new StringUtils.LevCalculator(); return new SearchResult(Stream.concat(Arrays.stream(searchResultArray, 0, chineseIndex).map(remoteMod -> { ModTranslations.Mod chineseRemoteMod = ModTranslations.getTranslationsByRepositoryType(getType()).getModByCurseForgeId(remoteMod.slug()); - if (chineseRemoteMod == null || StringUtils.isBlank(chineseRemoteMod.getName()) || !StringUtils.containsChinese(chineseRemoteMod.getName())) { + if (chineseRemoteMod == null || StringUtils.isBlank(chineseRemoteMod.name()) || !StringUtils.containsChinese(chineseRemoteMod.name())) { return Pair.pair(remoteMod, Integer.MAX_VALUE); } - String chineseRemoteModName = chineseRemoteMod.getName(); + String chineseRemoteModName = chineseRemoteMod.name(); if (searchFilter.isEmpty() || chineseRemoteModName.isEmpty()) { return Pair.pair(remoteMod, Math.max(searchFilter.length(), chineseRemoteModName.length())); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java index 669b3ba3903..08e821d7442 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java @@ -238,7 +238,7 @@ else if (modpack.getManifest() instanceof McbbsModpackManifest) } public static Task getUpdateTask(Profile profile, ServerModpackManifest manifest, Charset charset, String name, ModpackConfiguration configuration) throws UnsupportedModpackException { - switch (configuration.getType()) { + switch (configuration.type()) { case ServerModpackRemoteInstallTask.MODPACK_TYPE: return new ModpackUpdateTask(profile.getRepository(), name, new ServerModpackRemoteInstallTask(profile.getDependency(), manifest, name)) .thenComposeAsync(profile.getRepository().refreshVersionsAsync()) @@ -250,7 +250,7 @@ public static Task getUpdateTask(Profile profile, ServerModpackManifest ma public static Task getUpdateTask(Profile profile, Path zipFile, Charset charset, String name, ModpackConfiguration configuration) throws UnsupportedModpackException, ManuallyCreatedModpackException, MismatchedModpackTypeException { Modpack modpack = ModpackHelper.readModpackManifest(zipFile, charset); - ModpackProvider provider = getProviderByType(configuration.getType()); + ModpackProvider provider = getProviderByType(configuration.type()); if (provider == null) { throw new UnsupportedModpackException(); } @@ -353,7 +353,7 @@ private static Task createMcbbsPostInstallTask(Profile profile, McbbsModpa return Task.runAsync(Schedulers.javafx(), () -> { HMCLGameRepository repository = profile.getRepository(); GameSettings.Effective effective = repository.getEffectiveGameSettings(version); - if (manifest.getLaunchInfo().getMinMemory() > effective.getMaxMemory()) { + if (manifest.launchInfo().minMemory() > effective.getMaxMemory()) { GameSettings.Instance setting = Objects.requireNonNull(repository.getInstanceGameSettingsOrCreate(version)); setting.getOverrideProperties().addAll(List.of( GameSettings.PROPERTY_AUTO_MEMORY, @@ -363,7 +363,7 @@ private static Task createMcbbsPostInstallTask(Profile profile, McbbsModpa )); setting.autoMemoryProperty().setValue(effective.get(GameSettings::autoMemoryProperty)); setting.minMemoryProperty().setValue(effective.get(GameSettings::minMemoryProperty)); - setting.maxMemoryProperty().setValue(manifest.getLaunchInfo().getMinMemory()); + setting.maxMemoryProperty().setValue(manifest.launchInfo().minMemory()); setting.permSizeProperty().setValue(effective.get(GameSettings::permSizeProperty)); } }); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java index 8910cb05e59..da376aff432 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java @@ -168,7 +168,7 @@ public Task getDownloadJavaTask(DownloadProvider downloadProvider, update.put("component", gameJavaVersion.component()); Map files = new LinkedHashMap<>(); - result.remoteFiles().getFiles().forEach((path, file) -> { + result.remoteFiles().files().forEach((path, file) -> { if (file instanceof MojangJavaRemoteFiles.RemoteFile) { DownloadInfo downloadInfo = ((MojangJavaRemoteFiles.RemoteFile) file).getDownloads().get("raw"); if (downloadInfo != null) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/RemoteModpackPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/RemoteModpackPage.java index 3b9745a5156..b43f972f88f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/RemoteModpackPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/RemoteModpackPage.java @@ -53,9 +53,9 @@ public RemoteModpackPage(WizardController controller) { return; } - nameProperty.set(manifest.getName()); - versionProperty.set(manifest.getVersion()); - authorProperty.set(manifest.getAuthor()); + nameProperty.set(manifest.name()); + versionProperty.set(manifest.version()); + authorProperty.set(manifest.author()); Profile profile = controller.getSettings().get(ModpackPage.PROFILE); String name = controller.getSettings().get(MODPACK_NAME); @@ -64,14 +64,14 @@ public RemoteModpackPage(WizardController controller) { txtModpackName.setDisable(true); } else { // trim: https://github.com/HMCL-dev/HMCL/issues/962 - txtModpackName.setText(manifest.getName().trim()); + txtModpackName.setText(manifest.name().trim()); txtModpackName.getValidators().addAll( new RequiredValidator(), new Validator(i18n("install.new_game.already_exists"), str -> !profile.getRepository().versionIdConflicts(str)), new Validator(i18n("install.new_game.malformed"), HMCLGameRepository::isValidVersionId)); } - btnDescription.setVisible(StringUtils.isNotBlank(manifest.getDescription())); + btnDescription.setVisible(StringUtils.isNotBlank(manifest.description())); } @Override @@ -86,7 +86,7 @@ protected void onInstall() { } protected void onDescribe() { - Controllers.navigate(new WebPage(i18n("modpack.description"), manifest.getDescription())); + Controllers.navigate(new WebPage(i18n("modpack.description"), manifest.description())); } public static final SettingsMap.Key MODPACK_SERVER_MANIFEST = new SettingsMap.Key<>("MODPACK_SERVER_MANIFEST"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java index dc8c5fc6113..837c2e99320 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java @@ -82,7 +82,7 @@ record Result(@Nullable String gameVersion, @Nullable String tag) { String modPackVersion = null; try { ModpackConfiguration config = profile.getRepository().readModpackConfiguration(id); - modPackVersion = config != null ? config.getVersion() : null; + modPackVersion = config != null ? config.version() : null; } catch (IOException e) { LOG.warning("Failed to read modpack configuration from " + id, e); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index 1a4ecf3aa6a..4f90525292b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -525,7 +525,7 @@ final class ModInfoDialog extends JFXDialogLayout { getActions().add(officialPageButton); } - if (modInfo.getModTranslations() == null || StringUtils.isBlank(modInfo.getModTranslations().getMcmod())) { + if (modInfo.getModTranslations() == null || StringUtils.isBlank(modInfo.getModTranslations().mcmod())) { JFXHyperlink searchButton = new JFXHyperlink(i18n("mods.mcmod.search")); searchButton.setOnAction(e -> { fireEvent(new DialogCloseEvent()); @@ -616,7 +616,7 @@ protected void updateControl(ModInfoObject dataItem, boolean empty) { String displayName = modInfo.getName(); if (modTranslations != null && I18n.isUseChinese()) { - String chineseName = modTranslations.getName(); + String chineseName = modTranslations.name(); if (StringUtils.containsChinese(chineseName)) { if (StringUtils.containsEmoji(chineseName)) { StringBuilder builder = new StringBuilder(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java index e7bb8328d46..2e5f0bc764c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModTranslations.java @@ -26,10 +26,13 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * Parser for mod_data.txt @@ -40,13 +43,13 @@ public enum ModTranslations { MOD("/assets/mod_data.txt") { @Override public String getMcmodUrl(Mod mod) { - return String.format("https://www.mcmod.cn/class/%s.html", mod.getMcmod()); + return String.format("https://www.mcmod.cn/class/%s.html", mod.mcmod()); } }, MODPACK("/assets/modpack_data.txt") { @Override public String getMcmodUrl(Mod mod) { - return String.format("https://www.mcmod.cn/modpack/%s.html", mod.getMcmod()); + return String.format("https://www.mcmod.cn/modpack/%s.html", mod.mcmod()); } }, EMPTY("") { @@ -118,7 +121,7 @@ private static String cleanSubname(String subname) { try (BufferedReader reader = new BufferedReader( new InputStreamReader( ModTranslations.class.getResourceAsStream(resourceName), StandardCharsets.UTF_8))) { - return this.mods = reader.lines().filter(line -> !line.startsWith("#")).map(Mod::new).toList(); + return this.mods = reader.lines().filter(line -> !line.startsWith("#")).map(Mod::fromLine).toList(); } catch (Exception e) { LOG.warning("Failed to load " + resourceName, e); return this.mods = List.of(); @@ -138,7 +141,7 @@ private static String cleanSubname(String subname) { List mods = getMods(); modIdMap = new HashMap<>(mods.size()); for (Mod mod : mods) { - for (String id : mod.getModIds()) { + for (String id : mod.modIds()) { if (StringUtils.isNotBlank(id)) { modIdMap.putIfAbsent(id, mod); } @@ -162,7 +165,7 @@ private static String cleanSubname(String subname) { List mods = getMods(); for (Mod mod : mods) { - String subname = cleanSubname(mod.getSubname()); + String subname = cleanSubname(mod.subname()); if (StringUtils.isNotBlank(subname)) { subnameMap.putIfAbsent(subname, mod); } @@ -185,8 +188,8 @@ private static String cleanSubname(String subname) { List mods = getMods(); curseForgeMap = new HashMap<>(mods.size()); for (Mod mod : mods) { - if (StringUtils.isNotBlank(mod.getCurseforge())) { - curseForgeMap.putIfAbsent(mod.getCurseforge(), mod); + if (StringUtils.isNotBlank(mod.curseforge())) { + curseForgeMap.putIfAbsent(mod.curseforge(), mod); } } @@ -209,17 +212,17 @@ private static String cleanSubname(String subname) { keywords = new ArrayList<>(); int maxKeywordLength = -1; for (Mod mod : mods) { - if (StringUtils.isNotBlank(mod.getName())) { - keywords.add(pair(mod.getName(), mod)); - maxKeywordLength = Math.max(maxKeywordLength, mod.getName().length()); + if (StringUtils.isNotBlank(mod.name())) { + keywords.add(pair(mod.name(), mod)); + maxKeywordLength = Math.max(maxKeywordLength, mod.name().length()); } - if (StringUtils.isNotBlank(mod.getSubname())) { - keywords.add(pair(mod.getSubname(), mod)); - maxKeywordLength = Math.max(maxKeywordLength, mod.getSubname().length()); + if (StringUtils.isNotBlank(mod.subname())) { + keywords.add(pair(mod.subname(), mod)); + maxKeywordLength = Math.max(maxKeywordLength, mod.subname().length()); } - if (StringUtils.isNotBlank(mod.getAbbr())) { - keywords.add(pair(mod.getAbbr(), mod)); - maxKeywordLength = Math.max(maxKeywordLength, mod.getAbbr().length()); + if (StringUtils.isNotBlank(mod.abbr())) { + keywords.add(pair(mod.abbr(), mod)); + maxKeywordLength = Math.max(maxKeywordLength, mod.abbr().length()); } } @@ -250,7 +253,7 @@ public Mod getMod(String id, String subname) { subname = cleanSubname(subname); if (StringUtils.isNotBlank(subname)) { Mod mod = getSubnameMap().get(subname); - if (mod != null && (StringUtils.isBlank(id) || mod.getModIds().contains(id))) + if (mod != null && (StringUtils.isBlank(id) || mod.modIds().contains(id))) return mod; } @@ -282,35 +285,14 @@ public List searchMod(String query) { .toList(); } - public static final class Mod { - private final String curseforge; - private final String mcmod; - private final List modIds; - private final String name; - private final String subname; - private final String abbr; + public record Mod(String curseforge, String mcmod, List modIds, String name, String subname, String abbr) { - public Mod(String line) { + public static Mod fromLine(String line) { String[] items = line.split(";", -1); if (items.length != 6) { throw new IllegalArgumentException("Illegal mod data line, 6 items expected " + line); } - - curseforge = items[0]; - mcmod = items[1]; - modIds = List.of(items[2].split(",")); - name = items[3]; - subname = items[4]; - abbr = items[5]; - } - - public Mod(String curseforge, String mcmod, List modIds, String name, String subname, String abbr) { - this.curseforge = curseforge; - this.mcmod = mcmod; - this.modIds = modIds; - this.name = name; - this.subname = subname; - this.abbr = abbr; + return new Mod(items[0], items[1], List.of(items[2].split(",")), items[3], items[4], items[5]); } public String getDisplayName() { @@ -324,29 +306,5 @@ public String getDisplayName() { } return builder.toString(); } - - public String getCurseforge() { - return curseforge; - } - - public String getMcmod() { - return mcmod; - } - - public List getModIds() { - return modIds; - } - - public String getName() { - return name; - } - - public String getSubname() { - return subname; - } - - public String getAbbr() { - return abbr; - } } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackListPage.java index 59522a94f0f..58898d97be8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ResourcePackListPage.java @@ -427,7 +427,7 @@ private void search() { LocalAddonFile.Description description = resourcePack.getDescription(); Stream descriptionParts = description == null ? Stream.empty() - : description.getParts().stream().map(LocalAddonFile.Description.Part::getText); + : description.parts().stream().map(LocalAddonFile.Description.Part::text); if (predicate.test(resourcePack.getFileNameWithExtension()) || predicate.test(resourcePack.getFileName()) || descriptionParts.anyMatch(predicate)) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java index ab6c9d4aeca..851295a752f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java @@ -20,6 +20,7 @@ import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.io.FileUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -63,26 +64,16 @@ public record AddonUpdate( ) { } - public static class Description { - private final List parts; - + public record Description(List parts) { public Description(String text) { - this.parts = new ArrayList<>(); - this.parts.add(new LocalAddonFile.Description.Part(text, "black")); - } - - public Description(List parts) { - this.parts = parts; - } - - public List getParts() { - return parts; + this(new ArrayList<>()); + this.parts.add(new Part(text, "black")); } @Override - public String toString() { + public @NotNull String toString() { StringBuilder builder = new StringBuilder(); - for (LocalAddonFile.Description.Part part : parts) { + for (Part part : parts) { builder.append(part.text); } return builder.toString(); @@ -92,10 +83,7 @@ public String toStringSingleLine() { return toString().lines().map(String::trim).filter(StringUtils::isNotBlank).collect(Collectors.joining(" | ")); } - public static class Part { - private final String text; - private final String color; - + public record Part(String text, String color) { public Part(String text) { this(text, ""); } @@ -104,14 +92,6 @@ public Part(String text, String color) { this.text = Objects.requireNonNull(text); this.color = Objects.requireNonNull(color); } - - public String getText() { - return text; - } - - public String getColor() { - return color; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/ForgeNewModMetadata.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/ForgeNewModMetadata.java index 34d72756977..78ae48768ac 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/ForgeNewModMetadata.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/ForgeNewModMetadata.java @@ -17,12 +17,7 @@ */ package org.jackhuang.hmcl.addon.meta; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; +import com.google.gson.*; import com.google.gson.annotations.JsonAdapter; import kala.compress.archivers.zip.ZipArchiveEntry; import org.jackhuang.hmcl.addon.LocalAddonFile; @@ -55,97 +50,15 @@ import static org.jackhuang.hmcl.util.logging.Logger.LOG; @Immutable -public final class ForgeNewModMetadata { - private final String modLoader; - - private final String loaderVersion; - - private final String logoFile; - - private final String license; - - private final List mods; - - public ForgeNewModMetadata(String modLoader, String loaderVersion, String logoFile, String license, List mods) { - this.modLoader = modLoader; - this.loaderVersion = loaderVersion; - this.logoFile = logoFile; - this.license = license; - this.mods = mods; - } - - public String getModLoader() { - return modLoader; - } - - public String getLoaderVersion() { - return loaderVersion; - } - - public String getLogoFile() { - return logoFile; - } - - public String getLicense() { - return license; - } - - public List getMods() { - return mods; - } - - public static class Mod { - private final String modId; - private final String version; - private final String displayName; - private final String side; - private final String displayURL; - @JsonAdapter(AuthorDeserializer.class) - private final String authors; - private final String description; +public record ForgeNewModMetadata(String modLoader, String loaderVersion, String logoFile, String license, + List mods) { + public record Mod(String modId, String version, String displayName, String side, String displayURL, + @JsonAdapter(AuthorDeserializer.class) String authors, String description) { public Mod() { this("", "", "", "", "", "", ""); } - public Mod(String modId, String version, String displayName, String side, String displayURL, String authors, String description) { - this.modId = modId; - this.version = version; - this.displayName = displayName; - this.side = side; - this.displayURL = displayURL; - this.authors = authors; - this.description = description; - } - - public String getModId() { - return modId; - } - - public String getVersion() { - return version; - } - - public String getDisplayName() { - return displayName; - } - - public String getSide() { - return side; - } - - public String getDisplayURL() { - return displayURL; - } - - public String getAuthors() { - return authors; - } - - public String getDescription() { - return description; - } - static final class AuthorDeserializer implements JsonDeserializer { @Override public String deserialize(JsonElement authors, Type type, JsonDeserializationContext context) throws JsonParseException { @@ -219,9 +132,9 @@ private static LocalModFile fromFile0( throw ioException; } ForgeNewModMetadata metadata = JsonUtils.GSON.fromJson(tomlParseResult.toJson(), ForgeNewModMetadata.class); - if (metadata == null || metadata.getMods().isEmpty()) + if (metadata == null || metadata.mods().isEmpty()) throw new IOException("Mod " + modFile + " `%s` is malformed..".formatted(modToml.getName())); - Mod mod = metadata.getMods().get(0); + Mod mod = metadata.mods().get(0); ZipArchiveEntry manifestMF = tree.getEntry("META-INF/MANIFEST.MF"); String jarVersion = ""; if (manifestMF != null) { @@ -233,12 +146,12 @@ private static LocalModFile fromFile0( } } - ModLoaderType type = analyzeLoader(tomlParseResult, mod.getModId(), modLoaderType); + ModLoaderType type = analyzeLoader(tomlParseResult, mod.modId(), modLoaderType); - return new LocalModFile(modManager, modManager.getLocalMod(mod.getModId(), type), modFile, mod.getDisplayName(), new LocalAddonFile.Description(mod.getDescription()), - mod.getAuthors(), jarVersion == null ? mod.getVersion() : mod.getVersion().replace("${file.jarVersion}", jarVersion), "", - mod.getDisplayURL(), - metadata.getLogoFile()); + return new LocalModFile(modManager, modManager.getLocalMod(mod.modId(), type), modFile, mod.displayName(), new LocalAddonFile.Description(mod.description()), + mod.authors(), jarVersion == null ? mod.version() : mod.version().replace("${file.jarVersion}", jarVersion), "", + mod.displayURL(), + metadata.logoFile()); } private static LocalModFile fromEmbeddedMod(ModManager modManager, Path modFile, ZipFileTree tree, ModLoaderType modLoaderType) throws IOException { @@ -307,7 +220,7 @@ private static ModLoaderType analyzeLoader(TomlParseResult toml, String modID, M try { TomlArray tomlArray = toml.getArray("dependencies." + modID); if (tomlArray != null) { - dependencies = tomlArray.toList().stream().map( o -> ((TomlTable) o).toMap()).toList(); + dependencies = tomlArray.toList().stream().map(o -> ((TomlTable) o).toMap()).toList(); } } catch (ClassCastException ignored) { // https://github.com/HMCL-dev/HMCL/issues/5068 } @@ -316,7 +229,7 @@ private static ModLoaderType analyzeLoader(TomlParseResult toml, String modID, M try { TomlArray tomlArray = toml.getArray("dependencies"); // ??? I have no idea why some of the Forge mods use [[dependencies]] if (tomlArray != null) { - dependencies = tomlArray.toList().stream().map( o -> ((TomlTable) o).toMap()).toList(); + dependencies = tomlArray.toList().stream().map(o -> ((TomlTable) o).toMap()).toList(); } } catch (ClassCastException e) { try { @@ -326,7 +239,7 @@ private static ModLoaderType analyzeLoader(TomlParseResult toml, String modID, M TomlArray tomlArray = table.getArray(modID); if (tomlArray != null) { - dependencies = tomlArray.toList().stream().map( o -> ((TomlTable) o).toMap()).toList(); + dependencies = tomlArray.toList().stream().map(o -> ((TomlTable) o).toMap()).toList(); } } catch (Throwable ignored) { } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/QuiltModMetadata.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/QuiltModMetadata.java index 02e31ed7269..56d918d29f6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/QuiltModMetadata.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/meta/QuiltModMetadata.java @@ -35,31 +35,9 @@ @Immutable public final class QuiltModMetadata { - private static final class QuiltLoader { - private static final class Metadata { - private final String name; - private final String description; - private final JsonObject contributors; - private final String icon; - private final JsonObject contact; - public Metadata(String name, String description, JsonObject contributors, String icon, JsonObject contact) { - this.name = name; - this.description = description; - this.contributors = contributors; - this.icon = icon; - this.contact = contact; - } - } - - private final String id; - private final String version; - private final Metadata metadata; - - public QuiltLoader(String id, String version, Metadata metadata) { - this.id = id; - this.version = version; - this.metadata = metadata; + private record QuiltLoader(String id, String version, Metadata metadata) { + private record Metadata(String name, String description, JsonObject contributors, String icon, JsonObject contact) { } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java index b21586201ac..fe5598f3c8d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java @@ -129,89 +129,14 @@ private Version getPatch(FabricInfo fabricInfo, String gameVersion, String loade } @JsonSerializable - public static class FabricInfo { - private final LoaderInfo loader; - private final IntermediaryInfo intermediary; - private final JsonObject launcherMeta; - - public FabricInfo(LoaderInfo loader, IntermediaryInfo intermediary, JsonObject launcherMeta) { - this.loader = loader; - this.intermediary = intermediary; - this.launcherMeta = launcherMeta; - } - - public LoaderInfo getLoader() { - return loader; - } - - public IntermediaryInfo getIntermediary() { - return intermediary; - } - - public JsonObject getLauncherMeta() { - return launcherMeta; - } + public record FabricInfo(LoaderInfo loader, IntermediaryInfo intermediary, JsonObject launcherMeta) { } @JsonSerializable - public static class LoaderInfo { - private final String separator; - private final int build; - private final String maven; - private final String version; - private final boolean stable; - - public LoaderInfo(String separator, int build, String maven, String version, boolean stable) { - this.separator = separator; - this.build = build; - this.maven = maven; - this.version = version; - this.stable = stable; - } - - public String getSeparator() { - return separator; - } - - public int getBuild() { - return build; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } - - public boolean isStable() { - return stable; - } + public record LoaderInfo(String separator, int build, String maven, String version, boolean stable) { } @JsonSerializable - public static class IntermediaryInfo { - private final String maven; - private final String version; - private final boolean stable; - - public IntermediaryInfo(String maven, String version, boolean stable) { - this.maven = maven; - this.version = version; - this.stable = stable; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } - - public boolean isStable() { - return stable; - } + public record IntermediaryInfo(String maven, String version, boolean stable) { } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricVersionList.java index b71a7fb300a..9413bec83f7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricVersionList.java @@ -68,39 +68,16 @@ public Task refreshAsync() { private List getGameVersions(String metaUrl) throws IOException { String json = NetworkUtils.doGet(downloadProvider.injectURLWithCandidates(metaUrl)); return JsonUtils.GSON.fromJson(json, listTypeOf(GameVersion.class)) - .stream().map(GameVersion::getVersion).collect(Collectors.toList()); + .stream().map(GameVersion::version).collect(Collectors.toList()); } private static String getLaunchMetaUrl(String gameVersion, String loaderVersion) { return String.format("https://meta.fabricmc.net/v2/versions/loader/%s/%s", gameVersion, loaderVersion); } - private static class GameVersion { - private final String version; - private final String maven; - private final boolean stable; - + private record GameVersion(String version, @Nullable String maven, boolean stable) { public GameVersion() { this("", null, false); } - - public GameVersion(String version, String maven, boolean stable) { - this.version = version; - this.maven = maven; - this.stable = stable; - } - - public String getVersion() { - return version; - } - - @Nullable - public String getMaven() { - return maven; - } - - public boolean isStable() { - return stable; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java index 14dbcaae3d8..e8e70e575ba 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeBMCLVersionList.java @@ -91,20 +91,20 @@ public Task refreshAsync(String gameVersion) { continue; List urls = new ArrayList<>(); for (ForgeVersion.File file : version.getFiles()) - if ("installer".equals(file.getCategory()) && "jar".equals(file.getFormat())) { + if ("installer".equals(file.category()) && "jar".equals(file.format())) { String branch = toLookupBranch(gameVersion, version.getBranch()); String classifier = lookupVersion + "-" + version.getVersion() + (branch.isEmpty() ? "" : '-' + branch); - String fileName1 = "forge-" + classifier + "-" + file.getCategory() + "." + file.getFormat(); - String fileName2 = "forge-" + classifier + "-" + lookupVersion + "-" + file.getCategory() + "." + file.getFormat(); + String fileName1 = "forge-" + classifier + "-" + file.category() + "." + file.format(); + String fileName2 = "forge-" + classifier + "-" + lookupVersion + "-" + file.category() + "." + file.format(); urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "/" + fileName1); urls.add("https://files.minecraftforge.net/maven/net/minecraftforge/forge/" + classifier + "-" + lookupVersion + "/" + fileName2); urls.add(NetworkUtils.withQuery("https://bmclapi2.bangbang93.com/forge/download", mapOf( pair("mcversion", version.getGameVersion()), pair("version", version.getVersion()), pair("branch", branch), - pair("category", file.getCategory()), - pair("format", file.getFormat()) + pair("category", file.category()), + pair("format", file.format()) ))); } @@ -202,32 +202,10 @@ public void validate() throws JsonParseException { } @Immutable - public static final class File { - private final String format; - private final String category; - private final String hash; - + public record File(String format, String category, String hash) { public File() { this("", "", ""); } - - public File(String format, String category, String hash) { - this.format = format; - this.category = category; - this.hash = hash; - } - - public String getFormat() { - return format; - } - - public String getCategory() { - return category; - } - - public String getHash() { - return hash; - } } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstall.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstall.java index a7a40607998..47dae41bb86 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstall.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstall.java @@ -25,68 +25,11 @@ * @author huangyuhui */ @Immutable -public final class ForgeInstall { - - private final String profileName; - private final String target; - private final Artifact path; - private final String version; - private final String filePath; - private final String welcome; - private final String minecraft; - private final String mirrorList; - private final String logo; +public record ForgeInstall(String profileName, String target, Artifact path, String version, String filePath, + String welcome, String minecraft, String mirrorList, String logo) { public ForgeInstall() { this(null, null, null, null, null, null, null, null, null); } - public ForgeInstall(String profileName, String target, Artifact path, String version, String filePath, String welcome, String minecraft, String mirrorList, String logo) { - this.profileName = profileName; - this.target = target; - this.path = path; - this.version = version; - this.filePath = filePath; - this.welcome = welcome; - this.minecraft = minecraft; - this.mirrorList = mirrorList; - this.logo = logo; - } - - public String getProfileName() { - return profileName; - } - - public String getTarget() { - return target; - } - - public Artifact getPath() { - return path; - } - - public String getVersion() { - return version; - } - - public String getFilePath() { - return filePath; - } - - public String getWelcome() { - return welcome; - } - - public String getMinecraft() { - return minecraft; - } - - public String getMirrorList() { - return mirrorList; - } - - public String getLogo() { - return logo; - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java index 2053837ddc5..fe1ee16da3a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java @@ -28,24 +28,16 @@ * @author huangyuhui */ @Immutable -public final class ForgeInstallProfile implements Validation { +public record ForgeInstallProfile(@SerializedName("install") ForgeInstall install, + @SerializedName("versionInfo") Version versionInfo) implements Validation { - @SerializedName("install") - private final ForgeInstall install; - - @SerializedName("versionInfo") - private final Version versionInfo; - - public ForgeInstallProfile(ForgeInstall install, Version versionInfo) { - this.install = install; - this.versionInfo = versionInfo; - } - - public ForgeInstall getInstall() { + @Override + public ForgeInstall install() { return install; } - public Version getVersionInfo() { + @Override + public Version versionInfo() { return versionInfo; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java index 922fb75f2aa..e61407e8fd7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java @@ -134,8 +134,8 @@ public static boolean detectForgeInstallerType(DependencyManager dependencyManag return true; } else if (installProfile.containsKey("install") && installProfile.containsKey("versionInfo")) { ForgeInstallProfile profile = JsonUtils.fromNonNullJson(installProfileText, ForgeInstallProfile.class); - if (!gameVersion.get().equals(profile.getInstall().getMinecraft())) - throw new VersionMismatchException(profile.getInstall().getMinecraft(), gameVersion.get()); + if (!gameVersion.get().equals(profile.install().minecraft())) + throw new VersionMismatchException(profile.install().minecraft(), gameVersion.get()); return false; } else { throw new IOException(); @@ -167,9 +167,9 @@ public static Task install(DefaultDependencyManager dependencyManager, return new ForgeNewInstallTask(dependencyManager, version, modifyVersion(gameVersion.get(), profile.getVersion()), installer); } else if (installProfile.containsKey("install") && installProfile.containsKey("versionInfo")) { ForgeInstallProfile profile = JsonUtils.fromNonNullJson(installProfileText, ForgeInstallProfile.class); - if (!gameVersion.get().equals(profile.getInstall().getMinecraft())) - throw new VersionMismatchException(profile.getInstall().getMinecraft(), gameVersion.get()); - return new ForgeOldInstallTask(dependencyManager, version, modifyVersion(gameVersion.get(), profile.getInstall().getPath().getVersion().replaceAll("(?i)forge", "")), installer); + if (!gameVersion.get().equals(profile.install().minecraft())) + throw new VersionMismatchException(profile.install().minecraft(), gameVersion.get()); + return new ForgeOldInstallTask(dependencyManager, version, modifyVersion(gameVersion.get(), profile.install().path().getVersion().replaceAll("(?i)forge", "")), installer); } else { throw new IOException(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallProfile.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallProfile.java index d388403cd68..5e970df2c45 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallProfile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeNewInstallProfile.java @@ -114,7 +114,7 @@ public Map getData() { if (data == null) return new HashMap<>(); - return data.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().getClient())); + return data.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().client())); } @Override @@ -196,22 +196,13 @@ public void validate() throws JsonParseException, TolerableValidationException { } } - public static class Datum { - private final String client; - - public Datum(String client) { - this.client = client; - } - - /** - * Can be in the following formats: - * [value]: An artifact path. - * 'value': A string literal. - * value: A file in the installer package, to be extracted to a temp folder, and then have the absolute path in replacements. - * @return Value to use for the client install - */ - public String getClient() { - return client; - } + /** + * @param client Value to use for the client install + *

Can be in the following formats: + *

* [value]: An artifact path. + *

* 'value': A string literal. + *

* value: A file in the installer package, to be extracted to a temp folder, and then have the absolute path in replacements + */ + public record Datum(String client) { } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java index 61aa3ea3350..9ee03909746 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeOldInstallTask.java @@ -71,21 +71,21 @@ public void execute() throws Exception { ForgeInstallProfile installProfile = JsonUtils.fromNonNullJsonFully(stream, ForgeInstallProfile.class); // unpack the universal jar in the installer file. - Library forgeLibrary = new Library(installProfile.getInstall().getPath()); + Library forgeLibrary = new Library(installProfile.install().path()); Path forgeFile = dependencyManager.getGameRepository().getLibraryFile(version, forgeLibrary); Files.createDirectories(forgeFile.getParent()); - ZipEntry forgeEntry = zipFile.getEntry(installProfile.getInstall().getFilePath()); + ZipEntry forgeEntry = zipFile.getEntry(installProfile.install().filePath()); try (InputStream is = zipFile.getInputStream(forgeEntry); OutputStream os = Files.newOutputStream(forgeFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { is.transferTo(os); } - setResult(installProfile.getVersionInfo() + setResult(installProfile.versionInfo() .setPriority(Version.PRIORITY_LOADER) .setId(LibraryAnalyzer.LibraryType.FORGE.getPatchId()) .setVersion(selfVersion)); - dependencies.add(dependencyManager.checkLibraryCompletionAsync(installProfile.getVersionInfo(), true)); + dependencies.add(dependencyManager.checkLibraryCompletionAsync(installProfile.versionInfo(), true)); } catch (ZipException ex) { throw new ArtifactMalformedException("Malformed forge installer file", ex); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java index f790813ecbd..2f6cb97f6d9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java @@ -85,7 +85,7 @@ public Collection> getDependents() { @Override public void execute() throws Exception { - for (Map.Entry entry : javaDownloadsTask.getResult().getFiles().entrySet()) { + for (Map.Entry entry : javaDownloadsTask.getResult().files().entrySet()) { Path dest = tempDir.resolve(entry.getKey()); if (entry.getValue() instanceof MojangJavaRemoteFiles.RemoteFile file) { // Use local file if it already exists diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java index bc6052d169a..ec33129ddcb 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java @@ -24,16 +24,7 @@ import java.util.Collections; import java.util.Map; -public final class MojangJavaRemoteFiles { - private final Map files; - - public MojangJavaRemoteFiles(Map files) { - this.files = files; - } - - public Map getFiles() { - return files; - } +public record MojangJavaRemoteFiles(Map files) { @JsonType( property = "type", diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java index 5e1a3c23bf0..b4385175dcd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java @@ -19,20 +19,12 @@ import org.jackhuang.hmcl.download.java.JavaRemoteVersion; import org.jackhuang.hmcl.game.GameJavaVersion; +import org.jetbrains.annotations.NotNull; /** * @author Glavo */ -public final class MojangJavaRemoteVersion implements JavaRemoteVersion { - private final GameJavaVersion gameJavaVersion; - - public MojangJavaRemoteVersion(GameJavaVersion gameJavaVersion) { - this.gameJavaVersion = gameJavaVersion; - } - - public GameJavaVersion getGameJavaVersion() { - return gameJavaVersion; - } +public record MojangJavaRemoteVersion(GameJavaVersion gameJavaVersion) implements JavaRemoteVersion { @Override public int getJdkVersion() { @@ -50,7 +42,7 @@ public String getDistributionVersion() { } @Override - public String toString() { + public @NotNull String toString() { return "MojangJavaRemoteVersion[gameJavaVersion=" + gameJavaVersion + "]"; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java index f2abb9c33a6..5a0fbfc5599 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java @@ -80,7 +80,7 @@ public void execute() { } private Version getPatch(FabricInstallTask.FabricInfo legacyFabricInfo, String gameVersion, String loaderVersion) { - JsonObject launcherMeta = legacyFabricInfo.getLauncherMeta(); + JsonObject launcherMeta = legacyFabricInfo.launcherMeta(); Arguments arguments = new Arguments(); String mainClass; @@ -107,8 +107,8 @@ private Version getPatch(FabricInstallTask.FabricInfo legacyFabricInfo, String g } // libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.hashed.maven), getMavenRepositoryByGroup(legacyFabricInfo.hashed.maven), null)); - libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.getIntermediary().getMaven()), getMavenRepositoryByGroup(legacyFabricInfo.getIntermediary().getMaven()), null)); - libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.getLoader().getMaven()), getMavenRepositoryByGroup(legacyFabricInfo.getLoader().getMaven()), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.intermediary().maven()), getMavenRepositoryByGroup(legacyFabricInfo.intermediary().maven()), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.loader().maven()), getMavenRepositoryByGroup(legacyFabricInfo.loader().maven()), null)); return new Version(LibraryAnalyzer.LibraryType.LEGACY_FABRIC.getPatchId(), loaderVersion, Version.PRIORITY_LOADER, arguments, mainClass, libraries); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java index 4236cb0640c..a5d5f0cede7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java @@ -71,7 +71,7 @@ public Task refreshAsync() { private List getGameVersions(String metaUrl) throws IOException { String json = NetworkUtils.doGet(downloadProvider.injectURLWithCandidates(metaUrl)); return JsonUtils.GSON.fromJson(json, listTypeOf(GameVersion.class)) - .stream().map(GameVersion::getVersion).collect(Collectors.toList()); + .stream().map(GameVersion::version).collect(Collectors.toList()); } private static String normalizeVersion(String version) { @@ -84,32 +84,9 @@ private static String getLaunchMetaUrl(String gameVersion, String loaderVersion) return String.format("https://meta.legacyfabric.net/v2/versions/loader/%s/%s", gameVersion, loaderVersion); } - private static class GameVersion { - private final String version; - private final String maven; - private final boolean stable; - + private record GameVersion(String version, @Nullable String maven, boolean stable) { public GameVersion() { this("", null, false); } - - public GameVersion(String version, String maven, boolean stable) { - this.version = version; - this.maven = maven; - this.stable = stable; - } - - public String getVersion() { - return version; - } - - @Nullable - public String getMaven() { - return maven; - } - - public boolean isStable() { - return stable; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java index c80aa47a956..c1fe0d4647e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBMCLVersionList.java @@ -43,15 +43,7 @@ public boolean hasType() { return false; } - private static final class LiteLoaderBMCLVersion { - - private final LiteLoaderVersion build; - private final String version; - - public LiteLoaderBMCLVersion(LiteLoaderVersion build, String version) { - this.build = build; - this.version = version; - } + private record LiteLoaderBMCLVersion(LiteLoaderVersion build, String version) { } @Override @@ -78,7 +70,7 @@ public Task refreshAsync(String gameVersion) { downloadProvider.getApiRoot() + "/liteloader/download", Collections.singletonMap("version", v.version) )), - v.build.getTweakClass(), v.build.getLibraries() + v.build.tweakClass(), v.build.libraries() )); } finally { lock.writeLock().unlock(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBranch.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBranch.java index ec27e0f34de..9f34d74563a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBranch.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderBranch.java @@ -24,38 +24,31 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; +import java.util.Set; /** * * @author huangyuhui */ @Immutable -public final class LiteLoaderBranch { - - @SerializedName("libraries") - private final Collection libraries; - - @SerializedName("com.mumfrey:liteloader") - private final Map liteLoader; +public record LiteLoaderBranch(@SerializedName("libraries") Collection libraries, + @SerializedName("com.mumfrey:liteloader") Map liteLoader) { /** * No-arg constructor for Gson. */ @SuppressWarnings("unused") public LiteLoaderBranch() { - this(Collections.emptySet(), Collections.emptyMap()); - } - - public LiteLoaderBranch(Collection libraries, Map liteLoader) { - this.libraries = libraries; - this.liteLoader = liteLoader; + this(Set.of(), Map.of()); } - public Collection getLibraries() { + @Override + public Collection libraries() { return Collections.unmodifiableCollection(libraries); } - public Map getLiteLoader() { + @Override + public Map liteLoader() { return Collections.unmodifiableMap(liteLoader); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java index ce93ad820f0..2d2128070e0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java @@ -25,16 +25,9 @@ * @author huangyuhui */ @Immutable -public final class LiteLoaderGameVersions { - - @SerializedName("repo") - private final LiteLoaderRepository repoitory; - - @SerializedName("artefacts") - private final LiteLoaderBranch artifacts; - - @SerializedName("snapshots") - private final LiteLoaderBranch snapshots; +public record LiteLoaderGameVersions(@SerializedName("repo") LiteLoaderRepository repoitory, + @SerializedName("artefacts") LiteLoaderBranch artifacts, + @SerializedName("snapshots") LiteLoaderBranch snapshots) { /** * No-arg constructor for Gson. @@ -44,21 +37,18 @@ public LiteLoaderGameVersions() { this(null, null, null); } - public LiteLoaderGameVersions(LiteLoaderRepository repoitory, LiteLoaderBranch artifacts, LiteLoaderBranch snapshots) { - this.repoitory = repoitory; - this.artifacts = artifacts; - this.snapshots = snapshots; - } - - public LiteLoaderRepository getRepoitory() { + @Override + public LiteLoaderRepository repoitory() { return repoitory; } - public LiteLoaderBranch getArtifacts() { + @Override + public LiteLoaderBranch artifacts() { return artifacts; } - public LiteLoaderBranch getSnapshots() { + @Override + public LiteLoaderBranch snapshots() { return snapshots; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderRepository.java index d3e836d3183..5e5725024fa 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderRepository.java @@ -25,19 +25,8 @@ * @author huangyuhui */ @Immutable -public final class LiteLoaderRepository { - - @SerializedName("stream") - private final String stream; - - @SerializedName("type") - private final String type; - - @SerializedName("url") - private final String url; - - @SerializedName("classifier") - private final String classifier; +public record LiteLoaderRepository(@SerializedName("stream") String stream, @SerializedName("type") String type, + @SerializedName("url") String url, @SerializedName("classifier") String classifier) { /** * No-arg constructor for Gson. @@ -47,27 +36,4 @@ public LiteLoaderRepository() { this("", "", "", ""); } - public LiteLoaderRepository(String stream, String type, String url, String classifier) { - this.stream = stream; - this.type = type; - this.url = url; - this.classifier = classifier; - } - - public String getStream() { - return stream; - } - - public String getType() { - return type; - } - - public String getUrl() { - return url; - } - - public String getClassifier() { - return classifier; - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersion.java index 653739ff6cf..665a1aca68b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersion.java @@ -28,15 +28,8 @@ * @author huangyuhui */ @Immutable -public final class LiteLoaderVersion { - private final String tweakClass; - private final String file; - private final String version; - private final String md5; - private final String timestamp; - private final int lastSuccessfulBuild; - private final Collection libraries; - +public record LiteLoaderVersion(String tweakClass, String file, String version, String md5, String timestamp, + int lastSuccessfulBuild, Collection libraries) { /** * No-arg constructor for Gson. */ @@ -45,42 +38,9 @@ public LiteLoaderVersion() { this("", "", "", "", "", 0, Collections.emptySet()); } - public LiteLoaderVersion(String tweakClass, String file, String version, String md5, String timestamp, int lastSuccessfulBuild, Collection libraries) { - this.tweakClass = tweakClass; - this.file = file; - this.version = version; - this.md5 = md5; - this.timestamp = timestamp; - this.lastSuccessfulBuild = lastSuccessfulBuild; - this.libraries = libraries; - } - - public String getTweakClass() { - return tweakClass; - } - - public String getFile() { - return file; - } - - public String getVersion() { - return version; - } - - public String getMd5() { - return md5; - } - - public String getTimestamp() { - return timestamp; - } - - public int getLastSuccessfulBuild() { - return lastSuccessfulBuild; - } - - public Collection getLibraries() { + @Override + public Collection libraries() { return Collections.unmodifiableCollection(libraries); } - + } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionList.java index dffb8cd2eb4..b9d93cb52b5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionList.java @@ -55,15 +55,15 @@ public Task refreshAsync(String gameVersion) { return new GetTask(downloadProvider.injectURLWithCandidates(LITELOADER_LIST)) .thenGetJsonAsync(LiteLoaderVersionsRoot.class) .thenAcceptAsync(root -> { - LiteLoaderGameVersions versions = root.getVersions().get(gameVersion); + LiteLoaderGameVersions versions = root.versions().get(gameVersion); if (versions == null) { return; } LiteLoaderRemoteVersion snapshot = null; - if (versions.getSnapshots() != null) { + if (versions.snapshots() != null) { try { - snapshot = loadSnapshotVersion(gameVersion, versions.getSnapshots().getLiteLoader().get("latest")); + snapshot = loadSnapshotVersion(gameVersion, versions.snapshots().liteLoader().get("latest")); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -73,8 +73,8 @@ public Task refreshAsync(String gameVersion) { try { this.versions.clear(); - if (versions.getRepoitory() != null && versions.getArtifacts() != null) { - loadArtifactVersion(gameVersion, versions.getRepoitory(), versions.getArtifacts()); + if (versions.repoitory() != null && versions.artifacts() != null) { + loadArtifactVersion(gameVersion, versions.repoitory(), versions.artifacts()); } if (snapshot != null) { @@ -92,16 +92,16 @@ public Task refreshAsync() { } private void loadArtifactVersion(String gameVersion, LiteLoaderRepository repository, LiteLoaderBranch branch) { - for (Map.Entry entry : branch.getLiteLoader().entrySet()) { + for (Map.Entry entry : branch.liteLoader().entrySet()) { String branchName = entry.getKey(); LiteLoaderVersion v = entry.getValue(); if ("latest".equals(branchName)) continue; versions.put(gameVersion, new LiteLoaderRemoteVersion( - gameVersion, v.getVersion(), RemoteVersion.Type.RELEASE, - Collections.singletonList(repository.getUrl() + "com/mumfrey/liteloader/" + gameVersion + "/" + v.getFile()), - v.getTweakClass(), v.getLibraries() + gameVersion, v.version(), RemoteVersion.Type.RELEASE, + Collections.singletonList(repository.url() + "com/mumfrey/liteloader/" + gameVersion + "/" + v.file()), + v.tweakClass(), v.libraries() )); } } @@ -119,7 +119,7 @@ private LiteLoaderRemoteVersion loadSnapshotVersion(String gameVersion, LiteLoad return new LiteLoaderRemoteVersion( gameVersion, timestamp + "-" + buildNumber, RemoteVersion.Type.SNAPSHOT, Collections.singletonList(String.format(SNAPSHOT_FILE, gameVersion, gameVersion, timestamp, buildNumber)), - v.getTweakClass(), v.getLibraries() + v.tweakClass(), v.libraries() ); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsMeta.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsMeta.java index b451942d6e2..6856c9acac0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsMeta.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsMeta.java @@ -25,37 +25,11 @@ * @author huangyuhui */ @Immutable -public final class LiteLoaderVersionsMeta { - - @SerializedName("description") - private final String description; - - @SerializedName("authors") - private final String authors; - - @SerializedName("url") - private final String url; +public record LiteLoaderVersionsMeta(@SerializedName("description") String description, + @SerializedName("authors") String authors, @SerializedName("url") String url) { public LiteLoaderVersionsMeta() { this("", "", ""); } - public LiteLoaderVersionsMeta(String description, String authors, String url) { - this.description = description; - this.authors = authors; - this.url = url; - } - - public String getDescription() { - return description; - } - - public String getAuthors() { - return authors; - } - - public String getUrl() { - return url; - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsRoot.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsRoot.java index 5f65a2f8e81..c0217e7c61c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsRoot.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderVersionsRoot.java @@ -28,29 +28,16 @@ * @author huangyuhui */ @Immutable -public final class LiteLoaderVersionsRoot { - - @SerializedName("versions") - private final Map versions; - - @SerializedName("meta") - private final LiteLoaderVersionsMeta meta; +public record LiteLoaderVersionsRoot(@SerializedName("versions") Map versions, + @SerializedName("meta") LiteLoaderVersionsMeta meta) { public LiteLoaderVersionsRoot() { this(Collections.emptyMap(), null); } - public LiteLoaderVersionsRoot(Map versions, LiteLoaderVersionsMeta meta) { - this.versions = versions; - this.meta = meta; - } - - public Map getVersions() { + @Override + public Map versions() { return Collections.unmodifiableMap(versions); } - public LiteLoaderVersionsMeta getMeta() { - return meta; - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java index d0466fd5208..9fbf8d6b0ee 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java @@ -80,19 +80,8 @@ public Task refreshAsync(String gameVersion) { } @Immutable - private static final class NeoForgeVersion implements Validation { - private final String rawVersion; - - private final String version; - - @SerializedName("mcversion") - private final String mcVersion; - - public NeoForgeVersion(String rawVersion, String version, String mcVersion) { - this.rawVersion = rawVersion; - this.version = version; - this.mcVersion = mcVersion; - } + private record NeoForgeVersion(String rawVersion, String version, + @SerializedName("mcversion") String mcVersion) implements Validation { @Override public void validate() throws JsonParseException { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java index 608a1ca0470..fca6077260c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/optifine/OptiFineBMCLVersionList.java @@ -79,17 +79,17 @@ public Task refreshAsync() { versions.clear(); Set duplicates = new HashSet<>(); for (OptiFineVersion element : root) { - String version = element.getType() + "_" + element.getPatch(); - String mirror = apiRoot + "/optifine/" + toLookupVersion(element.getGameVersion()) + "/" + element.getType() + "/" + element.getPatch(); + String version = element.type() + "_" + element.patch(); + String mirror = apiRoot + "/optifine/" + toLookupVersion(element.gameVersion()) + "/" + element.type() + "/" + element.patch(); if (!duplicates.add(mirror)) continue; - boolean isPre = element.getPatch() != null && (element.getPatch().startsWith("pre") || element.getPatch().startsWith("alpha")); + boolean isPre = element.patch() != null && (element.patch().startsWith("pre") || element.patch().startsWith("alpha")); - if (StringUtils.isBlank(element.getGameVersion())) + if (StringUtils.isBlank(element.gameVersion())) continue; - String gameVersion = VersionNumber.normalize(fromLookupVersion(element.getGameVersion())); + String gameVersion = VersionNumber.normalize(fromLookupVersion(element.gameVersion())); versions.put(gameVersion, new OptiFineRemoteVersion(gameVersion, version, Collections.singletonList(mirror), isPre)); } } finally { @@ -101,69 +101,13 @@ public Task refreshAsync() { /** * @author huangyuhui */ - private static final class OptiFineVersion { - - @SerializedName("dl") - private final String downloadLink; - - @SerializedName("ver") - private final String version; - - @SerializedName("date") - private final String date; - - @SerializedName("type") - private final String type; - - @SerializedName("patch") - private final String patch; - - @SerializedName("mirror") - private final String mirror; - - @SerializedName("mcversion") - private final String gameVersion; + private record OptiFineVersion(@SerializedName("dl") String downloadLink, @SerializedName("ver") String version, + @SerializedName("date") String date, @SerializedName("type") String type, + @SerializedName("patch") String patch, @SerializedName("mirror") String mirror, + @SerializedName("mcversion") String gameVersion) { public OptiFineVersion() { this(null, null, null, null, null, null, null); } - - public OptiFineVersion(String downloadLink, String version, String date, String type, String patch, String mirror, String gameVersion) { - this.downloadLink = downloadLink; - this.version = version; - this.date = date; - this.type = type; - this.patch = patch; - this.mirror = mirror; - this.gameVersion = gameVersion; - } - - public String getDownloadLink() { - return downloadLink; - } - - public String getVersion() { - return version; - } - - public String getDate() { - return date; - } - - public String getType() { - return type; - } - - public String getPatch() { - return patch; - } - - public String getMirror() { - return mirror; - } - - public String getGameVersion() { - return gameVersion; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java index 01642cecf0d..f89df7631d7 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java @@ -137,89 +137,14 @@ private static String getMavenRepositoryByGroup(String maven) { } @JsonSerializable - public static class QuiltInfo { - private final LoaderInfo loader; - private final IntermediaryInfo hashed; - private final IntermediaryInfo intermediary; - private final JsonObject launcherMeta; - - public QuiltInfo(LoaderInfo loader, IntermediaryInfo hashed, IntermediaryInfo intermediary, JsonObject launcherMeta) { - this.loader = loader; - this.hashed = hashed; - this.intermediary = intermediary; - this.launcherMeta = launcherMeta; - } - - public LoaderInfo getLoader() { - return loader; - } - - public IntermediaryInfo getHashed() { - return hashed; - } - - public IntermediaryInfo getIntermediary() { - return intermediary; - } - - public JsonObject getLauncherMeta() { - return launcherMeta; - } + public record QuiltInfo(LoaderInfo loader, IntermediaryInfo hashed, IntermediaryInfo intermediary, JsonObject launcherMeta) { } @JsonSerializable - public static class LoaderInfo { - private final String separator; - private final int build; - private final String maven; - private final String version; - private final boolean stable; - - public LoaderInfo(String separator, int build, String maven, String version, boolean stable) { - this.separator = separator; - this.build = build; - this.maven = maven; - this.version = version; - this.stable = stable; - } - - public String getSeparator() { - return separator; - } - - public int getBuild() { - return build; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } - - public boolean isStable() { - return stable; - } + public record LoaderInfo(String separator, int build, String maven, String version, boolean stable) { } @JsonSerializable - public static class IntermediaryInfo { - private final String maven; - private final String version; - - public IntermediaryInfo(String maven, String version) { - this.maven = maven; - this.version = version; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } + public record IntermediaryInfo(String maven, String version) { } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltVersionList.java index c33d0acf0ab..0b6f6a3eeb5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltVersionList.java @@ -68,39 +68,16 @@ public Task refreshAsync() { private List getGameVersions(String metaUrl) throws IOException { String json = NetworkUtils.doGet(downloadProvider.injectURLWithCandidates(metaUrl)); return JsonUtils.GSON.fromJson(json, listTypeOf(GameVersion.class)) - .stream().map(GameVersion::getVersion).collect(Collectors.toList()); + .stream().map(GameVersion::version).collect(Collectors.toList()); } private static String getLaunchMetaUrl(String gameVersion, String loaderVersion) { return String.format("https://meta.quiltmc.org/v3/versions/loader/%s/%s", gameVersion, loaderVersion); } - private static class GameVersion { - private final String version; - private final String maven; - private final boolean stable; - + private record GameVersion(String version, @Nullable String maven, boolean stable) { public GameVersion() { this("", null, false); } - - public GameVersion(String version, String maven, boolean stable) { - this.version = version; - this.maven = maven; - this.stable = stable; - } - - public String getVersion() { - return version; - } - - @Nullable - public String getMaven() { - return maven; - } - - public boolean isStable() { - return stable; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java index 41928323108..b148941de37 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackConfiguration.java @@ -28,19 +28,14 @@ import java.util.List; @Immutable -public final class ModpackConfiguration implements Validation { +public record ModpackConfiguration(T manifest, String type, String name, @Nullable String version, + List overrides) implements Validation { @SuppressWarnings("unchecked") public static TypeToken> typeOf(Class clazz) { return (TypeToken>) TypeToken.getParameterized(ModpackConfiguration.class, clazz); } - private final T manifest; - private final String type; - private final String name; - private final String version; - private final List overrides; - public ModpackConfiguration() { this(null, null, "", null, Collections.emptyList()); } @@ -53,23 +48,6 @@ public ModpackConfiguration(T manifest, String type, String name, String version this.overrides = new ArrayList<>(overrides); } - public T getManifest() { - return manifest; - } - - public String getType() { - return type; - } - - public String getName() { - return name; - } - - @Nullable - public String getVersion() { - return version; - } - public ModpackConfiguration setManifest(T manifest) { return new ModpackConfiguration<>(manifest, type, name, version, overrides); } @@ -82,7 +60,8 @@ public ModpackConfiguration setVersion(String version) { return new ModpackConfiguration<>(manifest, type, name, version, overrides); } - public List getOverrides() { + @Override + public List overrides() { return Collections.unmodifiableList(overrides); } @@ -94,11 +73,11 @@ public void validate() throws JsonParseException { throw new JsonParseException("MinecraftInstanceConfiguration missing `type`"); } + /** + * @param path the relative path to Minecraft run directory + */ @Immutable - public static class FileInformation implements Validation { - private final String path; // relative - private final String hash; - private final String downloadURL; + public record FileInformation(String path, String hash, String downloadURL) implements Validation { public FileInformation() { this(null, null); @@ -108,29 +87,6 @@ public FileInformation(String path, String hash) { this(path, hash, null); } - public FileInformation(String path, String hash, String downloadURL) { - this.path = path; - this.hash = hash; - this.downloadURL = downloadURL; - } - - /** - * The relative path to Minecraft run directory - * - * @return the relative path to Minecraft run directory. - */ - public String getPath() { - return path; - } - - public String getDownloadURL() { - return downloadURL; - } - - public String getHash() { - return hash; - } - @Override public void validate() throws JsonParseException { if (path == null) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackInstallTask.java index e05bda259b9..44ff1c8d8d9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/ModpackInstallTask.java @@ -54,7 +54,7 @@ public ModpackInstallTask(Path modpackFile, Path dest, Charset charset, List files = new HashMap<>(); for (ModpackConfiguration.FileInformation file : overrides) - files.put(file.getPath(), file); + files.put(file.path(), file); for (String subDirectory : subDirectories) { @@ -88,7 +88,7 @@ public void execute() throws Exception { // If both old and new modpacks have this entry, and user has modified this file, // we will not replace it since this modified file is what user expects. String fileHash = DigestUtils.digestToString("SHA-1", destFile); - String oldHash = files.get(relativePath).getHash(); + String oldHash = files.get(relativePath).hash(); return Objects.equals(oldHash, fileHash); } }).unzip(); @@ -96,8 +96,8 @@ public void execute() throws Exception { // If old modpack have this entry, and new modpack deleted it. Delete this file. for (ModpackConfiguration.FileInformation file : overrides) { - Path original = dest.resolve(file.getPath()); - if (Files.exists(original) && !entries.contains(file.getPath())) + Path original = dest.resolve(file.path()); + if (Files.exists(original) && !entries.contains(file.path())) Files.deleteIfExists(original); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java index 4b61b55a153..94ea98fea86 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseInstallTask.java @@ -106,7 +106,7 @@ public CurseInstallTask(DefaultDependencyManager dependencyManager, Path zipFile if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(CurseManifest.class)); - if (!CurseModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!CurseModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Curse modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -140,7 +140,7 @@ public Collection> getDependencies() { public void execute() throws Exception { if (config != null) { // For update, remove mods not listed in new manifest - for (CurseManifestFile oldCurseManifestFile : config.getManifest().files()) { + for (CurseManifestFile oldCurseManifestFile : config.manifest().files()) { if (StringUtils.isBlank(oldCurseManifestFile.fileName())) continue; Path oldFile = run.resolve("mods/" + oldCurseManifestFile.fileName()); if (Files.notExists(oldFile)) continue; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseMetaMod.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseMetaMod.java index 2a146188ce5..96f35816e88 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseMetaMod.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/curse/CurseMetaMod.java @@ -26,43 +26,12 @@ * https://addons-ecs.forgesvc.net/api/v2/addon/<projectID>/file/<fileID> */ @Immutable -public final class CurseMetaMod { - @SerializedName(value = "Id", alternate = "id") - private final int id; - - @SerializedName(value = "FileName", alternate = "fileName") - private final String fileName; - - @SerializedName(value = "FileNameOnDisk") - private final String fileNameOnDisk; - - @SerializedName(value = "DownloadURL", alternate = "downloadUrl") - private final String downloadURL; +public record CurseMetaMod(@SerializedName(value = "Id", alternate = "id") int id, + @SerializedName(value = "FileName", alternate = "fileName") String fileName, + @SerializedName(value = "FileNameOnDisk") String fileNameOnDisk, + @SerializedName(value = "DownloadURL", alternate = "downloadUrl") String downloadURL) { public CurseMetaMod() { this(0, "", "", ""); } - - public CurseMetaMod(int id, String fileName, String fileNameOnDisk, String downloadURL) { - this.id = id; - this.fileName = fileName; - this.fileNameOnDisk = fileNameOnDisk; - this.downloadURL = downloadURL; - } - - public int getId() { - return id; - } - - public String getFileName() { - return fileName; - } - - public String getFileNameOnDisk() { - return fileNameOnDisk; - } - - public String getDownloadURL() { - return downloadURL; - } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackCompletionTask.java index 730acc2106b..adcf7529d42 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackCompletionTask.java @@ -89,35 +89,35 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { throw new IOException("Malformed modpack configuration"); } } - manifest = configuration.getManifest(); + manifest = configuration.manifest(); if (manifest == null) throw new CustomException(); })).thenComposeAsync(unused -> { // we first download latest manifest return breakable(CompletableFuture.runAsync(wrap(() -> { - if (StringUtils.isBlank(manifest.getFileApi())) { + if (StringUtils.isBlank(manifest.fileApi())) { // skip this phase throw new CustomException(); } })).thenComposeAsync(wrap(unused1 -> { - return executor.one(new GetTask(manifest.getFileApi() + "/manifest.json")); + return executor.one(new GetTask(manifest.fileApi() + "/manifest.json")); })).thenComposeAsync(wrap(remoteManifestJson -> { McbbsModpackManifest remoteManifest; // We needs to update modpack from online server. try { remoteManifest = JsonUtils.fromNonNullJson(remoteManifestJson, McbbsModpackManifest.class); } catch (JsonParseException e) { - throw new IOException("Unable to parse server manifest.json from " + manifest.getFileApi(), e); + throw new IOException("Unable to parse server manifest.json from " + manifest.fileApi(), e); } Path rootPath = repository.getVersionRoot(version); Files.createDirectories(rootPath); - Map localFiles = manifest.getFiles().stream().collect(Collectors.toMap(Function.identity(), Function.identity())); + Map localFiles = manifest.files().stream().collect(Collectors.toMap(Function.identity(), Function.identity())); // for files in new modpack - List newFiles = new ArrayList<>(remoteManifest.getFiles().size()); + List newFiles = new ArrayList<>(remoteManifest.files().size()); List> tasks = new ArrayList<>(); - for (McbbsModpackManifest.File file : remoteManifest.getFiles()) { + for (McbbsModpackManifest.File file : remoteManifest.files()) { Path actualPath = getFilePath(file); McbbsModpackManifest.File oldFile = localFiles.remove(file); boolean download = false; @@ -173,8 +173,8 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { })).thenAcceptAsync(wrapConsumer(unused1 -> { Path manifestFile = repository.getModpackConfiguration(version); JsonUtils.writeToJsonFile(manifestFile, - new ModpackConfiguration<>(manifest, this.configuration.getType(), this.manifest.getName(), this.manifest.getVersion(), - this.manifest.getFiles().stream() + new ModpackConfiguration<>(manifest, this.configuration.type(), this.manifest.name(), this.manifest.version(), + this.manifest.files().stream() .flatMap(file -> file instanceof McbbsModpackManifest.AddonFile ? Stream.of((McbbsModpackManifest.AddonFile) file) : Stream.empty()) @@ -192,9 +192,9 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { // Because in China, Curse is too difficult to visit, // if failed, ignore it and retry next time. McbbsModpackManifest newManifest = manifest.setFiles( - manifest.getFiles().parallelStream() + manifest.files().parallelStream() .map(rawFile -> { - updateProgress(finished.incrementAndGet(), manifest.getFiles().size()); + updateProgress(finished.incrementAndGet(), manifest.files().size()); if (rawFile instanceof McbbsModpackManifest.CurseFile) { McbbsModpackManifest.CurseFile file = (McbbsModpackManifest.CurseFile) rawFile; if (StringUtils.isBlank(file.getFileName())) { @@ -204,7 +204,7 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { try { String result = NetworkUtils.doGet(String.format("https://cursemeta.dries007.net/%d/%d.json", file.getProjectID(), file.getFileID())); CurseMetaMod mod = JsonUtils.fromNonNullJson(result, CurseMetaMod.class); - return file.withFileName(mod.getFileNameOnDisk()).withURL(mod.getDownloadURL()); + return file.withFileName(mod.fileNameOnDisk()).withURL(mod.downloadURL()); } catch (FileNotFoundException fof) { LOG.warning("Could not query cursemeta for deleted mods: " + file.getUrl(), fof); notFound.set(true); @@ -213,7 +213,7 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { try { String result = NetworkUtils.doGet(String.format("https://addons-ecs.forgesvc.net/api/v2/addon/%d/file/%d", file.getProjectID(), file.getFileID())); CurseMetaMod mod = JsonUtils.fromNonNullJson(result, CurseMetaMod.class); - return file.withFileName(mod.getFileName()).withURL(mod.getDownloadURL()); + return file.withFileName(mod.fileName()).withURL(mod.downloadURL()); } catch (FileNotFoundException fof) { LOG.warning("Could not query forgesvc for deleted mods: " + file.getUrl(), fof); notFound.set(true); @@ -240,7 +240,7 @@ public CompletableFuture getFuture(TaskCompletableFuture executor) { configuration = configuration.setManifest(newManifest); JsonUtils.writeToJsonFile(configurationFile, configuration); - for (McbbsModpackManifest.File file : newManifest.getFiles()) + for (McbbsModpackManifest.File file : newManifest.files()) if (file instanceof McbbsModpackManifest.CurseFile) { McbbsModpackManifest.CurseFile curseFile = (McbbsModpackManifest.CurseFile) file; if (StringUtils.isNotBlank(curseFile.getFileName())) { @@ -295,7 +295,7 @@ private Task downloadFile(McbbsModpackManifest remoteManifest, McbbsModpackMa if (file instanceof McbbsModpackManifest.AddonFile) { McbbsModpackManifest.AddonFile addonFile = (McbbsModpackManifest.AddonFile) file; return new FileDownloadTask( - remoteManifest.getFileApi() + "/overrides/" + addonFile.getPath(), + remoteManifest.fileApi() + "/overrides/" + addonFile.getPath(), modManager.getSimpleModPath(addonFile.getPath()), addonFile.getHash() != null ? new FileDownloadTask.IntegrityCheck("SHA-1", addonFile.getHash()) : null); } else if (file instanceof McbbsModpackManifest.CurseFile) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java index 9666b4c0b89..7e28a189624 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackLocalInstallTask.java @@ -66,8 +66,8 @@ public McbbsModpackLocalInstallTask(DefaultDependencyManager dependencyManager, GameBuilder builder = dependencyManager.gameBuilder().name(name); - for (McbbsModpackManifest.Addon addon : manifest.getAddons()) { - builder.version(addon.getId(), addon.getVersion()); + for (McbbsModpackManifest.Addon addon : manifest.addons()) { + builder.version(addon.id(), addon.version()); } dependents.add(builder.buildAsync()); @@ -81,7 +81,7 @@ public McbbsModpackLocalInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(McbbsModpackManifest.class)); - if (!McbbsModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!McbbsModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Mcbbs modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -106,11 +106,11 @@ public void execute() throws Exception { Version version = repository.readVersionJson(name); Optional mcbbsPatch = version.getPatches().stream().filter(patch -> PATCH_NAME.equals(patch.getId())).findFirst(); if (!update) { - Version patch = new Version(PATCH_NAME).setLibraries(manifest.getLibraries()); + Version patch = new Version(PATCH_NAME).setLibraries(manifest.libraries()); dependencies.add(repository.saveAsync(version.addPatch(patch))); } else if (mcbbsPatch.isPresent()) { // This mcbbs modpack was installed by HMCL. - Version patch = mcbbsPatch.get().setLibraries(manifest.getLibraries()); + Version patch = mcbbsPatch.get().setLibraries(manifest.libraries()); dependencies.add(repository.saveAsync(version.addPatch(patch))); } else { // This mcbbs modpack was installed by other launchers. diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java index 1213aacf5ce..6c006f54f0e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java @@ -26,7 +26,10 @@ import org.jackhuang.hmcl.modpack.ModpackManifest; import org.jackhuang.hmcl.modpack.ModpackProvider; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.gson.*; +import org.jackhuang.hmcl.util.gson.JsonSubtype; +import org.jackhuang.hmcl.util.gson.JsonType; +import org.jackhuang.hmcl.util.gson.TolerableValidationException; +import org.jackhuang.hmcl.util.gson.Validation; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -39,111 +42,19 @@ import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.MINECRAFT; -public class McbbsModpackManifest implements ModpackManifest, Validation { +public record McbbsModpackManifest(String manifestType, int manifestVersion, String name, String version, String author, + String description, @Nullable String fileApi, String url, boolean forceUpdate, + @SerializedName("origin") List origins, List addons, + List libraries, List files, Settings settings, + LaunchInfo launchInfo) implements ModpackManifest, Validation { public static final String MANIFEST_TYPE = "minecraftModpack"; - private final String manifestType; - private final int manifestVersion; - private final String name; - private final String version; - private final String author; - private final String description; - - @Nullable - private final String fileApi; - private final String url; - private final boolean forceUpdate; - @SerializedName("origin") - private final List origins; - private final List addons; - private final List libraries; - private final List files; - private final Settings settings; - private final LaunchInfo launchInfo; // sandbox and antiCheating are both not supported. public McbbsModpackManifest() { this(MANIFEST_TYPE, 1, "", "", "", "", null, "", false, Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), new Settings(), new LaunchInfo()); } - public McbbsModpackManifest(String manifestType, int manifestVersion, String name, String version, String author, String description, @Nullable String fileApi, String url, boolean forceUpdate, List origins, List addons, List libraries, List files, Settings settings, LaunchInfo launchInfo) { - this.manifestType = manifestType; - this.manifestVersion = manifestVersion; - this.name = name; - this.version = version; - this.author = author; - this.description = description; - this.fileApi = fileApi; - this.url = url; - this.forceUpdate = forceUpdate; - this.origins = origins; - this.addons = addons; - this.libraries = libraries; - this.files = files; - this.settings = settings; - this.launchInfo = launchInfo; - } - - public String getManifestType() { - return manifestType; - } - - public int getManifestVersion() { - return manifestVersion; - } - - public String getName() { - return name; - } - - public String getVersion() { - return version; - } - - public String getAuthor() { - return author; - } - - public String getDescription() { - return description; - } - - public String getFileApi() { - return fileApi; - } - - public String getUrl() { - return url; - } - - public boolean isForceUpdate() { - return forceUpdate; - } - - public List getOrigins() { - return origins; - } - - public List getAddons() { - return addons; - } - - public List getLibraries() { - return libraries; - } - - public List getFiles() { - return files; - } - - public Settings getSettings() { - return settings; - } - - public LaunchInfo getLaunchInfo() { - return launchInfo; - } - public McbbsModpackManifest setFiles(List files) { return new McbbsModpackManifest(manifestType, manifestVersion, name, version, author, description, fileApi, url, forceUpdate, origins, addons, libraries, files, settings, launchInfo); } @@ -165,71 +76,33 @@ public void validate() throws JsonParseException, TolerableValidationException { throw new JsonParseException("McbbsModpackManifest.addons cannot be null"); } - public static final class Origin { - private final String type; - private final int id; - + public record Origin(String type, int id) { public Origin() { this("", 0); } - public Origin(String type, int id) { - this.type = type; - this.id = id; - } - - public String getType() { - return type; - } - - public int getId() { - return id; - } } - public static final class Addon { - private final String id; - private final String version; - + public record Addon(String id, String version) { public Addon() { this("", ""); } - public Addon(String id, String version) { - this.id = id; - this.version = version; - } - - public String getId() { - return id; - } - - public String getVersion() { - return version; - } } - public static final class Settings { - @SerializedName("install_mods") - private final boolean installMods; - - @SerializedName("install_resourcepack") - private final boolean installResourcepack; - + public record Settings(@SerializedName("install_mods") boolean installMods, + @SerializedName("install_resourcepack") boolean installResourcepack) { public Settings() { this(true, true); } - public Settings(boolean installMods, boolean installResourcepack) { - this.installMods = installMods; - this.installResourcepack = installResourcepack; - } - - public boolean isInstallMods() { + @Override + public boolean installMods() { return installMods; } - public boolean isInstallResourcepack() { + @Override + public boolean installResourcepack() { return installResourcepack; } } @@ -365,63 +238,33 @@ public int hashCode() { } } - public static final class LaunchInfo { - private final int minMemory; - private final List supportJava; - @SerializedName("launchArgument") - private final List launchArguments; - @SerializedName("javaArgument") - private final List javaArguments; - + public record LaunchInfo(int minMemory, @Nullable List supportJava, + @SerializedName("launchArgument") List launchArguments, + @SerializedName("javaArgument") List javaArguments) { public LaunchInfo() { this(0, Collections.emptyList(), Collections.emptyList(), Collections.emptyList()); } - public LaunchInfo(int minMemory, List supportJava, List launchArguments, List javaArguments) { - this.minMemory = minMemory; - this.supportJava = supportJava; - this.launchArguments = launchArguments; - this.javaArguments = javaArguments; - } - - public int getMinMemory() { - return minMemory; - } - - @Nullable - public List getSupportJava() { - return supportJava; - } - - public List getLaunchArguments() { + @Override + public List launchArguments() { return Optional.ofNullable(launchArguments).orElseGet(Collections::emptyList); } - public List getJavaArguments() { + @Override + public List javaArguments() { return Optional.ofNullable(javaArguments).orElseGet(Collections::emptyList); } } - public static class ServerInfo { - private final String authlibInjectorServer; - + public record ServerInfo(@Nullable String authlibInjectorServer) { public ServerInfo() { this(null); } - - public ServerInfo(String authlibInjectorServer) { - this.authlibInjectorServer = authlibInjectorServer; - } - - @Nullable - public String getAuthlibInjectorServer() { - return authlibInjectorServer; - } } public Modpack toModpack(Charset encoding) throws IOException { String gameVersion = addons.stream().filter(x -> MINECRAFT.getPatchId().equals(x.id)).findAny() - .orElseThrow(() -> new IOException("Cannot find game version")).getVersion(); + .orElseThrow(() -> new IOException("Cannot find game version")).version(); return new Modpack(name, author, version, gameVersion, description, encoding, this) { @Override public Task getInstallTask(DefaultDependencyManager dependencyManager, Path zipFile, String name, String iconUrl) { @@ -431,8 +274,8 @@ public Task getInstallTask(DefaultDependencyManager dependencyManager, Path z } public void injectLaunchOptions(LaunchOptions.Builder launchOptions) { - launchOptions.getGameArguments().addAll(launchInfo.getLaunchArguments()); - launchOptions.getJavaArguments().addAll(launchInfo.getJavaArguments()); + launchOptions.getGameArguments().addAll(launchInfo.launchArguments()); + launchOptions.getJavaArguments().addAll(launchInfo.javaArguments()); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackProvider.java index 966c08bfe15..8845ef0b18c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackProvider.java @@ -56,11 +56,11 @@ public Task createUpdateTask(DefaultDependencyManager dependencyManager, Stri public void injectLaunchOptions(String modpackConfigurationJson, LaunchOptions.Builder builder) { ModpackConfiguration config = JsonUtils.GSON.fromJson(modpackConfigurationJson, ModpackConfiguration.typeOf(McbbsModpackManifest.class)); - if (!getName().equals(config.getType())) { - throw new IllegalArgumentException("Incorrect manifest type, actual=" + config.getType() + ", expected=" + getName()); + if (!getName().equals(config.type())) { + throw new IllegalArgumentException("Incorrect manifest type, actual=" + config.type() + ", expected=" + getName()); } - config.getManifest().injectLaunchOptions(builder); + config.manifest().injectLaunchOptions(builder); } private static Modpack fromManifestFile(InputStream json, Charset encoding) throws IOException, JsonParseException { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java index bfd6ec23d9e..431e440880d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackRemoteInstallTask.java @@ -52,8 +52,8 @@ public McbbsModpackRemoteInstallTask(DefaultDependencyManager dependencyManager, throw new IllegalArgumentException("Version " + name + " already exists."); GameBuilder builder = dependencyManager.gameBuilder().name(name); - for (McbbsModpackManifest.Addon addon : manifest.getAddons()) { - builder.version(addon.getId(), addon.getVersion()); + for (McbbsModpackManifest.Addon addon : manifest.addons()) { + builder.version(addon.id(), addon.version()); } dependents.add(builder.buildAsync()); @@ -67,7 +67,7 @@ public McbbsModpackRemoteInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(McbbsModpackManifest.class)); - if (!MODPACK_TYPE.equals(config.getType())) + if (!MODPACK_TYPE.equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Mcbbs modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -86,7 +86,7 @@ public List> getDependencies() { @Override public void execute() throws Exception { - dependencies.add(new McbbsModpackCompletionTask(dependency, name, new ModpackConfiguration<>(manifest, MODPACK_TYPE, manifest.getName(), manifest.getVersion(), Collections.emptyList()))); + dependencies.add(new McbbsModpackCompletionTask(dependency, name, new ModpackConfiguration<>(manifest, MODPACK_TYPE, manifest.name(), manifest.version(), Collections.emptyList()))); } public static final String MODPACK_TYPE = "Server"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthCompletionTask.java index 6794a52cf3b..efacb734a97 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthCompletionTask.java @@ -105,15 +105,15 @@ public void execute() throws Exception { Path runDirectory = FileUtils.toAbsolute(repository.getRunDirectory(version)); Path modsDirectory = runDirectory.resolve("mods"); - for (ModrinthManifest.File file : manifest.getFiles()) { - if (file.getEnv() != null && file.getEnv().getOrDefault("client", "required").equals("unsupported")) + for (ModrinthManifest.File file : manifest.files()) { + if (file.env() != null && file.env().getOrDefault("client", "required").equals("unsupported")) continue; - if (file.getDownloads().isEmpty()) + if (file.downloads().isEmpty()) continue; - Path filePath = runDirectory.resolve(file.getPath()).toAbsolutePath().normalize(); + Path filePath = runDirectory.resolve(file.path()).toAbsolutePath().normalize(); if (!filePath.startsWith(runDirectory)) - throw new IOException("Unsecure path: " + file.getPath()); + throw new IOException("Unsecure path: " + file.path()); if (Files.exists(filePath)) continue; @@ -121,7 +121,7 @@ public void execute() throws Exception { continue; var task = new FileDownloadTask( - dependency.getDownloadProvider().injectURLsWithCandidates(file.getDownloads()), + dependency.getDownloadProvider().injectURLsWithCandidates(file.downloads()), filePath); task.setCacheRepository(dependency.getCacheRepository()); task.setCaching(true); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java index 00e9a0cc560..5a1a676a6a9 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthInstallTask.java @@ -67,8 +67,8 @@ public ModrinthInstallTask(DefaultDependencyManager dependencyManager, Path zipF if (repository.hasVersion(name) && Files.notExists(json)) throw new IllegalArgumentException("Version " + name + " already exists."); - GameBuilder builder = dependencyManager.gameBuilder().name(name).gameVersion(manifest.getGameVersion()); - for (Map.Entry modLoader : manifest.getDependencies().entrySet()) { + GameBuilder builder = dependencyManager.gameBuilder().name(name).gameVersion(manifest.gameVersion()); + for (Map.Entry modLoader : manifest.dependencies().entrySet()) { switch (modLoader.getKey()) { case "minecraft": break; @@ -106,7 +106,7 @@ public ModrinthInstallTask(DefaultDependencyManager dependencyManager, Path zipF if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ModrinthManifest.class)); - if (!ModrinthModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!ModrinthModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Modrinth modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -115,7 +115,7 @@ public ModrinthInstallTask(DefaultDependencyManager dependencyManager, Path zipF this.config = config; List subDirectories = Arrays.asList("/client-overrides", "/overrides"); dependents.add(new ModpackInstallTask<>(zipFile, run, modpack.getEncoding(), subDirectories, any -> true, config).withStage("hmcl.modpack")); - dependents.add(new MinecraftInstanceTask<>(zipFile, modpack.getEncoding(), subDirectories, manifest, ModrinthModpackProvider.INSTANCE, manifest.getName(), manifest.getVersionId(), repository.getModpackConfiguration(name)).withStage("hmcl.modpack")); + dependents.add(new MinecraftInstanceTask<>(zipFile, modpack.getEncoding(), subDirectories, manifest, ModrinthModpackProvider.INSTANCE, manifest.name(), manifest.versionId(), repository.getModpackConfiguration(name)).withStage("hmcl.modpack")); URI iconUri = NetworkUtils.toURIOrNull(iconUrl); if (iconUri != null) { @@ -143,10 +143,10 @@ public Collection> getDependencies() { public void execute() throws Exception { if (config != null) { // For update, remove mods not listed in new manifest - for (ModrinthManifest.File oldManifestFile : config.getManifest().getFiles()) { - Path oldFile = run.resolve(oldManifestFile.getPath()); + for (ModrinthManifest.File oldManifestFile : config.manifest().files()) { + Path oldFile = run.resolve(oldManifestFile.path()); if (!Files.exists(oldFile)) continue; - if (manifest.getFiles().stream().noneMatch(oldManifestFile::equals)) { + if (manifest.files().stream().noneMatch(oldManifestFile::equals)) { Files.deleteIfExists(oldFile); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthManifest.java index 12577c7899d..10bdccf8d12 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthManifest.java @@ -26,57 +26,17 @@ import java.util.List; import java.util.Map; -import java.util.Objects; -public class ModrinthManifest implements ModpackManifest, Validation { +public record ModrinthManifest(String game, int formatVersion, String versionId, String name, @Nullable String summary, + List files, + Map dependencies) implements ModpackManifest, Validation { - private final String game; - private final int formatVersion; - private final String versionId; - private final String name; - private final @Nullable String summary; - private final List files; - private final Map dependencies; - - public ModrinthManifest(String game, int formatVersion, String versionId, String name, @Nullable String summary, List files, Map dependencies) { - this.game = game; - this.formatVersion = formatVersion; - this.versionId = versionId; - this.name = name; - this.summary = summary; - this.files = files; - this.dependencies = dependencies; - } - - public String getGame() { - return game; - } - - public int getFormatVersion() { - return formatVersion; - } - - public String getVersionId() { - return versionId; - } - - public String getName() { - return name; - } - - public String getSummary() { + @Override + public String summary() { return summary == null ? "" : summary; } - public List getFiles() { - return files; - } - - public Map getDependencies() { - return dependencies; - } - - public String getGameVersion() { + public String gameVersion() { return dependencies.get("minecraft"); } @@ -92,55 +52,7 @@ public void validate() throws JsonParseException, TolerableValidationException { } } - public static class File { - private final String path; - private final Map hashes; - @Nullable - private final Map env; - private final List downloads; - private final int fileSize; - - public File(String path, Map hashes, @Nullable Map env, List downloads, int fileSize) { - this.path = path; - this.hashes = hashes; - this.env = env; - this.downloads = downloads; - this.fileSize = fileSize; - } - - public String getPath() { - return path; - } - - public Map getHashes() { - return hashes; - } - - @Nullable - public Map getEnv() { - return env; - } - - public List getDownloads() { - return downloads; - } - - public int getFileSize() { - return fileSize; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - File file = (File) o; - return fileSize == file.fileSize && path.equals(file.path) && hashes.equals(file.hashes) && Objects.equals(this.env, file.env) && downloads.equals(file.downloads); - } - - @Override - public int hashCode() { - return Objects.hash(path, hashes, env, downloads, fileSize); - } + public record File(String path, Map hashes, @Nullable Map env, List downloads, int fileSize) { } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthModpackProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthModpackProvider.java index fdaa506c920..995ed08cb28 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthModpackProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/modrinth/ModrinthModpackProvider.java @@ -56,7 +56,7 @@ public Task createUpdateTask(DefaultDependencyManager dependencyManager, Stri @Override public Modpack readManifest(ZipArchiveReader zip, Path file, Charset encoding) throws IOException, JsonParseException { ModrinthManifest manifest = JsonUtils.fromNonNullJson(CompressingUtils.readTextZipEntry(zip, "modrinth.index.json"), ModrinthManifest.class); - return new Modpack(manifest.getName(), "", manifest.getVersionId(), manifest.getGameVersion(), manifest.getSummary(), encoding, manifest) { + return new Modpack(manifest.name(), "", manifest.versionId(), manifest.gameVersion(), manifest.summary(), encoding, manifest) { @Override public Task getInstallTask(DefaultDependencyManager dependencyManager, Path zipFile, String name, String iconUrl) { return new ModrinthInstallTask(dependencyManager, zipFile, this, manifest, name, iconUrl); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstanceConfiguration.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstanceConfiguration.java index ff80cca6dc8..5305707f188 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstanceConfiguration.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstanceConfiguration.java @@ -72,8 +72,8 @@ public final class MultiMCInstanceConfiguration implements ModpackManifest { instanceType = readValue(p, "InstanceType"); autoCloseConsole = Boolean.parseBoolean(readValue(p, "AutoCloseConsole")); - gameVersion = mmcPack != null ? mmcPack.getComponents().stream().filter(e -> "net.minecraft".equals(e.getUid())).findAny() - .orElseThrow(() -> new IOException("Malformed mmc-pack.json")).getVersion() : readValue(p, "IntendedVersion"); + gameVersion = mmcPack != null ? mmcPack.components().stream().filter(e -> "net.minecraft".equals(e.uid())).findAny() + .orElseThrow(() -> new IOException("Malformed mmc-pack.json")).version() : readValue(p, "IntendedVersion"); javaPath = readValue(p, "JavaPath"); jvmArgs = readValue(p, "JvmArgs"); fullscreen = Boolean.parseBoolean(readValue(p, "LaunchMaximized")); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java index 452faace338..8b9106c270b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCInstancePatch.java @@ -199,43 +199,8 @@ public static MultiMCInstancePatch read(String componentID, String text) { } } - public static final class ResolvedInstance { - private final Version version; - - private final String gameVersion; - - private final Library mainJar; - - private final List jarModFileNames; - private final List mavenOnlyFiles; - - public ResolvedInstance(Version version, String gameVersion, Library mainJar, List jarModFileNames, List mavenOnlyFiles) { - this.version = version; - this.gameVersion = gameVersion; - this.mainJar = mainJar; - this.jarModFileNames = jarModFileNames; - this.mavenOnlyFiles = mavenOnlyFiles; - } - - public Version getVersion() { - return version; - } - - public String getGameVersion() { - return gameVersion; - } - - public Library getMainJar() { - return mainJar; - } - - public List getJarModFileNames() { - return jarModFileNames; - } - - public List getMavenOnlyFiles() { - return mavenOnlyFiles; - } + public record ResolvedInstance(Version version, String gameVersion, Library mainJar, List jarModFileNames, + List mavenOnlyFiles) { } /** diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCManifest.java index 66f15c02ed7..7f700723b19 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCManifest.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.modpack.multimc; +import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; import kala.compress.archivers.zip.ZipArchiveEntry; import kala.compress.archivers.zip.ZipArchiveReader; @@ -27,136 +28,43 @@ import java.util.List; @Immutable -public final class MultiMCManifest { - - @SerializedName("formatVersion") - private final int formatVersion; - - @SerializedName("components") - private final List components; - - public MultiMCManifest(int formatVersion, List components) { - this.formatVersion = formatVersion; - this.components = components; - } - - public int getFormatVersion() { - return formatVersion; - } - - public List getComponents() { - return components; - } +public record MultiMCManifest(@SerializedName("formatVersion") int formatVersion, + @SerializedName("components") List components) { /** * Read MultiMC modpack manifest from zip file + * * @param zipFile the zip file * @return the MultiMC modpack manifest. - * @throws IOException if zip file is malformed - * @throws com.google.gson.JsonParseException if manifest is malformed. + * @throws IOException if zip file is malformed + * @throws JsonParseException if manifest is malformed. */ public static MultiMCManifest readMultiMCModpackManifest(ZipArchiveReader zipFile, String rootEntryName) throws IOException { ZipArchiveEntry mmcPack = zipFile.getEntry(rootEntryName + "mmc-pack.json"); if (mmcPack == null) return null; MultiMCManifest manifest = JsonUtils.fromNonNullJsonFully(zipFile.getInputStream(mmcPack), MultiMCManifest.class); - if (manifest.getComponents() == null) + if (manifest.components() == null) throw new IOException("mmc-pack.json malformed."); return manifest; } - public static final class MultiMCManifestCachedRequires { - @SerializedName("equals") - private final String equalsVersion; - - @SerializedName("uid") - private final String uid; - - @SerializedName("suggests") - private final String suggests; - - public MultiMCManifestCachedRequires(String equalsVersion, String uid, String suggests) { - this.equalsVersion = equalsVersion; - this.uid = uid; - this.suggests = suggests; - } - - public String getEqualsVersion() { - return equalsVersion; - } - - public String getID() { - return uid; - } - - public String getSuggests() { - return suggests; - } + public record MultiMCManifestCachedRequires(@SerializedName("equals") String equalsVersion, + @SerializedName("uid") String uid, + @SerializedName("suggests") String suggests) { } - public static final class MultiMCManifestComponent { - @SerializedName("cachedName") - private final String cachedName; - - @SerializedName("cachedRequires") - private final List cachedRequires; - - @SerializedName("cachedVersion") - private final String cachedVersion; - - @SerializedName("important") - private final boolean important; - - @SerializedName("dependencyOnly") - private final boolean dependencyOnly; - - @SerializedName("uid") - private final String uid; - - @SerializedName("version") - private final String version; + public record MultiMCManifestComponent(@SerializedName("cachedName") String cachedName, + @SerializedName("cachedRequires") List cachedRequires, + @SerializedName("cachedVersion") String cachedVersion, + @SerializedName("important") boolean important, + @SerializedName("dependencyOnly") boolean dependencyOnly, + @SerializedName("uid") String uid, + @SerializedName("version") String version) { public MultiMCManifestComponent(boolean important, boolean dependencyOnly, String uid, String version) { this(null, null, null, important, dependencyOnly, uid, version); } - - public MultiMCManifestComponent(String cachedName, List cachedRequires, String cachedVersion, boolean important, boolean dependencyOnly, String uid, String version) { - this.cachedName = cachedName; - this.cachedRequires = cachedRequires; - this.cachedVersion = cachedVersion; - this.important = important; - this.dependencyOnly = dependencyOnly; - this.uid = uid; - this.version = version; - } - - public String getCachedName() { - return cachedName; - } - - public List getCachedRequires() { - return cachedRequires; - } - - public String getCachedVersion() { - return cachedVersion; - } - - public boolean isImportant() { - return important; - } - - public boolean isDependencyOnly() { - return dependencyOnly; - } - - public String getUid() { - return uid; - } - - public String getVersion() { - return version; - } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java index a028e6200d8..2369eacad97 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackInstallTask.java @@ -120,7 +120,7 @@ public void preExecute() throws Exception { if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(MultiMCInstanceConfiguration.class)); - if (!MultiMCModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!MultiMCModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a MultiMC modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -142,14 +142,14 @@ public void preExecute() throws Exception { Path root = getRootPath(fs); List components = Objects.requireNonNull( - Objects.requireNonNull(manifest.getMmcPack(), "mmc-pack.json").getComponents(), "components" + Objects.requireNonNull(manifest.getMmcPack(), "mmc-pack.json").components(), "components" ); List> patches = new ArrayList<>(); String mcVersion = null; for (MultiMCManifest.MultiMCManifestComponent component : components) { - if (MultiMCComponents.getComponent(component.getUid()) == LibraryAnalyzer.LibraryType.MINECRAFT) { - mcVersion = component.getVersion(); + if (MultiMCComponents.getComponent(component.uid()) == LibraryAnalyzer.LibraryType.MINECRAFT) { + mcVersion = component.version(); break; } } @@ -158,7 +158,7 @@ public void preExecute() throws Exception { } for (MultiMCManifest.MultiMCManifestComponent component : components) { - String componentID = Objects.requireNonNull(component.getUid(), "Component ID"); + String componentID = Objects.requireNonNull(component.uid(), "Component ID"); Path patchPath = root.resolve(String.format("patches/%s.json", componentID)); if (Files.exists(patchPath)) { @@ -170,7 +170,7 @@ public void preExecute() throws Exception { patches.add(Task.supplyAsync(() -> patch)); // TODO: Task.completed has unclear compatibility issue. } else { patches.add( - new GetTask(MultiMCComponents.getMetaURL(componentID, component.getVersion(), mcVersion)) + new GetTask(MultiMCComponents.getMetaURL(componentID, component.version(), mcVersion)) .thenApplyAsync(s -> MultiMCInstancePatch.read(componentID, s)) ); } @@ -206,10 +206,10 @@ public void execute() throws Exception { while (true) { for (MultiMCInstancePatch patch : existed.values()) { for (MultiMCManifest.MultiMCManifestCachedRequires require : patch.getRequires()) { - String componentID = require.getID(); + String componentID = require.uid(); if (!existed.containsKey(componentID)) { Task task = new GetTask(MultiMCComponents.getMetaURL( - componentID, Lang.requireNonNullElse(require.getEqualsVersion(), require.getSuggests()), mcVersion + componentID, Lang.requireNonNullElse(require.equalsVersion(), require.suggests()), mcVersion )).thenApplyAsync(s -> MultiMCInstancePatch.read(componentID, s)); task.run(); @@ -254,21 +254,21 @@ public void execute() throws Exception { if (Files.exists(libraries)) FileUtils.copyDirectory(libraries, repository.getVersionRoot(name).resolve("libraries")); - for (Library library : artifact.getVersion().getLibraries()) { + for (Library library : artifact.version().getLibraries()) { if ("local".equals(library.getHint())) { /* TODO: Determine whether we should erase community fields, like 'hint' and 'filename' from version json. Retain them will facilitate compatibility, as some embedded libraries may check where their JAR is. Meanwhile, potential compatibility issue with other launcher which never supports these fields might occur. Here, we make the file stored twice, to keep maximum compatibility. */ - Path from = repository.getLibraryFile(artifact.getVersion(), library); - Path target = repository.getLibraryFile(artifact.getVersion(), library.withoutCommunityFields()); + Path from = repository.getLibraryFile(artifact.version(), library); + Path target = repository.getLibraryFile(artifact.version(), library.withoutCommunityFields()); Files.createDirectories(target.getParent()); Files.copy(from, target, StandardCopyOption.REPLACE_EXISTING); } } try (InputStream input = MaintainTask.class.getResourceAsStream("/assets/game/HMCLMultiMCBootstrap-1.0.jar")) { - Path libraryPath = repository.getLibraryFile(artifact.getVersion(), MultiMCInstancePatch.BOOTSTRAP_LIBRARY); + Path libraryPath = repository.getLibraryFile(artifact.version(), MultiMCInstancePatch.BOOTSTRAP_LIBRARY); Files.createDirectories(libraryPath.getParent()); Files.copy(Objects.requireNonNull(input, "Bundled HMCLMultiMCBootstrap is missing."), libraryPath, StandardCopyOption.REPLACE_EXISTING); @@ -285,19 +285,19 @@ public void execute() throws Exception { // Stage #5: Assemble game files. { - Version version = artifact.getVersion(); + Version version = artifact.version(); - dependencies.add(repository.saveAsync(artifact.getVersion())); + dependencies.add(repository.saveAsync(artifact.version())); dependencies.add(new GameAssetDownloadTask(dependencyManager, version, GameAssetDownloadTask.DOWNLOAD_INDEX_FORCIBLY, true)); dependencies.add(new GameLibrariesTask( dependencyManager, // TODO: check integrity of maven-only files when launching games? - version.setLibraries(Lang.merge(version.getLibraries(), artifact.getMavenOnlyFiles())), + version.setLibraries(Lang.merge(version.getLibraries(), artifact.mavenOnlyFiles())), true )); - Artifact mainJarArtifact = artifact.getMainJar().getArtifact(); - String gameVersion = artifact.getGameVersion(); + Artifact mainJarArtifact = artifact.mainJar().getArtifact(); + String gameVersion = artifact.gameVersion(); if (gameVersion != null && "com.mojang".equals(mainJarArtifact.getGroup()) && "minecraft".equals(mainJarArtifact.getName()) && @@ -328,7 +328,7 @@ public boolean doPostExecute() { public void postExecute() throws Exception { MultiMCInstancePatch.ResolvedInstance artifact = Objects.requireNonNull(getResult(), "ResolvedInstance"); - List files = artifact.getJarModFileNames(); + List files = artifact.jarModFileNames(); if (!isDependenciesSucceeded() || files.isEmpty()) { return; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackCompletionTask.java index ab06e48e380..6da1f2009fc 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackCompletionTask.java @@ -81,8 +81,8 @@ public boolean doPreExecute() { @Override public void preExecute() throws Exception { - if (manifest == null || StringUtils.isBlank(manifest.getManifest().getFileApi())) return; - dependent = new GetTask(manifest.getManifest().getFileApi() + "/server-manifest.json"); + if (manifest == null || StringUtils.isBlank(manifest.manifest().fileApi())) return; + dependent = new GetTask(manifest.manifest().fileApi() + "/server-manifest.json"); } @Override @@ -96,12 +96,12 @@ public Collection> getDependents() { } private Map toMap(Collection addons) { - return addons.stream().collect(Collectors.toMap(ServerModpackManifest.Addon::getId, ServerModpackManifest.Addon::getVersion)); + return addons.stream().collect(Collectors.toMap(ServerModpackManifest.Addon::id, ServerModpackManifest.Addon::version)); } @Override public void execute() throws Exception { - if (manifest == null || StringUtils.isBlank(manifest.getManifest().getFileApi())) return; + if (manifest == null || StringUtils.isBlank(manifest.manifest().fileApi())) return; try { remoteManifest = JsonUtils.fromNonNullJson(dependent.getResult(), ServerModpackManifest.class); @@ -109,23 +109,23 @@ public void execute() throws Exception { throw new IOException(e); } - Map oldAddons = toMap(manifest.getManifest().getAddons()); - Map newAddons = toMap(remoteManifest.getAddons()); + Map oldAddons = toMap(manifest.manifest().addons()); + Map newAddons = toMap(remoteManifest.addons()); if (!Objects.equals(oldAddons, newAddons)) { GameBuilder builder = dependencyManager.gameBuilder().name(version); - for (ServerModpackManifest.Addon addon : remoteManifest.getAddons()) { - builder.version(addon.getId(), addon.getVersion()); + for (ServerModpackManifest.Addon addon : remoteManifest.addons()) { + builder.version(addon.id(), addon.version()); } dependencies.add(builder.buildAsync()); } Path rootPath = repository.getVersionRoot(version).toAbsolutePath().normalize(); - Map files = manifest.getManifest().getFiles().stream() - .collect(Collectors.toMap(ModpackConfiguration.FileInformation::getPath, + Map files = manifest.manifest().files().stream() + .collect(Collectors.toMap(ModpackConfiguration.FileInformation::path, Function.identity())); - Set remoteFiles = remoteManifest.getFiles().stream().map(ModpackConfiguration.FileInformation::getPath) + Set remoteFiles = remoteManifest.files().stream().map(ModpackConfiguration.FileInformation::path) .collect(Collectors.toSet()); Path runDirectory = repository.getRunDirectory(version).toAbsolutePath().normalize(); @@ -133,12 +133,12 @@ public void execute() throws Exception { int total = 0; // for files in new modpack - for (ModpackConfiguration.FileInformation file : remoteManifest.getFiles()) { - Path actualPath = rootPath.resolve(file.getPath()).toAbsolutePath().normalize(); + for (ModpackConfiguration.FileInformation file : remoteManifest.files()) { + Path actualPath = rootPath.resolve(file.path()).toAbsolutePath().normalize(); String fileName = actualPath.getFileName().toString(); if (!actualPath.startsWith(rootPath)) { - throw new IOException("Unsecure path: " + file.getPath()); + throw new IOException("Unsecure path: " + file.path()); } boolean download; @@ -149,7 +149,7 @@ public void execute() throws Exception { if (isModDisabled) { download = false; - } else if (!files.containsKey(file.getPath())) { + } else if (!files.containsKey(file.path())) { // If old modpack does not have this entry, download it download = true; } else if (!Files.exists(actualPath)) { @@ -159,24 +159,24 @@ public void execute() throws Exception { } else { // If user modified this entry file, we will not replace this file since this modified file is that user expects. String fileHash = DigestUtils.digestToString("SHA-1", actualPath); - String oldHash = files.get(file.getPath()).getHash(); - download = !Objects.equals(oldHash, file.getHash()) && Objects.equals(oldHash, fileHash); + String oldHash = files.get(file.path()).hash(); + download = !Objects.equals(oldHash, file.hash()) && Objects.equals(oldHash, fileHash); } if (download) { total++; dependencies.add(new FileDownloadTask( - remoteManifest.getFileApi() + "/overrides/" + file.getPath(), + remoteManifest.fileApi() + "/overrides/" + file.path(), actualPath, - new FileDownloadTask.IntegrityCheck("SHA-1", file.getHash())) + new FileDownloadTask.IntegrityCheck("SHA-1", file.hash())) .withCounter("hmcl.modpack.download")); } } // If old modpack have this entry, and new modpack deleted it. Delete this file. - for (ModpackConfiguration.FileInformation file : manifest.getManifest().getFiles()) { - Path actualPath = rootPath.resolve(file.getPath()); - if (Files.exists(actualPath) && !remoteFiles.contains(file.getPath())) + for (ModpackConfiguration.FileInformation file : manifest.manifest().files()) { + Path actualPath = rootPath.resolve(file.path()); + if (Files.exists(actualPath) && !remoteFiles.contains(file.path())) Files.deleteIfExists(actualPath); } @@ -191,9 +191,9 @@ public boolean doPostExecute() { @Override public void postExecute() throws Exception { - if (manifest == null || StringUtils.isBlank(manifest.getManifest().getFileApi())) return; + if (manifest == null || StringUtils.isBlank(manifest.manifest().fileApi())) return; Path manifestFile = repository.getModpackConfiguration(version); Files.createDirectories(manifestFile.getParent()); - JsonUtils.writeToJsonFile(manifestFile, new ModpackConfiguration<>(remoteManifest, this.manifest.getType(), this.manifest.getName(), this.manifest.getVersion(), remoteManifest.getFiles())); + JsonUtils.writeToJsonFile(manifestFile, new ModpackConfiguration<>(remoteManifest, this.manifest.type(), this.manifest.name(), this.manifest.version(), remoteManifest.files())); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java index 5a1d382a685..b5764e27a4b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackLocalInstallTask.java @@ -58,8 +58,8 @@ public ServerModpackLocalInstallTask(DefaultDependencyManager dependencyManager, throw new IllegalArgumentException("Version " + name + " already exists."); GameBuilder builder = dependencyManager.gameBuilder().name(name); - for (ServerModpackManifest.Addon addon : manifest.getAddons()) { - builder.version(addon.getId(), addon.getVersion()); + for (ServerModpackManifest.Addon addon : manifest.addons()) { + builder.version(addon.id(), addon.version()); } dependents.add(builder.buildAsync()); @@ -73,7 +73,7 @@ public ServerModpackLocalInstallTask(DefaultDependencyManager dependencyManager, if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ServerModpackManifest.class)); - if (!ServerModpackProvider.INSTANCE.getName().equals(config.getType())) + if (!ServerModpackProvider.INSTANCE.getName().equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Server modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackManifest.java index f706b0add45..2bc4a0a633b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackManifest.java @@ -35,57 +35,14 @@ import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.MINECRAFT; -public class ServerModpackManifest implements ModpackManifest, Validation { - private final String name; - private final String author; - private final String version; - private final String description; - private final String fileApi; - private final List files; - private final List addons; +public record ServerModpackManifest(String name, String author, String version, String description, String fileApi, + List files, + List addons) implements ModpackManifest, Validation { public ServerModpackManifest() { this("", "", "", "", "", Collections.emptyList(), Collections.emptyList()); } - public ServerModpackManifest(String name, String author, String version, String description, String fileApi, List files, List addons) { - this.name = name; - this.author = author; - this.version = version; - this.description = description; - this.fileApi = fileApi; - this.files = files; - this.addons = addons; - } - - public String getName() { - return name; - } - - public String getAuthor() { - return author; - } - - public String getVersion() { - return version; - } - - public String getDescription() { - return description; - } - - public String getFileApi() { - return fileApi; - } - - public List getFiles() { - return files; - } - - public List getAddons() { - return addons; - } - @Override public ModpackProvider getProvider() { return ServerModpackProvider.INSTANCE; @@ -99,31 +56,15 @@ public void validate() throws JsonParseException, TolerableValidationException { throw new JsonParseException("ServerModpackManifest.files cannot be null"); } - public static final class Addon { - private final String id; - private final String version; - + public record Addon(String id, String version) { public Addon() { this("", ""); } - - public Addon(String id, String version) { - this.id = id; - this.version = version; - } - - public String getId() { - return id; - } - - public String getVersion() { - return version; - } } public Modpack toModpack(Charset encoding) throws IOException { String gameVersion = addons.stream().filter(x -> MINECRAFT.getPatchId().equals(x.id)).findAny() - .orElseThrow(() -> new IOException("Cannot find game version")).getVersion(); + .orElseThrow(() -> new IOException("Cannot find game version")).version(); return new Modpack(name, author, version, gameVersion, description, encoding, this) { @Override public Task getInstallTask(DefaultDependencyManager dependencyManager, Path zipFile, String name, String iconUrl) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java index ecff6c17ac6..854b3ae2e95 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/server/ServerModpackRemoteInstallTask.java @@ -52,8 +52,8 @@ public ServerModpackRemoteInstallTask(DefaultDependencyManager dependencyManager throw new IllegalArgumentException("Version " + name + " already exists."); GameBuilder builder = dependencyManager.gameBuilder().name(name); - for (ServerModpackManifest.Addon addon : manifest.getAddons()) { - builder.version(addon.getId(), addon.getVersion()); + for (ServerModpackManifest.Addon addon : manifest.addons()) { + builder.version(addon.id(), addon.version()); } dependents.add(builder.buildAsync()); @@ -67,7 +67,7 @@ public ServerModpackRemoteInstallTask(DefaultDependencyManager dependencyManager if (Files.exists(json)) { config = JsonUtils.fromJsonFile(json, ModpackConfiguration.typeOf(ServerModpackManifest.class)); - if (!MODPACK_TYPE.equals(config.getType())) + if (!MODPACK_TYPE.equals(config.type())) throw new IllegalArgumentException("Version " + name + " is not a Server modpack. Cannot update this version."); } } catch (JsonParseException | IOException ignore) { @@ -86,7 +86,7 @@ public List> getDependencies() { @Override public void execute() throws Exception { - dependencies.add(new ServerModpackCompletionTask(dependency, name, new ModpackConfiguration<>(manifest, MODPACK_TYPE, manifest.getName(), manifest.getVersion(), Collections.emptyList()))); + dependencies.add(new ServerModpackCompletionTask(dependency, name, new ModpackConfiguration<>(manifest, MODPACK_TYPE, manifest.name(), manifest.version(), Collections.emptyList()))); } public static final String MODPACK_TYPE = "Server"; From d8e1eca4433160432a75a13bbcfbf513b54e0c13 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Tue, 30 Jun 2026 17:01:54 +0800 Subject: [PATCH 2/3] reverse --- .../jackhuang/hmcl/java/HMCLJavaRepository.java | 2 +- .../java/mojang/MojangJavaDownloadTask.java | 2 +- .../java/mojang/MojangJavaRemoteFiles.java | 11 ++++++++++- .../java/mojang/MojangJavaRemoteVersion.java | 14 +++++++++++--- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java index da376aff432..8910cb05e59 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/java/HMCLJavaRepository.java @@ -168,7 +168,7 @@ public Task getDownloadJavaTask(DownloadProvider downloadProvider, update.put("component", gameJavaVersion.component()); Map files = new LinkedHashMap<>(); - result.remoteFiles().files().forEach((path, file) -> { + result.remoteFiles().getFiles().forEach((path, file) -> { if (file instanceof MojangJavaRemoteFiles.RemoteFile) { DownloadInfo downloadInfo = ((MojangJavaRemoteFiles.RemoteFile) file).getDownloads().get("raw"); if (downloadInfo != null) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java index 2f6cb97f6d9..f790813ecbd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaDownloadTask.java @@ -85,7 +85,7 @@ public Collection> getDependents() { @Override public void execute() throws Exception { - for (Map.Entry entry : javaDownloadsTask.getResult().files().entrySet()) { + for (Map.Entry entry : javaDownloadsTask.getResult().getFiles().entrySet()) { Path dest = tempDir.resolve(entry.getKey()); if (entry.getValue() instanceof MojangJavaRemoteFiles.RemoteFile file) { // Use local file if it already exists diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java index ec33129ddcb..bc6052d169a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteFiles.java @@ -24,7 +24,16 @@ import java.util.Collections; import java.util.Map; -public record MojangJavaRemoteFiles(Map files) { +public final class MojangJavaRemoteFiles { + private final Map files; + + public MojangJavaRemoteFiles(Map files) { + this.files = files; + } + + public Map getFiles() { + return files; + } @JsonType( property = "type", diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java index b4385175dcd..5e1a3c23bf0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/java/mojang/MojangJavaRemoteVersion.java @@ -19,12 +19,20 @@ import org.jackhuang.hmcl.download.java.JavaRemoteVersion; import org.jackhuang.hmcl.game.GameJavaVersion; -import org.jetbrains.annotations.NotNull; /** * @author Glavo */ -public record MojangJavaRemoteVersion(GameJavaVersion gameJavaVersion) implements JavaRemoteVersion { +public final class MojangJavaRemoteVersion implements JavaRemoteVersion { + private final GameJavaVersion gameJavaVersion; + + public MojangJavaRemoteVersion(GameJavaVersion gameJavaVersion) { + this.gameJavaVersion = gameJavaVersion; + } + + public GameJavaVersion getGameJavaVersion() { + return gameJavaVersion; + } @Override public int getJdkVersion() { @@ -42,7 +50,7 @@ public String getDistributionVersion() { } @Override - public @NotNull String toString() { + public String toString() { return "MojangJavaRemoteVersion[gameJavaVersion=" + gameJavaVersion + "]"; } } From 45a450ef94ca890b121698d7e82b9f31118e7df3 Mon Sep 17 00:00:00 2001 From: ToobLac Date: Tue, 30 Jun 2026 21:05:57 +0800 Subject: [PATCH 3/3] update --- .../hmcl/download/forge/ForgeInstallProfile.java | 10 ---------- .../liteloader/LiteLoaderGameVersions.java | 15 --------------- .../hmcl/modpack/mcbbs/McbbsModpackManifest.java | 10 ---------- 3 files changed, 35 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java index fe1ee16da3a..f93921da2dd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallProfile.java @@ -31,16 +31,6 @@ public record ForgeInstallProfile(@SerializedName("install") ForgeInstall install, @SerializedName("versionInfo") Version versionInfo) implements Validation { - @Override - public ForgeInstall install() { - return install; - } - - @Override - public Version versionInfo() { - return versionInfo; - } - @Override public void validate() throws JsonParseException { if (install == null) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java index 2d2128070e0..16d681d5e42 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/liteloader/LiteLoaderGameVersions.java @@ -37,19 +37,4 @@ public LiteLoaderGameVersions() { this(null, null, null); } - @Override - public LiteLoaderRepository repoitory() { - return repoitory; - } - - @Override - public LiteLoaderBranch artifacts() { - return artifacts; - } - - @Override - public LiteLoaderBranch snapshots() { - return snapshots; - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java index 6c006f54f0e..b3412b819a8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/mcbbs/McbbsModpackManifest.java @@ -95,16 +95,6 @@ public record Settings(@SerializedName("install_mods") boolean installMods, public Settings() { this(true, true); } - - @Override - public boolean installMods() { - return installMods; - } - - @Override - public boolean installResourcepack() { - return installResourcepack; - } } @JsonType(