From e650ffffced4618624dfa04c192e0c4ffd426e40 Mon Sep 17 00:00:00 2001 From: yushijinhun Date: Sun, 29 Jul 2018 12:35:51 +0800 Subject: [PATCH] Initialize ConfigHolder & Settings manually --- .../main/java/org/jackhuang/hmcl/Main.java | 4 +++ .../jackhuang/hmcl/setting/ConfigHolder.java | 30 ++++++++++++++----- .../org/jackhuang/hmcl/setting/Settings.java | 12 +++++++- .../org/jackhuang/hmcl/util/i18n/I18n.java | 17 ++++------- 4 files changed, 43 insertions(+), 20 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java index 273545b80..9197a4a9f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/Main.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/Main.java @@ -32,12 +32,16 @@ import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; import javax.swing.JOptionPane; +import org.jackhuang.hmcl.setting.ConfigHolder; + public final class Main { public static void main(String[] args) { checkJavaFX(); checkDirectoryPath(); checkDSTRootCAX3(); + + ConfigHolder.init(); Launcher.main(args); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java index 5837af89d..46df2666b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/ConfigHolder.java @@ -36,7 +36,9 @@ public final class ConfigHolder { public static final String CONFIG_FILENAME = "hmcl.json"; public static final Path CONFIG_PATH = Paths.get(CONFIG_FILENAME).toAbsolutePath(); - private static Config configInstance = initSettings(); + + private static Config configInstance; + private static boolean initialized; public static Config config() { if (configInstance == null) { @@ -45,10 +47,17 @@ public final class ConfigHolder { return configInstance; } - private static Config upgradeSettings(Config deserialized, Map rawJson) { - if (!rawJson.containsKey("commonDirType")) - deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM); - return deserialized; + public static boolean isInitialized() { + return initialized; + } + + public synchronized static void init() { + if (configInstance != null) { + throw new IllegalStateException("Configuration is already loaded"); + } + configInstance = initSettings(); + Settings.init(); + initialized = true; } private static Config initSettings() { @@ -59,13 +68,13 @@ public final class ConfigHolder { Map raw = new Gson().fromJson(json, Map.class); Config deserialized = Config.fromJson(json); if (deserialized == null) { - LOG.finer("Settings file is empty, use the default settings."); + LOG.finer("Config file is empty, use the default config."); } else { - config = upgradeSettings(deserialized, raw); + config = upgradeConfig(deserialized, raw); } LOG.finest("Initialized settings."); } catch (IOException | JsonParseException e) { - LOG.log(Level.WARNING, "Something happened wrongly when load settings.", e); + LOG.log(Level.WARNING, "Something went wrong when loading config.", e); } } return config; @@ -80,4 +89,9 @@ public final class ConfigHolder { } } + private static Config upgradeConfig(Config deserialized, Map rawJson) { + if (!rawJson.containsKey("commonDirType")) + deserialized.setCommonDirType(deserialized.getCommonDirectory().equals(Settings.getDefaultCommonDirectory()) ? EnumCommonDirectory.DEFAULT : EnumCommonDirectory.CUSTOM); + return deserialized; + } } 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 fd21827b7..f95e4b189 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/Settings.java @@ -34,12 +34,22 @@ import static org.jackhuang.hmcl.setting.ConfigHolder.config; public class Settings { - private static Settings instance = new Settings(); + private static Settings instance; public static Settings instance() { + if (instance == null) { + throw new IllegalStateException("Settings hasn't been initialized"); + } return instance; } + /** + * Should be called from {@link ConfigHolder#init()}. + */ + static void init() { + instance = new Settings(); + } + private final boolean firstLaunch; private Settings() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java index ba9ee2762..b3f8ba8d5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/util/i18n/I18n.java @@ -23,24 +23,19 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.logging.Level; +import org.jackhuang.hmcl.setting.ConfigHolder; import org.jackhuang.hmcl.setting.Settings; public final class I18n { private I18n() {} - private static ResourceBundle RESOURCE_BUNDLE = null; - - static { - try { - RESOURCE_BUNDLE = Settings.instance().getLocale().getResourceBundle(); - } catch (Throwable e) { - LOG.log(Level.SEVERE, "Settings cannot be initialized", e); - } - } - public static ResourceBundle getResourceBundle() { - return RESOURCE_BUNDLE == null ? Locales.DEFAULT.getResourceBundle() : RESOURCE_BUNDLE; + if (ConfigHolder.isInitialized()) { + return Settings.instance().getLocale().getResourceBundle(); + } else { + return Locales.DEFAULT.getResourceBundle(); + } } public static String i18n(String key, Object... formatArgs) {