From d2928b4a04ae22b1a21938df0fa254a5d062adb5 Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Wed, 4 Aug 2021 16:25:30 +0200 Subject: [PATCH] Refactor ServerUtilsConfig#set to delete existing objects at path --- .../bukkit/entities/BukkitYamlConfig.java | 7 ++++- .../bungee/entities/BungeeYamlConfig.java | 15 ++++++++-- .../serverutils/common/config/JsonConfig.java | 16 ++++++++++- .../common/config/ServerUtilsConfig.java | 28 +++++++++++++++++-- .../velocity/entities/VelocityTomlConfig.java | 22 +++++---------- 5 files changed, 67 insertions(+), 21 deletions(-) diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitYamlConfig.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitYamlConfig.java index 4788e30..1a35bff 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitYamlConfig.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/entities/BukkitYamlConfig.java @@ -54,10 +54,15 @@ public class BukkitYamlConfig implements ServerUtilsConfig { } @Override - public void set(String path, Object value) { + public void setUnsafe(String path, Object value) { config.set(path, value); } + @Override + public void remove(String path) { + config.set(path, null); + } + @Override public String getString(String path) { return config.getString(path); diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeeYamlConfig.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeeYamlConfig.java index 0e612de..a8569af 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeeYamlConfig.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/entities/BungeeYamlConfig.java @@ -33,7 +33,13 @@ public class BungeeYamlConfig implements ServerUtilsConfig { @Override public Object get(String path) { - Object obj = config.get(path); + Object obj; + try { + obj = config.get(path); + } catch (ClassCastException ignored) { + return null; + } + if (obj instanceof Configuration) { return new BungeeYamlConfig((Configuration) obj); } @@ -61,10 +67,15 @@ public class BungeeYamlConfig implements ServerUtilsConfig { } @Override - public void set(String path, Object value) { + public void setUnsafe(String path, Object value) { config.set(path, value); } + @Override + public void remove(String path) { + config.set(path, null); + } + @Override public String getString(String path) { return config.getString(path); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/config/JsonConfig.java b/Common/src/main/java/net/frankheijden/serverutils/common/config/JsonConfig.java index 81437cc..f7cf6de 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/config/JsonConfig.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/config/JsonConfig.java @@ -137,7 +137,7 @@ public class JsonConfig implements ServerUtilsConfig { } @Override - public void set(String path, Object value) { + public void setUnsafe(String path, Object value) { int lastDotIndex = path.lastIndexOf('.'); String memberName = path; @@ -158,6 +158,20 @@ public class JsonConfig implements ServerUtilsConfig { jsonObject.add(memberName, gson.toJsonTree(value)); } + @Override + public void remove(String path) { + int lastDotIndex = path.lastIndexOf('.'); + + JsonObject object; + if (lastDotIndex == -1) { + object = config; + } else { + object = ((JsonConfig) get(path.substring(0, lastDotIndex))).config; + } + + object.remove(path.substring(lastDotIndex + 1)); + } + @Override public String getString(String path) { JsonElement element = getJsonElement(path); diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/config/ServerUtilsConfig.java b/Common/src/main/java/net/frankheijden/serverutils/common/config/ServerUtilsConfig.java index 028f4b3..4789ec2 100644 --- a/Common/src/main/java/net/frankheijden/serverutils/common/config/ServerUtilsConfig.java +++ b/Common/src/main/java/net/frankheijden/serverutils/common/config/ServerUtilsConfig.java @@ -40,7 +40,31 @@ public interface ServerUtilsConfig { * @param path The path. * @param value The object to set the path's value to. */ - void set(String path, Object value); + default void set(String path, Object value) { + if (value == null) { + remove(path); + } else { + String pathSegment = path; + + int lastDotIndex; + while ((lastDotIndex = pathSegment.lastIndexOf('.')) != -1) { + String parentPath = path.substring(0, lastDotIndex); + if (!(get(parentPath) instanceof ServerUtilsConfig)) { + remove(parentPath); + } + pathSegment = parentPath; + } + + setUnsafe(path, value); + } + } + + void setUnsafe(String path, Object value); + + /** + * Removes a path. + */ + void remove(String path); /** * Retrieves a string from a path. @@ -122,7 +146,7 @@ public interface ServerUtilsConfig { String defKey = (root.isEmpty() ? "" : root + ".") + key; Object value = conf.get(key); if (def.get(defKey) == null) { - conf.set(key, null); + conf.remove(key); } else if (value instanceof ServerUtilsConfig) { removeOldKeys(def, (ServerUtilsConfig) value, defKey); } diff --git a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityTomlConfig.java b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityTomlConfig.java index a19c619..296e47c 100644 --- a/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityTomlConfig.java +++ b/Velocity/src/main/java/net/frankheijden/serverutils/velocity/entities/VelocityTomlConfig.java @@ -56,21 +56,13 @@ public class VelocityTomlConfig implements ServerUtilsConfig { } @Override - public void set(String path, Object value) { - if (value == null) { - config.remove(path); - } else { - int lastDotIndex = path.lastIndexOf('.'); - if (lastDotIndex != -1) { - String parentPath = path.substring(0, lastDotIndex); - try { - CommentedConfig parent = config.get(parentPath); - } catch (ClassCastException ex) { - config.remove(parentPath); - } - } - config.set(path, value); - } + public void setUnsafe(String path, Object value) { + config.set(path, value); + } + + @Override + public void remove(String path) { + config.remove(path); } @Override