From abe2cc5bb0e6ab42ca934417c85b9d810e6bb12a Mon Sep 17 00:00:00 2001 From: Dominik Suliga Date: Tue, 25 Aug 2026 10:31:03 +0200 Subject: [PATCH] fix(config): load and bind the injected config instance --- .../playtime/core/config/ConfigFactory.java | 11 ++++++++++- .../playtime/core/config/ConfigService.java | 16 ++++++++++++++-- .../processors/ConfigFileProcessor.java | 16 ++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigFactory.java b/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigFactory.java index 9a6b0a2..3399f59 100644 --- a/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigFactory.java +++ b/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigFactory.java @@ -15,5 +15,14 @@ T instantiate(Class type) { ); } } -} + T initialize(T config) { + try { + return ConfigManager.initialize(config); + } catch (OkaeriException e) { + throw new ConfigCreateException( + "Failed to initialize config: " + config.getClass().getName(), e + ); + } + } +} diff --git a/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigService.java b/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigService.java index 9b2ee65..7c694ab 100644 --- a/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigService.java +++ b/playtime-core/src/main/java/com/github/imdmk/playtime/core/config/ConfigService.java @@ -35,13 +35,25 @@ public ConfigService(File dataFolder) { } public C create(Class type) { - C config = factory.instantiate(type); + return adopt(factory.instantiate(type)); + } + + /** + * Binds an already existing config instance to its file, loads it and registers it. + *

+ * This must be used for instances that are shared with other components (e.g. created + * by the dependency injector), otherwise those components would keep an unloaded + * instance holding only the hardcoded defaults. + */ + public C adopt(C config) { + factory.initialize(config); + File file = new File(dataFolder, config.fileName()); configurer.configure(config, file, config.serdesPack()); lifecycle.initialize(config); - register(type, config); + register(config.getClass(), config); return config; } diff --git a/playtime-core/src/main/java/com/github/imdmk/playtime/core/injector/processor/processors/ConfigFileProcessor.java b/playtime-core/src/main/java/com/github/imdmk/playtime/core/injector/processor/processors/ConfigFileProcessor.java index 3d908ee..3476672 100644 --- a/playtime-core/src/main/java/com/github/imdmk/playtime/core/injector/processor/processors/ConfigFileProcessor.java +++ b/playtime-core/src/main/java/com/github/imdmk/playtime/core/injector/processor/processors/ConfigFileProcessor.java @@ -5,6 +5,7 @@ import com.github.imdmk.playtime.core.injector.annotations.ConfigFile; import com.github.imdmk.playtime.core.injector.processor.ComponentProcessor; import com.github.imdmk.playtime.core.injector.processor.ComponentProcessorContext; +import eu.okaeri.configs.OkaeriConfig; import org.panda_lang.utilities.inject.Resources; import java.lang.reflect.Field; @@ -35,11 +36,22 @@ public void process( ConfigFile.class ); - configService.create(config.getClass()); + // The very same instance must be loaded and bound, otherwise every component + // injecting this config would receive an unloaded copy holding only the defaults. + configService.adopt(config); + resources.on(config.getClass()) - .assignInstance(instance); + .assignInstance(config); + + bindSections(config, resources); + } + private void bindSections(ConfigSection config, Resources resources) { for (Field field : config.getClass().getFields()) { + if (!OkaeriConfig.class.isAssignableFrom(field.getType())) { + continue; + } + try { Object value = field.get(config); if (value != null) {