From f330cc954cb0febca47821177e8ba3234190729e Mon Sep 17 00:00:00 2001 From: Auxilor Date: Tue, 22 Mar 2022 14:01:18 +0000 Subject: [PATCH] Added ConfigBuilder and more TransientConfig constructors --- .../willfp/eco/core/config/ConfigBuilder.java | 29 +++++++++ .../eco/core/config/TransientConfig.java | 59 ++++++++++++++++++- .../eco/core/config/interfaces/Config.java | 10 ++++ .../core/config/wrapper/ConfigFactory.java | 4 +- .../eco/internal/config/EcoConfigFactory.kt | 3 +- 5 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 eco-api/src/main/java/com/willfp/eco/core/config/ConfigBuilder.java diff --git a/eco-api/src/main/java/com/willfp/eco/core/config/ConfigBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/config/ConfigBuilder.java new file mode 100644 index 00000000..d41587e9 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/config/ConfigBuilder.java @@ -0,0 +1,29 @@ +package com.willfp.eco.core.config; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Builder for configs to create them programmatically. + */ +public class ConfigBuilder extends TransientConfig { + /** + * Create a new empty config builder. + */ + public ConfigBuilder() { + super(); + } + + /** + * Add to the config builder. + * + * @param path The path. + * @param object The object. + * @return The builder. + */ + public ConfigBuilder add(@NotNull final String path, + @Nullable final Object object) { + set(path, object); + return this; + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/config/TransientConfig.java b/eco-api/src/main/java/com/willfp/eco/core/config/TransientConfig.java index fb70d740..b038b783 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/config/TransientConfig.java +++ b/eco-api/src/main/java/com/willfp/eco/core/config/TransientConfig.java @@ -3,12 +3,16 @@ package com.willfp.eco.core.config; import com.willfp.eco.core.Eco; import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.wrapper.ConfigWrapper; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.file.Files; import java.util.Map; /** @@ -18,9 +22,9 @@ import java.util.Map; */ public class TransientConfig extends ConfigWrapper { /** - * @param config The YamlConfiguration handle. + * @param config The ConfigurationSection handle. */ - public TransientConfig(@NotNull final YamlConfiguration config) { + public TransientConfig(@NotNull final ConfigurationSection config) { super(Eco.getHandler().getConfigFactory().createConfig(config)); } @@ -33,6 +37,25 @@ public class TransientConfig extends ConfigWrapper { )) : new TransientConfig()); } + /** + * @param file The File. + */ + public TransientConfig(@Nullable final File file) { + super(file != null ? Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration( + file + )) : new TransientConfig()); + } + + /** + * @param file The file. + * @param type The config type to try read from. + */ + public TransientConfig(@Nullable final File file, + @NotNull final ConfigType type) { + super(file != null ? Eco.getHandler().getConfigFactory().createConfig(readFile(file), type) + : new TransientConfig()); + } + /** * Create a new empty transient config. * @@ -42,6 +65,20 @@ public class TransientConfig extends ConfigWrapper { super(Eco.getHandler().getConfigFactory().createConfig(values)); } + /** + * Create a new empty transient config. + * + * @param values The values. + * @param type The type. + */ + public TransientConfig(@NotNull final Map values, + @NotNull final ConfigType type) { + super( + type == ConfigType.JSON ? Eco.getHandler().getConfigFactory().createConfig(values) + : new TransientConfig(Eco.getHandler().getConfigFactory().createConfig(values).toBukkit()) + ); + } + /** * Create a new empty transient config. */ @@ -57,4 +94,22 @@ public class TransientConfig extends ConfigWrapper { @NotNull final ConfigType type) { super(Eco.getHandler().getConfigFactory().createConfig(contents, type)); } + + /** + * Read a file to a string. + * + * @param file The file. + * @return The string. + */ + private static String readFile(@Nullable final File file) { + if (file == null) { + return ""; + } + + try { + return Files.readString(file.toPath()); + } catch (IOException e) { + return ""; + } + } } diff --git a/eco-api/src/main/java/com/willfp/eco/core/config/interfaces/Config.java b/eco-api/src/main/java/com/willfp/eco/core/config/interfaces/Config.java index 60ab0845..37eb70ed 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/config/interfaces/Config.java +++ b/eco-api/src/main/java/com/willfp/eco/core/config/interfaces/Config.java @@ -1,5 +1,6 @@ package com.willfp.eco.core.config.interfaces; +import com.willfp.eco.core.config.ConfigBuilder; import com.willfp.eco.core.config.ConfigType; import com.willfp.eco.core.config.TransientConfig; import com.willfp.eco.core.placeholder.PlaceholderInjectable; @@ -672,4 +673,13 @@ public interface Config extends Cloneable, PlaceholderInjectable { empty.createSection("temp", this.toMap()); return empty.getConfigurationSection("temp"); } + + /** + * Create a new config builder. + * + * @return The builder. + */ + static ConfigBuilder builder() { + return new ConfigBuilder(); + } } diff --git a/eco-api/src/main/java/com/willfp/eco/core/config/wrapper/ConfigFactory.java b/eco-api/src/main/java/com/willfp/eco/core/config/wrapper/ConfigFactory.java index 608a6a71..6d01e988 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/config/wrapper/ConfigFactory.java +++ b/eco-api/src/main/java/com/willfp/eco/core/config/wrapper/ConfigFactory.java @@ -5,7 +5,7 @@ import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.config.ConfigType; import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.LoadableConfig; -import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -59,7 +59,7 @@ public interface ConfigFactory { * @param config The handle. * @return The config implementation. */ - Config createConfig(@NotNull YamlConfiguration config); + Config createConfig(@NotNull ConfigurationSection config); /** * Create config. diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/config/EcoConfigFactory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/config/EcoConfigFactory.kt index 55ca8374..9ff6730f 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/config/EcoConfigFactory.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/config/EcoConfigFactory.kt @@ -12,11 +12,12 @@ import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection +import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.file.YamlConfiguration import java.io.StringReader object EcoConfigFactory : ConfigFactory { - override fun createConfig(config: YamlConfiguration): Config { + override fun createConfig(config: ConfigurationSection): Config { return EcoYamlConfigSection(config) }