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 3c531b0dd6..24d75df0e3 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/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index b9507b84c9..e5c32eee12 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 @@ -485,7 +485,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()); @@ -576,7 +576,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 e7bb8328d4..cec8ff477d 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 @@ -40,13 +40,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 +118,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 +138,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 +162,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 +185,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 +209,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 +250,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 +282,15 @@ 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 +304,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 893f508073..a9f78b8950 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 ab6c9d4aec..b23361ed87 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/addon/LocalAddonFile.java @@ -20,13 +20,13 @@ 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; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /// Sub-classes should implement `Comparable` @@ -63,26 +63,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<>(List.of(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,25 +82,14 @@ 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 Part(String text) { - this(text, ""); - } - - public Part(String text, String color) { - this.text = Objects.requireNonNull(text); - this.color = Objects.requireNonNull(color); - } + public record Part(String text, String color) { - public String getText() { - return text; + public Part { + if (text == null || color == null) throw new NullPointerException(); } - public String getColor() { - return color; + public Part(String text) { + this(text, ""); } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LibrariesDownloadInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LibrariesDownloadInfo.java index f14b1ebfa4..a578bee5ef 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LibrariesDownloadInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/LibrariesDownloadInfo.java @@ -19,8 +19,6 @@ import org.jackhuang.hmcl.util.Immutable; -import java.util.Collections; -import java.util.HashMap; import java.util.Map; /** @@ -28,26 +26,14 @@ * @author huangyuhui */ @Immutable -public final class LibrariesDownloadInfo { +public record LibrariesDownloadInfo(LibraryDownloadInfo artifact, Map classifiers) { - private final LibraryDownloadInfo artifact; - private final Map classifiers; + public LibrariesDownloadInfo { + classifiers = classifiers == null ? Map.of() : Map.copyOf(classifiers); + } public LibrariesDownloadInfo(LibraryDownloadInfo artifact) { this(artifact, null); } - public LibrariesDownloadInfo(LibraryDownloadInfo artifact, Map classifiers) { - this.artifact = artifact; - this.classifiers = classifiers == null ? null : new HashMap<>(classifiers); - } - - public LibraryDownloadInfo getArtifact() { - return artifact; - } - - public Map getClassifiers() { - return classifiers == null ? Collections.emptyMap() : Collections.unmodifiableMap(classifiers); - } - } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java index dc253ca8e3..3a60986da3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -134,9 +134,9 @@ public String getClassifier() { return nd.replace("${arch}", Architecture.SYSTEM_ARCH.getBits().getBit()); } } - } else if (downloads != null && downloads.getClassifiers() != null) { + } else if (downloads != null && downloads.classifiers() != null) { for (String nativeDescriptor : POSSIBLE_NATIVE_DESCRIPTORS) { - LibraryDownloadInfo info = downloads.getClassifiers().get(nativeDescriptor); + LibraryDownloadInfo info = downloads.classifiers().get(nativeDescriptor); if (info != null) { return nativeDescriptor; } @@ -165,15 +165,15 @@ public boolean isNative() { return true; } - return downloads != null && downloads.getClassifiers().keySet().stream().anyMatch(s -> s.startsWith("native")); + return downloads != null && downloads.classifiers().keySet().stream().anyMatch(s -> s.startsWith("native")); } public LibraryDownloadInfo getRawDownloadInfo() { if (downloads != null) { if (isNative()) - return downloads.getClassifiers().get(getClassifier()); + return downloads.classifiers().get(getClassifier()); else - return downloads.getArtifact(); + return downloads.artifact(); } else { return null; }