From f5316eb3209d1e660955949be1f5cab4e081ebf7 Mon Sep 17 00:00:00 2001 From: Carm Date: Wed, 11 Mar 2026 11:16:19 +0800 Subject: [PATCH] feat(holder): Add file type multi configuration. #169 --- features/multi/pom.xml | 5 ++ .../{ => multi}/MultiConfiguration.java | 2 +- .../multi/MultiFileConfiguration.java | 73 +++++++++++++++++++ .../tests/ExampleUserStorage.java | 66 ----------------- .../configuration/tests/MultiFileTests.java | 17 ++++- 5 files changed, 94 insertions(+), 69 deletions(-) rename features/multi/src/main/java/cc/carm/lib/configuration/{ => multi}/MultiConfiguration.java (99%) create mode 100644 features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiFileConfiguration.java delete mode 100644 features/multi/src/test/java/cc/carm/lib/configuration/tests/ExampleUserStorage.java diff --git a/features/multi/pom.xml b/features/multi/pom.xml index 86c38a8..5b31b89 100644 --- a/features/multi/pom.xml +++ b/features/multi/pom.xml @@ -32,6 +32,11 @@ ${project.version} + + cc.carm.lib + configured-feature-file + ${project.version} + cc.carm.lib diff --git a/features/multi/src/main/java/cc/carm/lib/configuration/MultiConfiguration.java b/features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiConfiguration.java similarity index 99% rename from features/multi/src/main/java/cc/carm/lib/configuration/MultiConfiguration.java rename to features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiConfiguration.java index 9531b1e..6cd6912 100644 --- a/features/multi/src/main/java/cc/carm/lib/configuration/MultiConfiguration.java +++ b/features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiConfiguration.java @@ -1,4 +1,4 @@ -package cc.carm.lib.configuration; +package cc.carm.lib.configuration.multi; import cc.carm.lib.configuration.source.ConfigurationHolder; import org.jetbrains.annotations.NotNull; diff --git a/features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiFileConfiguration.java b/features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiFileConfiguration.java new file mode 100644 index 0000000..5d3e1c5 --- /dev/null +++ b/features/multi/src/main/java/cc/carm/lib/configuration/multi/MultiFileConfiguration.java @@ -0,0 +1,73 @@ +package cc.carm.lib.configuration.multi; + +import cc.carm.lib.configuration.source.ConfigurationHolder; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public abstract class MultiFileConfiguration extends MultiConfiguration { + + protected final @NotNull File dataFolder; + protected final @NotNull String extensionSuffix; // e.g. ".yml" + + protected final ConcurrentHashMap> holders = new ConcurrentHashMap<>(); + + public MultiFileConfiguration(@NotNull File dataFolder, @NotNull String extensionSuffix) { + this.dataFolder = dataFolder; + this.extensionSuffix = extensionSuffix; + + // Load existing configuration files + if (dataFolder.exists() && dataFolder.isDirectory()) { + File[] files = dataFolder.listFiles((dir, name) -> name.endsWith(extensionSuffix)); + if (files != null) { + for (File file : files) { + String fileName = file.getName(); + String keyStr = fileName.substring(0, fileName.length() - extensionSuffix.length()); // Remove extension suffix + try { + holders.put(extractKeyFromFilename(keyStr), loadHolder(file)); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + loadAll(); + } + + public abstract K extractKeyFromFilename(@NotNull String fileName); + + public String keyToFilename(@NotNull K key) { + return key.toString(); + } + + public abstract ConfigurationHolder loadHolder(@NotNull File file); + + @Override + public @NotNull Map> holders() { + return this.holders; + } + + @Override + public @NotNull ConfigurationHolder holder(@NotNull K key) { + ConfigurationHolder loaded = holders.get(key); + if (loaded != null) return loaded; + + File file = new File(dataFolder, keyToFilename(key) + this.extensionSuffix); + ConfigurationHolder created = loadHolder(file); + holders.put(key, created); + return created; + } + + @Override + public void removeHolder(@NotNull K key) { + ConfigurationHolder loaded = holders.remove(key); + if (loaded == null) return; + + File file = new File(dataFolder, key + ".yml"); + if (file.exists()) file.delete(); + } + +} diff --git a/features/multi/src/test/java/cc/carm/lib/configuration/tests/ExampleUserStorage.java b/features/multi/src/test/java/cc/carm/lib/configuration/tests/ExampleUserStorage.java deleted file mode 100644 index 666732d..0000000 --- a/features/multi/src/test/java/cc/carm/lib/configuration/tests/ExampleUserStorage.java +++ /dev/null @@ -1,66 +0,0 @@ -package cc.carm.lib.configuration.tests; - -import cc.carm.lib.configuration.MultiConfiguration; -import cc.carm.lib.configuration.source.ConfigurationHolder; -import cc.carm.lib.configuration.source.yaml.YAMLConfigFactory; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -public abstract class ExampleUserStorage extends MultiConfiguration { - - protected final @NotNull File dataFolder; - protected final ConcurrentHashMap> holders = new ConcurrentHashMap<>(); - - public ExampleUserStorage(@NotNull File dataFolder) { - this.dataFolder = dataFolder; - - // Load existing configuration files - if (dataFolder.exists() && dataFolder.isDirectory()) { - File[] files = dataFolder.listFiles((dir, name) -> name.endsWith(".yml")); - if (files != null) { - for (File file : files) { - String fileName = file.getName(); - String uuidStr = fileName.substring(0, fileName.length() - 4); // Remove ".yml" - try { - UUID uuid = UUID.fromString(uuidStr); - ConfigurationHolder holder = YAMLConfigFactory.from(file).build(); - holders.put(uuid, holder); - } catch (IllegalArgumentException e) { - System.err.println("Invalid UUID in file name: " + fileName); - } - } - } - } - - loadAll(); - } - - @Override - public @NotNull Map> holders() { - return this.holders; - } - - @Override - public @NotNull ConfigurationHolder holder(@NotNull UUID key) { - ConfigurationHolder loaded = holders.get(key); - if (loaded != null) return loaded; - - ConfigurationHolder created = YAMLConfigFactory.from(new File(dataFolder, key + ".yml")).build(); - holders.put(key, created); - return created; - } - - @Override - public void removeHolder(@NotNull UUID key) { - ConfigurationHolder loaded = holders.remove(key); - if (loaded == null) return; - - File file = new File(dataFolder, key + ".yml"); - if (file.exists()) file.delete(); - } - -} diff --git a/features/multi/src/test/java/cc/carm/lib/configuration/tests/MultiFileTests.java b/features/multi/src/test/java/cc/carm/lib/configuration/tests/MultiFileTests.java index b995f11..26aface 100644 --- a/features/multi/src/test/java/cc/carm/lib/configuration/tests/MultiFileTests.java +++ b/features/multi/src/test/java/cc/carm/lib/configuration/tests/MultiFileTests.java @@ -1,7 +1,9 @@ package cc.carm.lib.configuration.tests; +import cc.carm.lib.configuration.multi.MultiFileConfiguration; import cc.carm.lib.configuration.source.ConfigurationHolder; import cc.carm.lib.configuration.source.section.ConfigureSection; +import cc.carm.lib.configuration.source.yaml.YAMLConfigFactory; import org.jetbrains.annotations.NotNull; import org.junit.Test; @@ -26,10 +28,11 @@ public class MultiFileTests { } - public static class ProfileStorage extends ExampleUserStorage { + public static class ProfileStorage extends MultiFileConfiguration { + public ProfileStorage(@NotNull File dataFolder) { - super(dataFolder); + super(dataFolder, ".yml"); } @Override @@ -55,6 +58,16 @@ public class MultiFileTests { e.printStackTrace(); } } + + @Override + public UUID extractKeyFromFilename(@NotNull String fileName) { + return UUID.fromString(fileName); + } + + @Override + public ConfigurationHolder loadHolder(@NotNull File file) { + return YAMLConfigFactory.from(file).build(); + } }