diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackManager.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackManager.java index cc4d38111..b247a2c01 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackManager.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackManager.java @@ -20,8 +20,7 @@ package org.jackhuang.hmcl.game; import com.google.gson.JsonParseException; import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.util.CompressingUtils; -import org.jackhuang.hmcl.util.Constants; -import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.JsonUtils; import org.jackhuang.hmcl.util.StringUtils; import java.io.File; @@ -82,9 +81,9 @@ public final class HMCLModpackManager { */ public static Modpack readHMCLModpackManifest(File file) throws IOException, JsonParseException { String manifestJson = CompressingUtils.readTextZipEntry(file, "modpack.json"); - Modpack manifest = Lang.requireJsonNonNull(Constants.GSON.fromJson(manifestJson, Modpack.class)); + Modpack manifest = JsonUtils.fromNonNullJson(manifestJson, Modpack.class); String gameJson = CompressingUtils.readTextZipEntry(file, "minecraft/pack.json"); - Version game = Lang.requireJsonNonNull(Constants.GSON.fromJson(gameJson, Version.class)); + Version game = JsonUtils.fromNonNullJson(gameJson, Version.class); if (game.getJar() == null) if (StringUtils.isBlank(manifest.getVersion())) throw new JsonParseException("Cannot recognize the game version of modpack " + file + "."); 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 a79a1ebd1..f12f6a861 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/ModpackHelper.java @@ -106,7 +106,7 @@ public final class ModpackHelper { else throw new IllegalStateException("Unrecognized modpack: " + modpack); } - public static Task getUpdateTask(Profile profile, File zipFile, String name, ModpackConfiguration configuration) throws UnsupportedModpackException, MismatchedModpackTypeException, IOException { + public static Task getUpdateTask(Profile profile, File zipFile, String name, ModpackConfiguration configuration) throws UnsupportedModpackException, MismatchedModpackTypeException, IOException { Modpack modpack = ModpackHelper.readModpackManifest(zipFile); switch (configuration.getType()) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java index dccc1d195..e12700207 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Accounts.java @@ -73,9 +73,8 @@ public final class Accounts { } public static Optional getCurrentCharacter(Map storage) { - Optional properties = Lang.get(storage, "properties", Map.class); - if (!properties.isPresent()) return Optional.empty(); - return Lang.get(properties.get(), "character", String.class); + return Lang.get(storage, "properties", Map.class) + .flatMap(properties -> Lang.get(properties, "character", String.class)); } static String getAccountId(Account account) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java index 047d97f7a..7146156ea 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -69,7 +69,7 @@ public class Settings { { for (Map settings : SETTINGS.getAccounts()) { Optional characterName = Accounts.getCurrentCharacter(settings); - AccountFactory factory = Accounts.ACCOUNT_FACTORY.get(Lang.get(settings, "type", String.class, "")); + AccountFactory factory = Accounts.ACCOUNT_FACTORY.get(Lang.get(settings, "type", String.class, "")); if (factory == null || !characterName.isPresent()) { // unrecognized account type, so remove it. SETTINGS.getAccounts().remove(settings); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java index 6bc4a7c0c..b79465121 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionSetting.java @@ -138,7 +138,7 @@ public final class VersionSetting { permSizeProperty.set(permSize); } - private final ImmediateIntegerProperty maxMemoryProperty = new ImmediateIntegerProperty(this, "maxMemory", (int) OperatingSystem.SUGGESTED_MEMORY); + private final ImmediateIntegerProperty maxMemoryProperty = new ImmediateIntegerProperty(this, "maxMemory", OperatingSystem.SUGGESTED_MEMORY); public ImmediateIntegerProperty maxMemoryProperty() { return maxMemoryProperty; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java index 5d9c8ac1e..36b7b8ca8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/AccountsPage.java @@ -214,19 +214,19 @@ public final class AccountsPage extends StackPane implements DecoratorPage { this.title.set(title); } - public static String accountException(Exception account) { - if (account instanceof InvalidCredentialsException) { + public static String accountException(Exception exception) { + if (exception instanceof InvalidCredentialsException) { return Main.i18n("account.failed.invalid_credentials"); - } else if (account instanceof NoCharacterException) { + } else if (exception instanceof NoCharacterException) { return Main.i18n("account.failed.no_charactor"); - } else if (account instanceof ServerDisconnectException) { + } else if (exception instanceof ServerDisconnectException) { return Main.i18n("account.failed.connect_authentication_server"); - } else if (account instanceof InvalidTokenException) { + } else if (exception instanceof InvalidTokenException) { return Main.i18n("account.failed.invalid_token"); - } else if (account instanceof InvalidPasswordException) { + } else if (exception instanceof InvalidPasswordException) { return Main.i18n("account.failed.invalid_password"); } else { - return account.getClass() + ": " + ((Exception) account).getLocalizedMessage(); + return exception.getClass() + ": " + exception.getLocalizedMessage(); } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java index e7861c399..8eef22adc 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/FXUtils.java @@ -94,19 +94,36 @@ public final class FXUtils { }); } - public static void addListener(Node node, String key, ObservableValue value, Consumer callback) { - ChangeListener listener = (a, b, newValue) -> callback.accept(newValue); - node.getProperties().put(key, new Pair<>(callback, listener)); - value.addListener(listener); + private static class ListenerPair { + ObservableValue value; + ChangeListener listener; + + ListenerPair(ObservableValue value, ChangeListener listener) { + this.value = value; + this.listener = listener; + } + + void bind() { + value.addListener(listener); + } + + void unbind() { + value.removeListener(listener); + } } - public static void removeListener(Node node, String key) { - if (node.getProperties().get(key) instanceof Pair) { - Pair pair = (Pair) node.getProperties().get(key); - if (pair.getValue() instanceof ObservableValue && pair.getKey() instanceof ChangeListener) { - ((ObservableValue) pair.getValue()).removeListener((ChangeListener) pair.getKey()); - } - } + public static void addListener(Node node, String key, ObservableValue value, Consumer callback) { + ListenerPair pair = new ListenerPair<>(value, (a, b, newValue) -> callback.accept(newValue)); + node.getProperties().put(key, pair); + pair.bind(); + } + + public static void removeListener(Node node, String key) { + Lang.convert(node.getProperties().get(key), ListenerPair.class) + .ifPresent(info -> { + info.unbind(); + node.getProperties().remove(key); + }); } public static void setValidateWhileTextChanged(Node field, boolean validate) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/NoneMultipleSelectionModel.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/NoneMultipleSelectionModel.java index 91418fbbc..cbebe3e2c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/NoneMultipleSelectionModel.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/NoneMultipleSelectionModel.java @@ -21,13 +21,9 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.control.MultipleSelectionModel; -public final class NoneMultipleSelectionModel extends MultipleSelectionModel { - private static final NoneMultipleSelectionModel INSTANCE = new NoneMultipleSelectionModel(); - private NoneMultipleSelectionModel() {} +public class NoneMultipleSelectionModel extends MultipleSelectionModel { - @SuppressWarnings("unchecked") - public static NoneMultipleSelectionModel getInstance() { - return (NoneMultipleSelectionModel) INSTANCE; + public NoneMultipleSelectionModel() { } @Override diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java index 0f91804c9..df7073f5a 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/RipplerContainer.java @@ -217,10 +217,12 @@ public class RipplerContainer extends StackPane { private static class StyleableProperties { private static final CssMetaData RIPPLER_FILL = new CssMetaData("-jfx-rippler-fill", StyleConverter.getPaintConverter(), Color.rgb(0, 200, 255)) { + @Override public boolean isSettable(RipplerContainer control) { return control.ripplerFill == null || !control.ripplerFill.isBound(); } + @Override public StyleableProperty getStyleableProperty(RipplerContainer control) { return control.ripplerFillProperty(); } @@ -232,7 +234,7 @@ public class RipplerContainer extends StackPane { } static { - List> styleables = new ArrayList<>(Parent.getClassCssMetaData()); + List> styleables = new ArrayList<>(Node.getClassCssMetaData()); Collections.addAll(styleables, RIPPLER_FILL); STYLEABLES = Collections.unmodifiableList(styleables); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index 5fdb9c969..8686237bf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -44,7 +44,10 @@ public final class ExportWizardProvider implements WizardProvider { @Override public Object finish(Map settings) { - return new HMCLModpackExportTask(profile.getRepository(), version, (List) settings.get(ModpackFileSelectionPage.MODPACK_FILE_SELECTION), + @SuppressWarnings("unchecked") + List whitelist = (List) settings.get(ModpackFileSelectionPage.MODPACK_FILE_SELECTION); + + return new HMCLModpackExportTask(profile.getRepository(), version, whitelist, new Modpack( (String) settings.get(ModpackInfoPage.MODPACK_NAME), (String) settings.get(ModpackInfoPage.MODPACK_AUTHOR), diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java index ee0dbfcad..1f8f1e025 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackFileSelectionPage.java @@ -62,7 +62,7 @@ public final class ModpackFileSelectionPage extends StackPane implements WizardP FXUtils.loadFXML(this, "/assets/fxml/modpack/selection.fxml"); rootNode = getTreeItem(profile.getRepository().getRunDirectory(version), "minecraft"); treeView.setRoot(rootNode); - treeView.setSelectionModel(NoneMultipleSelectionModel.getInstance()); + treeView.setSelectionModel(new NoneMultipleSelectionModel<>()); } private CheckBoxTreeItem getTreeItem(File file, String basePath) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java index 8d36d8e25..a7e60e87f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/AppDataUpgrader.java @@ -56,7 +56,7 @@ public class AppDataUpgrader extends IUpgrader { al.add("--noupdate"); AccessController.doPrivileged((PrivilegedExceptionAction) () -> { new URLClassLoader(new URL[]{jar.toURI().toURL()}, - URLClassLoader.getSystemClassLoader().getParent()).loadClass(mainClass) + ClassLoader.getSystemClassLoader().getParent()).loadClass(mainClass) .getMethod("main", String[].class).invoke(null, new Object[]{al.toArray(new String[0])}); return null; }); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java index 8090c9401..f3c65e610 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/OfflineAccount.java @@ -47,6 +47,7 @@ public class OfflineAccount extends Account { throw new IllegalArgumentException("Username cannot be blank"); } + @Override public UUID getUUID() { return UUIDTypeAdapter.fromString(uuid); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/AuthlibInjectorBuildInfo.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/AuthlibInjectorBuildInfo.java index f27b9650b..0d3ed21f8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/AuthlibInjectorBuildInfo.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/auth/yggdrasil/AuthlibInjectorBuildInfo.java @@ -1,9 +1,8 @@ package org.jackhuang.hmcl.auth.yggdrasil; import com.google.gson.JsonParseException; -import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Immutable; -import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.JsonUtils; import org.jackhuang.hmcl.util.NetworkUtils; import java.io.IOException; @@ -36,7 +35,7 @@ public final class AuthlibInjectorBuildInfo { } public static AuthlibInjectorBuildInfo requestBuildInfo(String updateUrl) throws IOException, JsonParseException { - return Lang.requireJsonNonNull(Constants.GSON.fromJson(NetworkUtils.doGet(NetworkUtils.toURL(updateUrl)), AuthlibInjectorBuildInfo.class)); + return JsonUtils.fromNonNullJson(NetworkUtils.doGet(NetworkUtils.toURL(updateUrl)), AuthlibInjectorBuildInfo.class); } public static final String UPDATE_URL = "https://authlib-injector.to2mbn.org/api/buildInfo"; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index bdf3ae488..bfdcc85e8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -198,7 +198,7 @@ public class DefaultLauncher extends Launcher { } private final Map> forbiddens = Lang.mapOf( - new Pair<>("-Xincgc", () -> options.getJava().getParsedVersion() >= JavaVersion.JAVA_9) + new Pair>("-Xincgc", () -> options.getJava().getParsedVersion() >= JavaVersion.JAVA_9) ); protected Map> getForbiddens() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseManifest.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseManifest.java index 90b9ecab6..1e013dbaf 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseManifest.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/CurseManifest.java @@ -20,15 +20,13 @@ package org.jackhuang.hmcl.mod; import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; import org.jackhuang.hmcl.util.CompressingUtils; -import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Immutable; -import org.jackhuang.hmcl.util.Lang; +import org.jackhuang.hmcl.util.JsonUtils; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; -import java.util.Optional; /** * @@ -120,7 +118,7 @@ public final class CurseManifest { */ public static Modpack readCurseForgeModpackManifest(File f) throws IOException, JsonParseException { String json = CompressingUtils.readTextZipEntry(f, "manifest.json"); - CurseManifest manifest = Lang.requireJsonNonNull(Constants.GSON.fromJson(json, CurseManifest.class)); + CurseManifest manifest = JsonUtils.fromNonNullJson(json, CurseManifest.class); return new Modpack(manifest.getName(), manifest.getAuthor(), manifest.getVersion(), manifest.getMinecraft().getGameVersion(), CompressingUtils.readTextZipEntryQuietly(f, "modlist.html").orElse( "No description"), manifest); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Constants.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Constants.java index 08ac96a2e..5526708e6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Constants.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Constants.java @@ -94,4 +94,8 @@ public final class Constants { public static Predicate falsePredicate() { return s -> false; } + + public static Consumer emptyConsumer() { + return x -> {}; + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateBooleanProperty.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateBooleanProperty.java index af637d310..54ca83039 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateBooleanProperty.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateBooleanProperty.java @@ -48,7 +48,7 @@ public class ImmediateBooleanProperty extends SimpleBooleanProperty { super.unbind(); } - private Consumer listener = Lang.EMPTY_CONSUMER; + private Consumer listener = Constants.emptyConsumer(); private final ChangeListener changeListener = (a, b, newValue) -> listener.accept(newValue); public void setChangedListener(Consumer listener) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateDoubleProperty.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateDoubleProperty.java index eb63b057d..f6937c132 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateDoubleProperty.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateDoubleProperty.java @@ -49,7 +49,7 @@ public class ImmediateDoubleProperty extends SimpleDoubleProperty { super.unbind(); } - private Consumer listener = Lang.EMPTY_CONSUMER; + private Consumer listener = Constants.emptyConsumer(); private final ChangeListener changeListener = (a, b, newValue) -> listener.accept(newValue.doubleValue()); public void setChangedListener(Consumer listener) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateIntegerProperty.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateIntegerProperty.java index 485c2f0be..49c4dea81 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateIntegerProperty.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateIntegerProperty.java @@ -48,7 +48,7 @@ public class ImmediateIntegerProperty extends SimpleIntegerProperty { super.unbind(); } - private Consumer listener = Lang.EMPTY_CONSUMER; + private Consumer listener = Constants.emptyConsumer(); private final ChangeListener changeListener = (a, b, newValue) -> listener.accept(newValue.intValue()); public void setChangedListener(Consumer listener) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateObjectProperty.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateObjectProperty.java index 54361523e..d18f2c559 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateObjectProperty.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ImmediateObjectProperty.java @@ -48,7 +48,7 @@ public class ImmediateObjectProperty extends SimpleObjectProperty { super.unbind(); } - private Consumer listener = Lang.EMPTY_CONSUMER; + private Consumer listener = Constants.emptyConsumer(); private final ChangeListener changeListener = (a, b, newValue) -> listener.accept(newValue); public void setChangedListener(Consumer listener) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JsonUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JsonUtils.java new file mode 100644 index 000000000..de5fe0a0b --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/JsonUtils.java @@ -0,0 +1,15 @@ +package org.jackhuang.hmcl.util; + +import com.google.gson.JsonParseException; + +public final class JsonUtils { + + private JsonUtils() {} + + public static T fromNonNullJson(String json, Class classOfT) throws JsonParseException { + T parsed = Constants.GSON.fromJson(json, classOfT); + if (parsed == null) + throw new JsonParseException("Json object cannot be null."); + return parsed; + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java index c41211ed9..3beebeeec 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/Lang.java @@ -5,8 +5,6 @@ */ package org.jackhuang.hmcl.util; -import com.google.gson.JsonParseException; - import java.util.*; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -22,19 +20,7 @@ public final class Lang { private Lang() { } - public static final Consumer EMPTY_CONSUMER = a -> { - }; - - public static T requireJsonNonNull(T obj) throws JsonParseException { - return requireJsonNonNull(obj, "Json object cannot be null."); - } - - public static T requireJsonNonNull(T obj, String message) throws JsonParseException { - if (obj == null) - throw new JsonParseException(message); - return obj; - } - + @SafeVarargs public static Map mapOf(Pair... pairs) { HashMap map = new HashMap<>(); for (Pair pair : pairs) @@ -42,14 +28,14 @@ public final class Lang { return map; } - public static V getOrPut(Map map, K key, Supplier defaultValue) { + public static V computeIfAbsent(Map map, K key, Supplier computingFunction) { V value = map.get(key); if (value == null) { - V answer = defaultValue.get(); - map.put(key, answer); - return answer; - } else - return value; + V newValue = computingFunction.get(); + map.put(key, newValue); + return newValue; + } + return value; } public static void throwable(Throwable exception) throws E { @@ -230,8 +216,8 @@ public final class Lang { return convert(map.get(key), clazz, defaultValue); } - public static List merge(Collection a, Collection b) { - LinkedList result = new LinkedList<>(); + public static List merge(Collection a, Collection b) { + List result = new ArrayList<>(); if (a != null) result.addAll(a); if (b != null) @@ -239,17 +225,6 @@ public final class Lang { return result; } - public static List merge(Collection a, Collection b, Collection c) { - LinkedList result = new LinkedList<>(); - if (a != null) - result.addAll(a); - if (b != null) - result.addAll(b); - if (c != null) - result.addAll(c); - return result; - } - public static void executeDelayed(Runnable runnable, TimeUnit timeUnit, long timeout, boolean isDaemon) { thread(() -> { try { @@ -322,6 +297,7 @@ public final class Lang { } } + @SafeVarargs public static T nonNull(T... t) { for (T a : t) if (a != null) return a; return null; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java index 6bdc7f104..98806ad3e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/NetworkUtils.java @@ -17,10 +17,6 @@ */ package org.jackhuang.hmcl.util; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.X509TrustManager; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -28,9 +24,6 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.Proxy; import java.net.URL; -import java.security.GeneralSecurityException; -import java.security.SecureRandom; -import java.security.cert.X509Certificate; import java.util.Map; import java.util.Objects; import java.util.function.Supplier; @@ -46,41 +39,6 @@ public final class NetworkUtils { private NetworkUtils() { } - private static final X509TrustManager XTM = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] xcs, String string) { - } - - @Override - public void checkServerTrusted(X509Certificate[] xcs, String string) { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - }; - - private static final HostnameVerifier HNV = (a, b) -> true; - - private static volatile boolean initHttps = false; - - private static synchronized void initHttps() { - if (initHttps) - return; - - initHttps = true; - - System.setProperty("https.protocols", "SSLv3,TLSv1"); - try { - SSLContext c = SSLContext.getInstance("SSL"); - c.init(null, new X509TrustManager[] { XTM }, new SecureRandom()); - HttpsURLConnection.setDefaultSSLSocketFactory(c.getSocketFactory()); - } catch (GeneralSecurityException ignore) { - } - HttpsURLConnection.setDefaultHostnameVerifier(HNV); - } - private static Supplier userAgentSupplier = RandomUserAgent::randomUserAgent; public static String getUserAgent() { @@ -92,7 +50,6 @@ public final class NetworkUtils { } public static HttpURLConnection createConnection(URL url, Proxy proxy) throws IOException { - initHttps(); HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy); connection.setDoInput(true); connection.setUseCaches(false); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/RandomUserAgent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/RandomUserAgent.java index 3795779e1..4aaf3731f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/RandomUserAgent.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/RandomUserAgent.java @@ -3,6 +3,9 @@ package org.jackhuang.hmcl.util; import java.util.HashMap; import java.util.Map; +/** + * Optifine has blocked Java's useragent, so we have to make up one. + */ public class RandomUserAgent { private static final HashMap uaMap = new HashMap<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java index f2eb46ffe..3fb336020 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/ReflectionHelper.java @@ -52,14 +52,14 @@ public final class ReflectionHelper { } PRIMITIVES = Lang.mapOf( - new Pair("byte", Byte.class), - new Pair("short", Short.class), - new Pair("int", Integer.class), - new Pair("long", Long.class), - new Pair("char", Character.class), - new Pair("float", Float.class), - new Pair("double", Double.class), - new Pair("boolean", Boolean.class) + new Pair<>("byte", Byte.class), + new Pair<>("short", Short.class), + new Pair<>("int", Integer.class), + new Pair<>("long", Long.class), + new Pair<>("char", Character.class), + new Pair<>("float", Float.class), + new Pair<>("double", Double.class), + new Pair<>("boolean", Boolean.class) ); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/SimpleMultimap.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/SimpleMultimap.java index 65e3cc6e9..9f83dc2c8 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/SimpleMultimap.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/SimpleMultimap.java @@ -62,7 +62,7 @@ public final class SimpleMultimap { } public Collection get(K key) { - return Lang.getOrPut(map, key, valuer); + return Lang.computeIfAbsent(map, key, valuer); } public void put(K key, V value) {