From d26c32d83f49835701b3812abe33ebf96fd9c3e4 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Wed, 30 Sep 2020 20:56:05 +0200 Subject: [PATCH] config: fix config creation bug --- .../java/de/bixilon/minosoft/Minosoft.java | 4 +- .../minosoft/config/Configuration.java | 70 ++++++++++++------- .../de/bixilon/minosoft/gui/main/Server.java | 5 +- .../minosoft/gui/main/SettingsWindow.java | 3 +- .../util/mojang/api/MojangAccount.java | 5 +- 5 files changed, 52 insertions(+), 35 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/Minosoft.java b/src/main/java/de/bixilon/minosoft/Minosoft.java index d565a34f0..22f7d7ebf 100644 --- a/src/main/java/de/bixilon/minosoft/Minosoft.java +++ b/src/main/java/de/bixilon/minosoft/Minosoft.java @@ -115,7 +115,7 @@ public class Minosoft { public static void checkClientToken() { if (config.getString(GameConfiguration.CLIENT_TOKEN) == null || config.getString(GameConfiguration.CLIENT_TOKEN).equals("randomGenerated")) { config.putString(GameConfiguration.CLIENT_TOKEN, UUID.randomUUID().toString()); - config.saveToFile(Config.configFileName); + config.saveToFile(); } } @@ -135,7 +135,7 @@ public class Minosoft { if (account == null) { selectedAccount = null; config.putString(GameConfiguration.ACCOUNT_SELECTED, null); - config.saveToFile(Config.configFileName); + config.saveToFile(); return; } MojangAccount.RefreshStates refreshState = account.refreshToken(); diff --git a/src/main/java/de/bixilon/minosoft/config/Configuration.java b/src/main/java/de/bixilon/minosoft/config/Configuration.java index 9b8cbb6de..2870d5a9d 100644 --- a/src/main/java/de/bixilon/minosoft/config/Configuration.java +++ b/src/main/java/de/bixilon/minosoft/config/Configuration.java @@ -29,6 +29,7 @@ import java.util.UUID; public class Configuration { final LinkedHashMap config; + final Thread thread; public Configuration(String filename) throws IOException { @@ -47,7 +48,48 @@ public class Configuration { file = new File(Config.homeDir + "config/" + filename); } Yaml yml = new Yaml(); - config = yml.load(new FileInputStream(file)); + FileInputStream inputStream = new FileInputStream(file); + config = yml.load(inputStream); + inputStream.close(); + + final File finalFile = file; + thread = new Thread(() -> { + while (true) { + // wait for interrupt + try { + Thread.sleep(Integer.MAX_VALUE); + } catch (InterruptedException ignored) { + } + // write config to temp file, delete original config, rename temp file to original file to avoid conflicts if minosoft gets closed while saving the config + File tempFile = new File(Config.homeDir + "config/" + filename + ".tmp"); + Yaml yaml = new Yaml(); + FileWriter writer; + try { + writer = new FileWriter(tempFile); + } catch (IOException e) { + e.printStackTrace(); + return; + } + synchronized (config) { + yaml.dump(config, writer); + } + try { + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + if (finalFile.exists()) { + finalFile.delete(); + } + if (!tempFile.renameTo(finalFile)) { + Log.fatal("An error occurred while saving the config file"); + } else { + Log.verbose(String.format("Configuration saved to file %s", filename)); + } + } + }); + thread.setName("IO-Thread"); + thread.start(); } public boolean getBoolean(String path) { @@ -171,30 +213,8 @@ public class Configuration { config.remove(path); } - public void saveToFile(String filename) { - Thread thread = new Thread(() -> { - // write config to temp file, delete original config, rename temp file to original file to avoid conflicts if minosoft gets closed while saving the config - File tempFile = new File(Config.homeDir + "config/" + filename + ".tmp"); - File file = new File(Config.homeDir + "config/" + filename); - Yaml yaml = new Yaml(); - FileWriter writer; - try { - writer = new FileWriter(tempFile); - } catch (IOException e) { - e.printStackTrace(); - return; - } - synchronized (config) { - yaml.dump(config, writer); - } - if (!file.delete() || !tempFile.renameTo(file)) { - Log.fatal("An error occurred while saving the config file"); - } else { - Log.verbose(String.format("Configuration saved to file %s", filename)); - } - }); - thread.setName("IO-Thread"); - thread.start(); + public void saveToFile() { + thread.interrupt(); } public HashBiMap getMojangAccounts() { diff --git a/src/main/java/de/bixilon/minosoft/gui/main/Server.java b/src/main/java/de/bixilon/minosoft/gui/main/Server.java index 0cc1f91cf..abdb12646 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/Server.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/Server.java @@ -13,7 +13,6 @@ package de.bixilon.minosoft.gui.main; -import de.bixilon.minosoft.Config; import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.protocol.ConnectionReasons; @@ -95,12 +94,12 @@ public class Server { public void saveToConfig() { Minosoft.getConfig().putServer(this); - Minosoft.getConfig().saveToFile(Config.configFileName); + Minosoft.getConfig().saveToFile(); } public void delete() { Minosoft.getConfig().removeServer(this); - Minosoft.getConfig().saveToFile(Config.configFileName); + Minosoft.getConfig().saveToFile(); } public Connection getLastPing() { diff --git a/src/main/java/de/bixilon/minosoft/gui/main/SettingsWindow.java b/src/main/java/de/bixilon/minosoft/gui/main/SettingsWindow.java index bd382f45f..65a29ca27 100644 --- a/src/main/java/de/bixilon/minosoft/gui/main/SettingsWindow.java +++ b/src/main/java/de/bixilon/minosoft/gui/main/SettingsWindow.java @@ -13,7 +13,6 @@ package de.bixilon.minosoft.gui.main; -import de.bixilon.minosoft.Config; import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.config.GameConfiguration; import de.bixilon.minosoft.logging.Log; @@ -43,7 +42,7 @@ public class SettingsWindow implements Initializable { } Log.setLevel(newLevel); Minosoft.getConfig().putString(GameConfiguration.GENERAL_LOG_LEVEL, newLevel.name()); - Minosoft.getConfig().saveToFile(Config.configFileName); + Minosoft.getConfig().saveToFile(); })); } } diff --git a/src/main/java/de/bixilon/minosoft/util/mojang/api/MojangAccount.java b/src/main/java/de/bixilon/minosoft/util/mojang/api/MojangAccount.java index def15d439..697b6d059 100644 --- a/src/main/java/de/bixilon/minosoft/util/mojang/api/MojangAccount.java +++ b/src/main/java/de/bixilon/minosoft/util/mojang/api/MojangAccount.java @@ -14,7 +14,6 @@ package de.bixilon.minosoft.util.mojang.api; import com.google.gson.JsonObject; -import de.bixilon.minosoft.Config; import de.bixilon.minosoft.Minosoft; import de.bixilon.minosoft.util.Util; @@ -92,7 +91,7 @@ public class MojangAccount { public void saveToConfig() { Minosoft.getConfig().putMojangAccount(this); - Minosoft.getConfig().saveToFile(Config.configFileName); + Minosoft.getConfig().saveToFile(); } @Override @@ -103,7 +102,7 @@ public class MojangAccount { public void delete() { Minosoft.getAccountList().remove(this.getUserId()); Minosoft.getConfig().removeAccount(this); - Minosoft.getConfig().saveToFile(Config.configFileName); + Minosoft.getConfig().saveToFile(); } @Override