From 2705cb679ea0ba8a0dccd56806011c27e441e497 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 28 Sep 2025 16:14:22 -0500 Subject: [PATCH] minor config handler refactoring --- .../core/config/ConfigBase.java | 127 ++++++++++-------- ...leHandling.java => ConfigFileHandler.java} | 28 ++-- .../core/config/types/ConfigEntry.java | 7 +- 3 files changed, 92 insertions(+), 70 deletions(-) rename core/src/main/java/com/seibel/distanthorizons/core/config/file/{ConfigFileHandling.java => ConfigFileHandler.java} (92%) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/ConfigBase.java b/core/src/main/java/com/seibel/distanthorizons/core/config/ConfigBase.java index ebc3378dc..5639298cb 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/ConfigBase.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/ConfigBase.java @@ -19,44 +19,38 @@ package com.seibel.distanthorizons.core.config; -import com.seibel.distanthorizons.core.config.file.ConfigFileHandling; +import com.seibel.distanthorizons.core.config.file.ConfigFileHandler; import com.seibel.distanthorizons.core.config.types.*; -import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.config.ILangWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; +import com.seibel.distanthorizons.coreapi.ModInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; import java.nio.file.Path; import java.util.*; /** - * Indexes and sets everything up for the file handling and gui + * Indexes and sets everything up for the file handling and gui. + * This should be init after singletons have been bound * * @author coolGi * @author Ran * @version 2023-8-26 */ -// Init the config after singletons have been bound public class ConfigBase { /** Our own config instance, don't modify unless you are the DH mod */ public static ConfigBase INSTANCE; - public ConfigFileHandling configFileINSTANCE; - - private final Logger logger; - public final String modID; - public final String modName; - public final int configVersion; - - public boolean isLoaded = false; - + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); /** - * What the config works with + * What the config works with *
*
{@link Enum} *
{@link Boolean} @@ -75,61 +69,74 @@ public class ConfigBase *
Map *
HashMap */ - public static final List> acceptableInputs = new ArrayList>() + public static final List> ACCEPTABLE_INPUTS = new ArrayList>() {{ - add(Boolean.class); - add(Byte.class); - add(Integer.class); - add(Double.class); - add(Short.class); - add(Long.class); - add(Float.class); - add(String.class); + this.add(Boolean.class); + this.add(Byte.class); + this.add(Integer.class); + this.add(Double.class); + this.add(Short.class); + this.add(Long.class); + this.add(Float.class); + this.add(String.class); // TODO[CONFIG]: Check the type of these is valid - add(List.class); - add(ArrayList.class); - add(Map.class); - add(HashMap.class); + this.add(List.class); + this.add(ArrayList.class); + this.add(Map.class); + this.add(HashMap.class); }}; + + + public ConfigFileHandler configFileHandler; + + public final int configVersion; + + public boolean isLoaded = false; + /** Disables the minimum and maximum of any variable */ public boolean disableMinMax = false; // Very fun to use, but should always be disabled by default public final List> entries = new ArrayList<>(); - public ConfigBase(String modID, String modName, Class configClass) + + //=============// + // constructor // + //=============// + + public static void RunFirstTimeSetup() { - this(modID, modName, configClass, getConfigPath(modName), -1); - } - public ConfigBase(String modID, String modName, Class configClass, Path configPath) - { - this(modID, modName, configClass, configPath, -1); - } - public ConfigBase(String modID, String modName, Class configClass, int configVersion) - { - this(modID, modName, configClass, getConfigPath(modName), configVersion); + if (INSTANCE != null) + { + LOGGER.debug("ConfigBase setup already run, ignoring."); + return; + } + + INSTANCE = new ConfigBase(Config.class, ModInfo.CONFIG_FILE_VERSION); } - public ConfigBase(String modID, String modName, Class configClass, Path configPath, int configVersion) + private ConfigBase(Class configClass, int configVersion) { - this.logger = LogManager.getLogger(this.getClass().getSimpleName() + ", " + modID); + LOGGER.info("Initialising config for [" + ModInfo.NAME + "]"); - this.logger.info("Initialising config for " + modName); - this.modID = modID; - this.modName = modName; this.configVersion = configVersion; this.initNestedClass(configClass, ""); // Init root category - // File handling (load from file) - this.configFileINSTANCE = new ConfigFileHandling(this, configPath); - this.configFileINSTANCE.loadFromFile(); + Path configPath = getConfigPath(ModInfo.NAME); + this.configFileHandler = new ConfigFileHandler(this, configPath); + this.configFileHandler.loadFromFile(); this.isLoaded = true; - this.logger.info("Config for " + modName + " initialised"); + LOGGER.info("Config for [" + ModInfo.NAME + "] initialised"); + } + /** Gets the default config path given a mod name */ + private static Path getConfigPath(String modName) + { + return SingletonInjector.INSTANCE.get(IMinecraftSharedWrapper.class) + .getInstallationDirectory().toPath().resolve("config").resolve(modName + ".toml"); } - private void initNestedClass(Class configClass, String category) { // Put all the entries in entries @@ -144,7 +151,7 @@ public class ConfigBase } catch (IllegalAccessException exception) { - this.logger.warn(exception); + LOGGER.warn(exception); } AbstractConfigType entry = this.entries.get(this.entries.size() - 1); @@ -153,11 +160,12 @@ public class ConfigBase entry.configBase = this; if (ConfigEntry.class.isAssignableFrom(field.getType())) - { // If item is type ConfigEntry + { + // If item is type ConfigEntry if (!isAcceptableType(entry.getType())) { - this.logger.error("Invalid variable type at [" + (category.isEmpty() ? "" : category + ".") + field.getName() + "]."); - this.logger.error("Type [" + entry.getType() + "] is not one of these types [" + acceptableInputs.toString() + "]"); + LOGGER.error("Invalid variable type at [" + (category.isEmpty() ? "" : category + ".") + field.getName() + "]."); + LOGGER.error("Type [" + entry.getType() + "] is not one of these types [" + ACCEPTABLE_INPUTS.toString() + "]"); this.entries.remove(this.entries.size() - 1); // Delete the entry if it is invalid so the game can still run } } @@ -175,22 +183,21 @@ public class ConfigBase } } } - private static boolean isAcceptableType(Class Clazz) { if (Clazz.isEnum()) + { return true; - return acceptableInputs.contains(Clazz); + } + + return ACCEPTABLE_INPUTS.contains(Clazz); } - /** Gets the default config path given a mod name */ - public static Path getConfigPath(String modName) - { - return SingletonInjector.INSTANCE.get(IMinecraftSharedWrapper.class) - .getInstallationDirectory().toPath().resolve("config").resolve(modName + ".toml"); - } + //===============// + // lang handling // + //===============// /** * Used for checking that all the lang files for the config exist. @@ -306,4 +313,6 @@ public class ConfigBase return generatedLang; } + + } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandler.java similarity index 92% rename from core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java rename to core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandler.java index ee2d12a2a..948b0120d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandling.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/file/ConfigFileHandler.java @@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.config.types.ConfigEntry; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; +import com.seibel.distanthorizons.coreapi.ModInfo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,10 +42,9 @@ import java.util.concurrent.locks.ReentrantLock; * @author coolGi * @version 2023-8-26 */ -public class ConfigFileHandling +public class ConfigFileHandler { private static final Logger LOGGER = DhLoggerBuilder.getLogger(); - private static final IMinecraftSharedWrapper MC_SHARED = SingletonInjector.INSTANCE.get(IMinecraftSharedWrapper.class); public final ConfigBase configBase; @@ -64,9 +64,9 @@ public class ConfigFileHandling // constructor // //=============// - public ConfigFileHandling(ConfigBase configBase, Path configPath) + public ConfigFileHandler(ConfigBase configBase, Path configPath) { - this.logger = LogManager.getLogger(this.getClass().getSimpleName() + ", " + configBase.modID); + this.logger = LogManager.getLogger(this.getClass().getSimpleName() + ", " + ModInfo.ID); this.configBase = configBase; this.configPath = configPath; @@ -80,6 +80,9 @@ public class ConfigFileHandling + //====================// + // entire config file // + //====================// /** Saves the entire config to the file */ public void saveToFile() { this.saveToFile(this.nightConfig); } @@ -161,7 +164,7 @@ public class ConfigFileHandling } else // if (currentCfgVersion < configBase.configVersion) { - this.logger.warn(this.configBase.modName + " config is of an older version, currently there is no config updater... so resetting config"); + this.logger.warn(ModInfo.NAME + " config is of an older version, currently there is no config updater... so resetting config"); try { Files.delete(this.configPath); @@ -223,6 +226,9 @@ public class ConfigFileHandling + //=======================// + // single config entries // + //=======================// // Save an entry when only given the entry public void saveEntry(ConfigEntry entry) @@ -240,7 +246,7 @@ public class ConfigFileHandling else if (entry.getTrueValue() == null) { // TODO when can this happen? - throw new IllegalArgumentException("Entry [" + entry.getNameWCategory() + "] is null, this may be a problem with [" + this.configBase.modName + "]. Please contact the authors."); + throw new IllegalArgumentException("Entry [" + entry.getNameWCategory() + "] is null, this may be a problem with [" + ModInfo.NAME + "]. Please contact the authors."); } workConfig.set(entry.getNameWCategory(), ConfigTypeConverters.attemptToConvertToString(entry.getType(), entry.getTrueValue())); @@ -319,10 +325,12 @@ public class ConfigFileHandling - + //=============// + // nightconfig // + //=============// /** - * Uses {@link ConfigFileHandling#nightConfig} to do {@link CommentedFileConfig#load()} but with error checking + * Uses {@link ConfigFileHandler#nightConfig} to do {@link CommentedFileConfig#load()} but with error checking * * @apiNote This overwrites any value currently stored in the config */ @@ -361,6 +369,10 @@ public class ConfigFileHandling + //===============// + // file handling // + //===============// + public static void reCreateFile(Path path) { try diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java index 1008dfe75..fcf8e41ef 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/types/ConfigEntry.java @@ -21,6 +21,7 @@ package com.seibel.distanthorizons.core.config.types; import com.seibel.distanthorizons.core.config.NumberUtil; +import com.seibel.distanthorizons.core.config.file.ConfigFileHandler; import com.seibel.distanthorizons.core.config.listeners.ConfigChangeListener; import com.seibel.distanthorizons.core.config.listeners.IConfigListener; import com.seibel.distanthorizons.core.config.types.enums.EConfigEntryAppearance; @@ -102,7 +103,7 @@ public class ConfigEntry extends AbstractConfigType> implem /** * DONT USE THIS IN YOUR CODE
* Sets the value without informing the rest of the code (ie, doesnt call listeners, or saves the value).
- * Should only be used when loading the config from the file (in places like the {@link com.seibel.distanthorizons.core.config.file.ConfigFileHandling} or {@link com.seibel.distanthorizons.core.config.ConfigBase}) + * Should only be used when loading the config from the file (in places like the {@link ConfigFileHandler} or {@link com.seibel.distanthorizons.core.config.ConfigBase}) */ public void pureSet(T newValue) { super.set(newValue); @@ -307,9 +308,9 @@ public class ConfigEntry extends AbstractConfigType> implem } /** This should normally not be called since set() automatically calls this */ - public void save() { configBase.configFileINSTANCE.saveEntry(this); } + public void save() { configBase.configFileHandler.saveEntry(this); } /** This should normally not be called except for special circumstances */ - public void load() { configBase.configFileINSTANCE.loadEntry(this); } + public void load() { configBase.configFileHandler.loadEntry(this); } @Override