diff --git a/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java index e8810f8..e84c4ac 100644 --- a/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java +++ b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java @@ -14,7 +14,7 @@ public @interface ConfigPath { /** * The path value of the current configuration. - * If not set,will generate the path by {@link PathGenerator}. + * If not set,will generate the path by {@link cc.carm.lib.configuration.source.loader.PathGenerator}. * * @return The path value of the current configuration */ diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java index d2ebac1..a44d2cb 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/AbstractConfigBuilder.java @@ -41,7 +41,7 @@ public abstract class AbstractConfigBuilder< public abstract @NotNull RESULT build(); - public @NotNull SELF provider(@Nullable PROVIDER provider) { + public @NotNull SELF holder(@Nullable PROVIDER provider) { this.provider = provider; return self(); } diff --git a/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java b/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java index 5ba01bb..a6f7f42 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/loader/ConfigurationInitializer.java @@ -83,29 +83,31 @@ public class ConfigurationInitializer { } - public @Nullable String getFieldPath(ConfigurationHolder holder, @Nullable String parentPath, @NotNull Field field) { + public @Nullable String getFieldPath(@NotNull ConfigurationHolder holder, @Nullable String parentPath, @NotNull Field field) { return pathGenerator.getFieldPath(holder, parentPath, field); } - public @Nullable String getClassPath(ConfigurationHolder holder, @Nullable String parentPath, + public @Nullable String getClassPath(@NotNull ConfigurationHolder holder, @Nullable String parentPath, @NotNull Class clazz, @Nullable Field clazzField) { return pathGenerator.getClassPath(holder, parentPath, clazz, clazzField); } - public void initialize(ConfigurationHolder holder, @NotNull Configuration config) throws Exception { + public void initialize(@NotNull ConfigurationHolder holder, + @NotNull Configuration config) throws Exception { initializeInstance(holder, config, null, null); if (holder.options().get(StandardOptions.SET_DEFAULTS)) holder.save(); } - public void initialize(ConfigurationHolder holder, @NotNull Class clazz) throws Exception { + public void initialize(@NotNull ConfigurationHolder holder, + @NotNull Class clazz) throws Exception { initializeStaticClass(holder, clazz, null, null); if (holder.options().get(StandardOptions.SET_DEFAULTS)) holder.save(); } // 针对实例类的初始化方法 - protected void initializeInstance(@NotNull ConfigurationHolder holder, - @NotNull Configuration root, @Nullable String parentPath, @Nullable Field configField) { + protected void initializeInstance(@NotNull ConfigurationHolder holder, @NotNull Configuration root, + @Nullable String parentPath, @Nullable Field configField) { String path = getClassPath(holder, parentPath, root.getClass(), configField); try { this.classInitializer.whenInitialize(holder, path, root.getClass()); @@ -118,8 +120,9 @@ public class ConfigurationInitializer { // 针对静态类的初始化方法 @SuppressWarnings("unchecked") protected void initializeStaticClass(@NotNull ConfigurationHolder holder, - @NotNull Class clazz, @Nullable String parentPath, @Nullable Field configField) { - if (!Configuration.class.isAssignableFrom(clazz)) return; // 只解析继承了 ConfigurationRoot 的类 + @NotNull Class clazz, + @Nullable String parentPath, @Nullable Field configField) { + if (!Configuration.class.isAssignableFrom(clazz)) return; // Only Configuration class can be initialized. String path = getClassPath(holder, parentPath, clazz, configField); @@ -158,6 +161,9 @@ public class ConfigurationInitializer { } catch (Exception e) { e.printStackTrace(); } + if (holder.options().get(StandardOptions.SET_DEFAULTS)) { + value.setDefault(); + } } else if (source instanceof Configuration && object instanceof Configuration) { // 当且仅当 源字段与字段 均为Configuration实例时,才对目标字段进行下一步初始化加载。 initializeInstance(holder, (Configuration) object, parent, field); diff --git a/core/src/main/java/cc/carm/lib/configuration/source/loader/PathGenerator.java b/core/src/main/java/cc/carm/lib/configuration/source/loader/PathGenerator.java index 4312fd4..fc2e260 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/loader/PathGenerator.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/loader/PathGenerator.java @@ -40,8 +40,9 @@ public class PathGenerator { public @Nullable String getFieldPath(@NotNull ConfigurationHolder holder, @Nullable String parentPath, @NotNull Field field) { ConfigPath path = field.getAnnotation(ConfigPath.class); - if (path == null) return link(holder, parentPath, false, field.getName()); // No annotation, use field name. - else return link(holder, parentPath, path.root(), select(path.value(), field.getName())); + if (path == null) + return link(holder, parentPath, false, covertPath(field.getName())); // No annotation, use field name. + else return link(holder, parentPath, path.root(), select(path.value(), covertPath(field.getName()))); } public @Nullable String getClassPath(@NotNull ConfigurationHolder holder, @@ -51,14 +52,14 @@ public class PathGenerator { // 2. If the class defined as a field, check if the field has a ConfigPath annotation, // and use filed information. ConfigPath clazzPath = clazz.getAnnotation(ConfigPath.class); - if (clazzPath != null) return link(holder, parentPath, clazzPath.root(), clazzPath.value()); + if (clazzField == null) { - return link(holder, parentPath, false, clazz.getSimpleName()); // No field, use class name. + return link(holder, parentPath, false, parentPath == null ? null : covertPath(clazz.getSimpleName())); // No field, use class name. } ConfigPath fieldPath = clazzField.getAnnotation(ConfigPath.class); - if (fieldPath == null) return link(holder, parentPath, false, clazzField.getName()); + if (fieldPath == null) return link(holder, parentPath, false, covertPath(clazzField.getName())); else return getFieldPath(holder, parentPath, clazzField); } @@ -70,7 +71,7 @@ public class PathGenerator { protected @Nullable String link(@NotNull ConfigurationHolder holder, @Nullable String parent, boolean root, @Nullable String path) { if (path == null || path.isEmpty()) return root ? null : parent; - return root || parent == null ? covertPath(path) : parent + pathSeparator(holder) + covertPath(path); + return root || parent == null ? path : parent + pathSeparator(holder) + path; } public static boolean isBlank(String path) { @@ -93,16 +94,16 @@ public class PathGenerator { public static String covertPathName(String name) { return name // Replace all uppercase letters with dashes - .replaceAll("[A-Z]", "-$0") + .replaceAll("[A-Z]", "=$0") // If the first letter is also capitalized, // it will also be converted and the first dash will need to be removed - .replaceAll("-(.*)", "$1") + .replaceAll("^=(.*)$", "$1") // Because the name may contain _, it needs to be treated a little differently - .replaceAll("_-([A-Z])", "_$1") + .replaceAll("_=([A-Z])", "_$1") // The content that is not named in all caps is then converted - .replaceAll("([a-z])-([A-Z])", "$1_$2") + .replaceAll("([a-z])=([A-Z])", "$1_$2") // Remove any extra horizontal lines - .replace("-", "") + .replaceAll("=", "") // Replace the underscore with a dash .replace("_", "-") // Finally, convert it to all lowercase diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java index b8420a5..1f52303 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java @@ -1,8 +1,8 @@ package cc.carm.lib.configuration.demo.tests; import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration; -import cc.carm.lib.configuration.demo.tests.conf.TestConfiguration; -import cc.carm.lib.configuration.demo.tests.model.TestModel; +import cc.carm.lib.configuration.demo.tests.conf.RegistryConfig; +import cc.carm.lib.configuration.demo.tests.model.UserRecord; import cc.carm.lib.configuration.source.ConfigurationHolder; import org.jetbrains.annotations.TestOnly; @@ -16,7 +16,7 @@ public class ConfigurationTest { @TestOnly public static void testDemo(ConfigurationHolder holder) { try { - holder.initializer().initialize(holder, DemoConfiguration.class); + holder.initialize(DemoConfiguration.class); } catch (Exception e) { e.printStackTrace(); } @@ -30,27 +30,27 @@ public class ConfigurationTest { System.out.println("after: " + DemoConfiguration.TEST_NUMBER.get()); System.out.println("> Test Value:"); - System.out.println("before: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get()); - DemoConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID()); - System.out.println("after: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get()); + System.out.println("before: " + DemoConfiguration.SUB.UUID_CONFIG_VALUE.get()); + DemoConfiguration.SUB.UUID_CONFIG_VALUE.set(UUID.randomUUID()); + System.out.println("after: " + DemoConfiguration.SUB.UUID_CONFIG_VALUE.get()); System.out.println("> Test List:"); System.out.println(" Before:"); - DemoConfiguration.Sub.That.OPERATORS.forEach(System.out::println); + DemoConfiguration.SUB.That.OPERATORS.forEach(System.out::println); List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); - DemoConfiguration.Sub.That.OPERATORS.set(operators); + DemoConfiguration.SUB.That.OPERATORS.set(operators); System.out.println(" After:"); - DemoConfiguration.Sub.That.OPERATORS.forEach(System.out::println); + DemoConfiguration.SUB.That.OPERATORS.forEach(System.out::println); System.out.println("> Clear List:"); - System.out.println(" Before: size :" + DemoConfiguration.Sub.That.OPERATORS.size()); - DemoConfiguration.Sub.That.OPERATORS.modify(List::clear); - System.out.println(" After size :" + DemoConfiguration.Sub.That.OPERATORS.size()); + System.out.println(" Before: size :" + DemoConfiguration.SUB.That.OPERATORS.size()); + DemoConfiguration.SUB.That.OPERATORS.modify(List::clear); + System.out.println(" After size :" + DemoConfiguration.SUB.That.OPERATORS.size()); System.out.println("> Test Section:"); - System.out.println(DemoConfiguration.MODEL_TEST.get()); - DemoConfiguration.MODEL_TEST.set(TestModel.random()); + System.out.println(DemoConfiguration.USERS.get()); + DemoConfiguration.USERS.add(UserRecord.random()); // System.out.println("> Test Maps:"); // DemoConfiguration.USERS.forEach((k, v) -> System.out.println(k + ": " + v)); @@ -64,19 +64,19 @@ public class ConfigurationTest { public static void testInner(ConfigurationHolder provider) { - TestConfiguration TEST = new TestConfiguration(); + RegistryConfig TEST = new RegistryConfig(); provider.initialize(TEST); System.out.println("> Test Inner value before:"); - System.out.println(TEST.INNER.INNER_VALUE.getNotNull()); + System.out.println(TEST.INSTANCE.INNER_VALUE.getNotNull()); double after = Math.random() * 200D; System.out.println("> Test Inner value -> " + after); - TEST.INNER.INNER_VALUE.set(after); + TEST.INSTANCE.INNER_VALUE.set(after); System.out.println("> Test Inner value after:"); - System.out.println(TEST.INNER.INNER_VALUE.getNotNull()); + System.out.println(TEST.INSTANCE.INNER_VALUE.getNotNull()); } diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java index 2080ce8..8623ac8 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java @@ -4,7 +4,8 @@ import cc.carm.lib.configuration.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.annotation.InlineComment; -import cc.carm.lib.configuration.demo.tests.model.TestModel; +import cc.carm.lib.configuration.demo.DatabaseConfiguration; +import cc.carm.lib.configuration.demo.tests.model.UserRecord; import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredList; import cc.carm.lib.configuration.value.standard.ConfiguredValue; @@ -27,18 +28,14 @@ public interface DemoConfiguration extends Configuration { // 支持通过 Class 变量标注子配置,一并注册。 // 注意: 若对应类也有注解,则优先使用类的注解。 - @ConfigPath("other-class-config") //支持通过注解修改子配置的主路径,若不修改则以变量名自动生成。 - @HeaderComment({"", "Something..."}) // 支持给子路径直接打注释 - @InlineComment("InlineComments for class path") - Class OTHER = OtherConfiguration.class; + Class DATABASE = DatabaseConfiguration.class; - @ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 + @ConfigPath("registered_users") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 @HeaderComment({"Section类型数据测试"}) // 通过注解给配置添加注释。 @InlineComment("Section数据也支持InlineComment注释") - ConfigValue MODEL_TEST = ConfiguredValue.builderOf(TestModel.class).fromSection() - .defaults(new TestModel("Carm", UUID.randomUUID())) - .parse((holder, section) -> TestModel.deserialize(section)) - .serialize(TestModel::serialize).build(); + ConfiguredList USERS = ConfiguredList.builderOf(UserRecord.class).fromSection() + .parse(UserRecord::deserialize).serialize(UserRecord::serialize) + .defaults(UserRecord.CARM).build(); // @HeaderComment({"[ID - UUID]对照表", "", "用于测试Map类型的解析与序列化保存"}) // ConfiguredMap USERS = ConfiguredMap.builderOf(Integer.class, UUID.class) @@ -52,7 +49,7 @@ public interface DemoConfiguration extends Configuration { * 支持内部类的直接注册。 * 注意,需要启用 {@link cc.carm.lib.configuration.source.option.StandardOptions#LOAD_SUB_CLASSES} */ - class Sub implements Configuration { + class SUB implements Configuration { @ConfigPath(value = "uuid-value", root = true) @InlineComment("This is an inline comment") diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/InstanceConfig.java similarity index 86% rename from demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/InstanceConfig.java index 7c93b94..c0d7a8b 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/InstanceConfig.java @@ -6,7 +6,7 @@ import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredValue; @HeaderComment("Inner Test") -public class TestInnerConfiguration implements Configuration { +public class InstanceConfig implements Configuration { public final ConfigValue INNER_VALUE = ConfiguredValue.of(1.0D); diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/OtherConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/OtherConfiguration.java deleted file mode 100644 index cb0fd2c..0000000 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/OtherConfiguration.java +++ /dev/null @@ -1,4 +0,0 @@ -package cc.carm.lib.configuration.demo.tests.conf; - -public class OtherConfiguration { -} diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/RegistryConfig.java similarity index 59% rename from demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/RegistryConfig.java index 0252d51..36fceca 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/RegistryConfig.java @@ -4,24 +4,23 @@ import cc.carm.lib.configuration.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.annotation.InlineComment; -import cc.carm.lib.configuration.demo.tests.model.TestModel; +import cc.carm.lib.configuration.demo.tests.model.UserRecord; import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredValue; import java.util.UUID; -public class TestConfiguration implements Configuration { +public class RegistryConfig implements Configuration { - public final TestInnerConfiguration INNER = new TestInnerConfiguration(); - - public final ConfigValue CLASS_VALUE = ConfiguredValue.of(1.0D); + @HeaderComment("Support for configurations as instances") + public final InstanceConfig INSTANCE = new InstanceConfig(); @ConfigPath("test.user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 @HeaderComment({"Section类型数据测试"}) // 通过注解给配置添加注释。 @InlineComment("Section数据也支持InlineComment注释") - public final ConfigValue TEST_MODEL = ConfiguredValue.builderOf(TestModel.class).fromSection() - .defaults(new TestModel("Carm", UUID.randomUUID())) - .parse((holder, section) -> TestModel.deserialize(section)) + public final ConfigValue TEST_MODEL = ConfiguredValue.builderOf(UserRecord.class).fromSection() + .defaults(new UserRecord("Carm", UUID.randomUUID())) + .parse((holder, section) -> UserRecord.deserialize(section)) .serialize((holder, data) -> data.serialize()).build(); diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractRecord.java similarity index 73% rename from demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractRecord.java index f12e411..d8e09ce 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractRecord.java @@ -2,11 +2,11 @@ package cc.carm.lib.configuration.demo.tests.model; import org.jetbrains.annotations.NotNull; -public abstract class AbstractModel { +public abstract class AbstractRecord { protected final @NotNull String name; - public AbstractModel(@NotNull String name) { + public AbstractRecord(@NotNull String name) { this.name = name; } diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/UserRecord.java similarity index 65% rename from demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/UserRecord.java index 0c9ef93..f14240a 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/UserRecord.java @@ -7,20 +7,22 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -public class TestModel extends AbstractModel { +public class UserRecord extends AbstractRecord { - public UUID uuid; + public static final UserRecord CARM = new UserRecord("Carm", UUID.fromString("f7b3b3b3-3b3b-3b3b-3b3b-3b3b3b3b3b3b")); - public TestModel(String name, UUID uuid) { + protected UUID uuid; + + public UserRecord(String name, UUID uuid) { super(name); this.uuid = uuid; } - public void setUuid(UUID uuid) { + public void uuid(UUID uuid) { this.uuid = uuid; } - public UUID getUuid() { + public UUID uuid() { return uuid; } @@ -33,16 +35,16 @@ public class TestModel extends AbstractModel { return map; } - public static TestModel deserialize(ConfigureSection section) { + public static UserRecord deserialize(ConfigureSection section) { String name = section.getString("name"); if (name == null) throw new NullPointerException("name is null"); String uuidString = section.getString("info.uuid"); if (uuidString == null) throw new NullPointerException("uuid is null"); - return new TestModel(name, UUID.fromString(uuidString)); + return new UserRecord(name, UUID.fromString(uuidString)); } - public static TestModel random() { - return new TestModel(UUID.randomUUID().toString().substring(0, 5), UUID.randomUUID()); + public static UserRecord random() { + return new UserRecord(UUID.randomUUID().toString().substring(0, 5), UUID.randomUUID()); } diff --git a/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java index 5973156..8584eea 100644 --- a/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java +++ b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java @@ -46,16 +46,17 @@ public abstract class FileConfigSource
R fileInputStream(@NotNull DataFunction loader) throws Exception { @@ -65,7 +66,11 @@ public abstract class FileConfigSource
R fileReader(@NotNull DataFunction loader) throws Exception { - return fileInputStream(is -> loader.handle(new InputStreamReader(is, charset()))); + try (InputStream is = Files.newInputStream(file.toPath())) { + try (Reader r = new InputStreamReader(is, charset())) { + return loader.handle(r); + } + } } protected void fileOutputStream(@NotNull Consumer stream) throws Exception { @@ -75,7 +80,11 @@ public abstract class FileConfigSource
writer) throws Exception { - fileOutputStream(os -> writer.accept(new OutputStreamWriter(os, charset()))); + try (OutputStream os = Files.newOutputStream(file.toPath())) { + try (Writer w = new OutputStreamWriter(os, charset())) { + writer.accept(w); + } + } } protected void saveResource(@NotNull String resourcePath, boolean replace) diff --git a/pom.xml b/pom.xml index ac2a2a5..fcbba7f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ features/commentable features/file - + providers/yaml providers/gson diff --git a/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONSection.java b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONSection.java index e60231b..1e707e4 100644 --- a/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONSection.java +++ b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONSection.java @@ -22,6 +22,16 @@ public class JSONSection implements ConfigureSection { if (entry.getValue() instanceof Map) { this.data.put(key, new JSONSection(source, (Map) entry.getValue())); + } else if (entry.getValue() instanceof List) { + List list = new ArrayList<>(); + for (Object obj : (List) entry.getValue()) { + if (obj instanceof Map) { + list.add(new JSONSection(source, (Map) obj)); + } else { + list.add(obj); + } + } + this.data.put(key, list); } else { this.data.put(key, entry.getValue()); } diff --git a/providers/gson/src/test/java/config/JSONConfigTest.java b/providers/gson/src/test/java/config/JSONConfigTest.java index 931f09d..a8f911e 100644 --- a/providers/gson/src/test/java/config/JSONConfigTest.java +++ b/providers/gson/src/test/java/config/JSONConfigTest.java @@ -3,7 +3,10 @@ package config; import cc.carm.lib.configuration.demo.tests.ConfigurationTest; import cc.carm.lib.configuration.json.JSONConfigFactory; import cc.carm.lib.configuration.source.ConfigurationHolder; +import cc.carm.lib.configuration.source.loader.PathGenerator; import cc.carm.lib.configuration.source.option.StandardOptions; +import cc.carm.lib.configuration.value.ConfigValue; +import cc.carm.lib.configuration.value.standard.ConfiguredValue; import org.junit.Test; import java.io.File; @@ -12,11 +15,17 @@ public class JSONConfigTest { protected final ConfigurationHolder holder = JSONConfigFactory .from(new File("target"), "config.json") - .option(StandardOptions.PATH_SEPARATOR, '-') + .resourcePath("example.json") .build(); @Test public void onTest() { + + ConfigValue EXAMPLE = ConfiguredValue.of(false); + EXAMPLE.initialize(this.holder, "example"); + + System.out.println("Example: " + EXAMPLE.get()); + ConfigurationTest.testDemo(this.holder); ConfigurationTest.testInner(this.holder); diff --git a/providers/gson/src/test/resources/example.json b/providers/gson/src/test/resources/example.json new file mode 100644 index 0000000..44954eb --- /dev/null +++ b/providers/gson/src/test/resources/example.json @@ -0,0 +1,3 @@ +{ + "example": "true" +} \ No newline at end of file diff --git a/providers/yaml/src/test/java/config/DemoConfigTest.java b/providers/yaml/src/test/java/config/DemoConfigTest.java index b7427cd..ee68d7b 100644 --- a/providers/yaml/src/test/java/config/DemoConfigTest.java +++ b/providers/yaml/src/test/java/config/DemoConfigTest.java @@ -2,7 +2,7 @@ package config; import cc.carm.lib.configuration.EasyConfiguration; import cc.carm.lib.configuration.demo.tests.ConfigurationTest; -import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import cc.carm.lib.configuration.demo.tests.model.AbstractRecord; import cc.carm.lib.configuration.yaml.YAMLConfigProvider; import config.model.AnyModel; import config.model.SomeModel; @@ -10,8 +10,6 @@ import config.source.ModelConfiguration; import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerialization; import org.junit.Test; -import java.io.IOException; - public class DemoConfigTest { static { @@ -37,10 +35,10 @@ public class DemoConfigTest { provider.initialize(ModelConfiguration.class); System.out.println("----------------------------------------------------"); - AbstractModel someModel = ModelConfiguration.SOME_MODEL.get(); + AbstractRecord someModel = ModelConfiguration.SOME_MODEL.get(); if (someModel != null) System.out.println(someModel.getName()); - AbstractModel anyModel = ModelConfiguration.ANY_MODEL.get(); + AbstractRecord anyModel = ModelConfiguration.ANY_MODEL.get(); if (anyModel != null) System.out.println(anyModel.getName()); ModelConfiguration.MODELS.forEach(System.out::println); diff --git a/providers/yaml/src/test/java/config/model/AnyModel.java b/providers/yaml/src/test/java/config/model/AnyModel.java index f123d09..4f619a8 100644 --- a/providers/yaml/src/test/java/config/model/AnyModel.java +++ b/providers/yaml/src/test/java/config/model/AnyModel.java @@ -1,6 +1,6 @@ package config.model; -import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import cc.carm.lib.configuration.demo.tests.model.AbstractRecord; import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; import org.bspfsystems.yamlconfiguration.serialization.SerializableAs; import org.jetbrains.annotations.NotNull; @@ -11,7 +11,7 @@ import java.util.Map; import java.util.UUID; @SerializableAs("AnyModel") -public class AnyModel extends AbstractModel implements ConfigurationSerializable { +public class AnyModel extends AbstractRecord implements ConfigurationSerializable { public final boolean bool; diff --git a/providers/yaml/src/test/java/config/model/SomeModel.java b/providers/yaml/src/test/java/config/model/SomeModel.java index 65fdf21..4308bfe 100644 --- a/providers/yaml/src/test/java/config/model/SomeModel.java +++ b/providers/yaml/src/test/java/config/model/SomeModel.java @@ -1,6 +1,6 @@ package config.model; -import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import cc.carm.lib.configuration.demo.tests.model.AbstractRecord; import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; import org.bspfsystems.yamlconfiguration.serialization.SerializableAs; import org.jetbrains.annotations.NotNull; @@ -11,7 +11,7 @@ import java.util.Map; import java.util.UUID; @SerializableAs("SomeModel") -public class SomeModel extends AbstractModel implements ConfigurationSerializable { +public class SomeModel extends AbstractRecord implements ConfigurationSerializable { public final int num; diff --git a/providers/yaml/src/test/java/config/source/ModelConfiguration.java b/providers/yaml/src/test/java/config/source/ModelConfiguration.java index 14dfdf9..8095fe8 100644 --- a/providers/yaml/src/test/java/config/source/ModelConfiguration.java +++ b/providers/yaml/src/test/java/config/source/ModelConfiguration.java @@ -7,7 +7,7 @@ import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredList; import cc.carm.lib.configuration.value.standard.ConfiguredMap; import cc.carm.lib.configuration.value.standard.ConfiguredSectionMap; -import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import cc.carm.lib.configuration.demo.tests.model.AbstractRecord; import cc.carm.lib.configuration.yaml.value.ConfiguredSerializable; import config.model.AnyModel; import config.model.SomeModel; @@ -16,11 +16,11 @@ import config.model.SomeModel; @ConfigPath("model-test") public class ModelConfiguration implements Configuration { - public static final ConfigValue SOME_MODEL = ConfiguredSerializable.of( + public static final ConfigValue SOME_MODEL = ConfiguredSerializable.of( SomeModel.class, SomeModel.random() ); - public static final ConfigValue ANY_MODEL = ConfiguredSerializable.of( + public static final ConfigValue ANY_MODEL = ConfiguredSerializable.of( AnyModel.class, AnyModel.random() );