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();
+ }
}