diff --git a/README.md b/README.md index 84672cc..f041e49 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ ### 示例代码 -您可以 [点击这里](impl/yaml/src/test/java/config/source/DemoConfiguration.java) 查看部分代码演示,更多演示详见 [开发介绍](.documentation/README.md) 。 +您可以 [点击这里](demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java) 查看部分代码演示,更多演示详见 [开发介绍](.documentation/README.md) 。 ### 依赖方式 diff --git a/core/pom.xml b/core/pom.xml index c042682..e0eee89 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 3.2.1 + 3.3.0 4.0.0 diff --git a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java index 7428d87..a2bec2c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java @@ -60,12 +60,84 @@ public void initialize(@NotNull Class clazz, } } + /** + * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。 + * + * @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。 + */ + public void initialize(@NotNull ConfigurationRoot config) { + initialize(config, true); + } + + /** + * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。 + * + * @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。 + * @param saveDefaults 是否写入默认值(默认为 true)。 + */ + public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) { + initializeClass( + config, null, null, + null, null, null, + saveDefaults + ); + if (saveDefaults) { + try { + provider.save(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + protected void initializeClass(@NotNull ConfigurationRoot root, + @Nullable String parentPath, @Nullable String fieldName, + @Nullable ConfigPath fieldPath, + @Nullable HeaderComment fieldHeaderComments, + @Nullable InlineComment fieldInlineComments, + boolean saveDefaults) { + String path = getClassPath(root.getClass(), parentPath, fieldName, fieldPath); + this.provider.setHeaderComment(path, getClassHeaderComments(root.getClass(), fieldHeaderComments)); + if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments)); + + for (Field field : root.getClass().getDeclaredFields()) { + initializeField(root, field, path, saveDefaults); + } + } + + private void initializeField(@NotNull ConfigurationRoot root, + @NotNull Field field, @Nullable String parent, + boolean saveDefaults) { + try { + field.setAccessible(true); + Object object = field.get(root); + if (object instanceof ConfigValue) { + initializeValue( + (ConfigValue) object, getFieldPath(field, parent), + field.getAnnotation(HeaderComment.class), + field.getAnnotation(InlineComment.class), + saveDefaults + ); + } else if (object instanceof ConfigurationRoot) { + initializeClass( + (ConfigurationRoot) object, parent, field.getName(), + field.getAnnotation(ConfigPath.class), + field.getAnnotation(HeaderComment.class), + field.getAnnotation(InlineComment.class), + saveDefaults + ); + } + } catch (IllegalAccessException ignored) { + } + } + protected void initializeClass(@NotNull Class clazz, @Nullable String parentPath, @Nullable String fieldName, @Nullable ConfigPath fieldPath, @Nullable HeaderComment fieldHeaderComments, @Nullable InlineComment fieldInlineComments, boolean saveDefaults, boolean loadSubClasses) { + if (!ConfigurationRoot.class.isAssignableFrom(clazz)) return; // 只解析继承了 ConfigurationRoot 的类 String path = getClassPath(clazz, parentPath, fieldName, fieldPath); this.provider.setHeaderComment(path, getClassHeaderComments(clazz, fieldHeaderComments)); if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments)); @@ -142,7 +214,7 @@ protected static List readHeaderComments(@Nullable HeaderComment annotat return value.length() > 0 ? value : null; } - protected static @Nullable String getClassPath(@NotNull Class clazz, + protected static @Nullable String getClassPath(@Nullable Class clazz, @Nullable String parentPath, @Nullable String filedName, @Nullable ConfigPath fieldAnnotation) { @@ -150,11 +222,13 @@ protected static List readHeaderComments(@Nullable HeaderComment annotat boolean fromRoot = false; // 先获取 Class 对应的路径注解 其优先度最高。 - ConfigPath clazzAnnotation = clazz.getAnnotation(ConfigPath.class); - if (clazzAnnotation != null) { - fromRoot = clazzAnnotation.root(); - if (clazzAnnotation.value().length() > 0) { - return (fromRoot ? "" : parent) + clazzAnnotation.value(); + if (clazz != null) { + ConfigPath clazzAnnotation = clazz.getAnnotation(ConfigPath.class); + if (clazzAnnotation != null) { + fromRoot = clazzAnnotation.root(); + if (clazzAnnotation.value().length() > 0) { + return (fromRoot ? "" : parent) + clazzAnnotation.value(); + } } } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java b/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java index 20fa40a..597016c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java @@ -53,18 +53,20 @@ default ConfigValueParser compose(@NotNull ConfigDataFunction time; } + /** + * 得到配置文件的原生功能类。 + * + * @return 原生类 + */ public abstract @NotNull W getConfiguration(); + /** + * 重载当前配置文件。(将不会保存已修改的内容) + * + * @throws Exception 当重载出现错误时抛出 + */ public void reload() throws Exception { onReload(); // 调用重写的Reload方法 this.updateTime = System.currentTimeMillis(); } + /** + * 将当前对配置文件的更改进行保存。 + * + * @throws Exception 当保存出现错误时抛出 + */ public abstract void save() throws Exception; + /** + * 针对于不同配置文件类型所执行的重载操作。 + * + * @throws Exception 当操作出现错误时抛出。 + */ protected abstract void onReload() throws Exception; public abstract @Nullable ConfigurationComments getComments(); @@ -60,16 +93,53 @@ public List getHeaderComment(@Nullable String path) { public abstract @NotNull ConfigInitializer> getInitializer(); + /** + * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。 + * + * @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。 + */ public void initialize(Class configClazz) { initialize(configClazz, true); } + /** + * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。 + * + * @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。 + * @param saveDefaults 是否写入默认值(默认为 true)。 + */ public void initialize(Class configClazz, boolean saveDefaults) { - getInitializer().initialize(configClazz, saveDefaults); + this.getInitializer().initialize(configClazz, saveDefaults); } + /** + * 初始化指定类的所有 {@link ConfigValue} 对象。 + * + * @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。 + * @param saveDefaults 是否写入默认值(默认为 true)。 + * @param loadSubClasses 是否加载内部子类(默认为 true)。 + */ public void initialize(Class configClazz, boolean saveDefaults, boolean loadSubClasses) { - getInitializer().initialize(configClazz, saveDefaults, loadSubClasses); + this.getInitializer().initialize(configClazz, saveDefaults, loadSubClasses); + } + + /** + * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。 + * + * @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。 + */ + public void initialize(@NotNull ConfigurationRoot config) { + this.getInitializer().initialize(config, true); + } + + /** + * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。 + * + * @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。 + * @param saveDefaults 是否写入默认值(默认为 true)。 + */ + public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) { + this.getInitializer().initialize(config, saveDefaults); } } diff --git a/impl/yaml/src/test/java/config/offset/FieldOffset.java b/core/src/test/java/cc/carm/test/config/offset/FieldOffset.java similarity index 97% rename from impl/yaml/src/test/java/config/offset/FieldOffset.java rename to core/src/test/java/cc/carm/test/config/offset/FieldOffset.java index 906c8c3..bbac40a 100644 --- a/impl/yaml/src/test/java/config/offset/FieldOffset.java +++ b/core/src/test/java/cc/carm/test/config/offset/FieldOffset.java @@ -1,4 +1,4 @@ -package config.offset; +package cc.carm.test.config.offset; import org.jetbrains.annotations.NotNull; diff --git a/impl/yaml/src/test/java/config/offset/OffsetUtil.java b/core/src/test/java/cc/carm/test/config/offset/OffsetUtil.java similarity index 100% rename from impl/yaml/src/test/java/config/offset/OffsetUtil.java rename to core/src/test/java/cc/carm/test/config/offset/OffsetUtil.java diff --git a/demo/pom.xml b/demo/pom.xml new file mode 100644 index 0000000..4442c0e --- /dev/null +++ b/demo/pom.xml @@ -0,0 +1,31 @@ + + + + easyconfiguration-parent + cc.carm.lib + 3.3.0 + + 4.0.0 + + ${java.version} + ${java.version} + UTF-8 + UTF-8 + + easyconfiguration-demo + jar + + + + + ${project.parent.groupId} + easyconfiguration-core + ${project.parent.version} + compile + + + + + \ No newline at end of file diff --git a/impl/yaml/src/test/java/config/source/DatabaseConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java similarity index 91% rename from impl/yaml/src/test/java/config/source/DatabaseConfiguration.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java index 4a51600..0d93407 100644 --- a/impl/yaml/src/test/java/config/source/DatabaseConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java @@ -1,4 +1,4 @@ -package config.source; +package cc.carm.lib.configuration.demo; import cc.carm.lib.configuration.core.ConfigurationRoot; import cc.carm.lib.configuration.core.annotation.ConfigPath; @@ -12,7 +12,8 @@ public class DatabaseConfiguration extends ConfigurationRoot { @ConfigPath("driver") @HeaderComment({ "数据库驱动配置,请根据数据库类型设置。", - "- MySQL: com.mysql.cj.jdbc.Driver", + "- MySQL(旧): com.mysql.jdbc.Driver", + "- MySQL(新): com.mysql.cj.jdbc.Driver", "- MariaDB(推荐): org.mariadb.jdbc.Driver", }) protected static final ConfigValue DRIVER_NAME = ConfiguredValue.of( 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 new file mode 100644 index 0000000..0ae044b --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java @@ -0,0 +1,78 @@ +package cc.carm.lib.configuration.demo.tests; + +import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.demo.tests.model.TestModel; +import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration; +import cc.carm.lib.configuration.demo.tests.conf.TestConfiguration; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class ConfigurationTest { + + public static void testDemo(ConfigurationProvider provider) { + provider.initialize(DemoConfiguration.class); + + System.out.println("----------------------------------------------------"); + + System.out.println("Test Number: "); + + System.out.println("before: " + DemoConfiguration.TEST_NUMBER.get()); + DemoConfiguration.TEST_NUMBER.set((long) (Long.MAX_VALUE * Math.random())); + 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("> Test List:"); + DemoConfiguration.Sub.That.OPERATORS.getNotNull().forEach(System.out::println); + List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); + DemoConfiguration.Sub.That.OPERATORS.set(operators); + + System.out.println("> Test Section:"); + System.out.println(DemoConfiguration.MODEL_TEST.get()); + DemoConfiguration.MODEL_TEST.set(TestModel.random()); + + System.out.println("> Test Maps:"); + DemoConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v)); + LinkedHashMap data = new LinkedHashMap<>(); + for (int i = 1; i <= 5; i++) { + data.put(i, UUID.randomUUID()); + } + DemoConfiguration.USERS.set(data); + System.out.println("----------------------------------------------------"); + } + + public static void testInner(ConfigurationProvider provider) { + + TestConfiguration TEST = new TestConfiguration(); + + provider.initialize(TEST, true); + + System.out.println("> Test Inner value before:"); + System.out.println(TEST.INNER.INNER_VALUE.getNotNull()); + + double after = Math.random() * 200D; + System.out.println("> Test Inner value -> " + after); + TEST.INNER.INNER_VALUE.set(after); + + System.out.println("> Test Inner value after:"); + System.out.println(TEST.INNER.INNER_VALUE.getNotNull()); + + } + + public static void save(ConfigurationProvider provider) { + try { + provider.save(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + +} diff --git a/impl/yaml/src/test/java/config/source/DemoConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java similarity index 90% rename from impl/yaml/src/test/java/config/source/DemoConfiguration.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java index ff36013..e586bba 100644 --- a/impl/yaml/src/test/java/config/source/DemoConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java @@ -1,4 +1,4 @@ -package config.source; +package cc.carm.lib.configuration.demo.tests.conf; import cc.carm.lib.configuration.core.ConfigInitializer; import cc.carm.lib.configuration.core.ConfigurationRoot; @@ -10,7 +10,7 @@ import cc.carm.lib.configuration.core.value.type.ConfiguredMap; import cc.carm.lib.configuration.core.value.type.ConfiguredSection; import cc.carm.lib.configuration.core.value.type.ConfiguredValue; -import config.model.TestModel; +import cc.carm.lib.configuration.demo.tests.model.TestModel; import java.util.List; import java.util.Map; @@ -32,14 +32,10 @@ public class DemoConfiguration extends ConfigurationRoot { // 支持通过 Class 变量标注子配置,一并注册。 // 注意: 若对应类也有注解,则优先使用类的注解。 - @ConfigPath("impl-test") //支持通过注解修改子配置的主路径,若不修改则以变量名自动生成。 + @ConfigPath("other-class-config") //支持通过注解修改子配置的主路径,若不修改则以变量名自动生成。 @HeaderComment({"", "Something..."}) // 支持给子路径直接打注释 @InlineComment("InlineComments for class path") - public static final Class IMPL = ImplConfiguration.class; - - // 子配置文件 - @ConfigPath("database") - public static final Class DB_CONFIG = DatabaseConfiguration.class; + public static final Class OTHER = OtherConfiguration.class; @ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 @HeaderComment({"", "Section类型数据测试"}) // 通过注解给配置添加注释。 @@ -79,7 +75,6 @@ public static class That extends ConfigurationRoot { .build(); } - } 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 new file mode 100644 index 0000000..cb0fd2c --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/OtherConfiguration.java @@ -0,0 +1,4 @@ +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/TestConfiguration.java new file mode 100644 index 0000000..dd406b1 --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java @@ -0,0 +1,30 @@ +package cc.carm.lib.configuration.demo.tests.conf; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.ConfigPath; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.annotation.InlineComment; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredSection; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; +import cc.carm.lib.configuration.demo.tests.model.TestModel; + +import java.util.UUID; + +public class TestConfiguration extends ConfigurationRoot { + + public final TestInnerConfiguration INNER = new TestInnerConfiguration(); + + public final ConfigValue CLASS_VALUE = ConfiguredValue.of(Double.class, 1.0D); + + @ConfigPath("test.user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 + @HeaderComment({"", "Section类型数据测试"}) // 通过注解给配置添加注释。 + @InlineComment("Section数据也支持InlineComment注释") + public final ConfigValue TEST_MODEL = ConfiguredSection + .builder(TestModel.class) + .defaults(new TestModel("Carm", UUID.randomUUID())) + .parseValue((section, defaultValue) -> TestModel.deserialize(section)) + .serializeValue(TestModel::serialize).build(); + + +} 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/TestInnerConfiguration.java new file mode 100644 index 0000000..8385a6a --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java @@ -0,0 +1,13 @@ +package cc.carm.lib.configuration.demo.tests.conf; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.HeaderComment; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.core.value.type.ConfiguredValue; + +@HeaderComment("Inner Test") +public class TestInnerConfiguration extends ConfigurationRoot { + + public final ConfigValue INNER_VALUE = ConfiguredValue.of(Double.class, 1.0D); + +} diff --git a/impl/json/src/test/java/config/model/AbstractModel.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java similarity index 84% rename from impl/json/src/test/java/config/model/AbstractModel.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java index ab5fdcd..f12e411 100644 --- a/impl/json/src/test/java/config/model/AbstractModel.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/AbstractModel.java @@ -1,4 +1,4 @@ -package config.model; +package cc.carm.lib.configuration.demo.tests.model; import org.jetbrains.annotations.NotNull; diff --git a/impl/json/src/test/java/config/model/TestModel.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java similarity index 96% rename from impl/json/src/test/java/config/model/TestModel.java rename to demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java index 6deb536..9e53d95 100644 --- a/impl/json/src/test/java/config/model/TestModel.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java @@ -1,4 +1,4 @@ -package config.model; +package cc.carm.lib.configuration.demo.tests.model; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.jetbrains.annotations.NotNull; diff --git a/impl/json/pom.xml b/impl/json/pom.xml index 5b4a36d..1b52404 100644 --- a/impl/json/pom.xml +++ b/impl/json/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 3.2.1 + 3.3.0 ../../pom.xml 4.0.0 @@ -27,6 +27,13 @@ compile + + ${project.parent.groupId} + easyconfiguration-demo + ${project.parent.version} + test + + com.google.code.gson gson diff --git a/impl/json/src/test/java/config/JSONConfigTest.java b/impl/json/src/test/java/config/JSONConfigTest.java index dfe5d41..5980c3c 100644 --- a/impl/json/src/test/java/config/JSONConfigTest.java +++ b/impl/json/src/test/java/config/JSONConfigTest.java @@ -1,67 +1,28 @@ package config; import cc.carm.lib.configuration.EasyConfiguration; +import cc.carm.lib.configuration.demo.tests.ConfigurationTest; import cc.carm.lib.configuration.json.JSONConfigProvider; -import config.model.TestModel; -import config.source.DemoConfiguration; import org.junit.Test; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - public class JSONConfigTest { - protected final JSONConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml"); + protected final JSONConfigProvider provider = EasyConfiguration.from("target/config.json", "config.json"); @Test public void onTest() { - provider.initialize(DemoConfiguration.class); + ConfigurationTest.testDemo(this.provider); + ConfigurationTest.testInner(this.provider); - testDemo(); System.out.println("----------------------------------------------------"); provider.getConfiguration().getValues(true).forEach((k, v) -> System.out.println(k + ": " + v)); System.out.println("----------------------------------------------------"); provider.getConfiguration().getValues(false).forEach((k, v) -> System.out.println(k + ": " + v)); System.out.println("----------------------------------------------------"); - - try { - provider.save(); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - public static void testDemo() { - System.out.println("----------------------------------------------------"); - - 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("> Test List:"); - DemoConfiguration.Sub.That.OPERATORS.getNotNull().forEach(System.out::println); - List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); - DemoConfiguration.Sub.That.OPERATORS.set(operators); - - System.out.println("> Test Section:"); - System.out.println(DemoConfiguration.MODEL_TEST.get()); - DemoConfiguration.MODEL_TEST.set(TestModel.random()); - - System.out.println("> Test Maps:"); - DemoConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v)); - LinkedHashMap data = new LinkedHashMap<>(); - for (int i = 1; i <= 5; i++) { - data.put(i, UUID.randomUUID()); - } - DemoConfiguration.USERS.set(data); - System.out.println("----------------------------------------------------"); + + ConfigurationTest.save(this.provider); } diff --git a/impl/json/src/test/java/config/model/SomeModel.java b/impl/json/src/test/java/config/model/SomeModel.java deleted file mode 100644 index 542bf31..0000000 --- a/impl/json/src/test/java/config/model/SomeModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package config.model; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.TestOnly; - -import java.util.HashMap; -import java.util.Map; - -public class SomeModel extends AbstractModel { - - public final int num; - - public SomeModel(@NotNull String name, int num) { - super(name); - this.num = num; - } - - @Override - public String toString() { - return "SomeModel{" + - "name='" + name + '\'' + - ", num=" + num + - '}'; - } - - public @NotNull Map serialize() { - Map map = new HashMap<>(); - map.put("name", name); - map.put("num", num); - return map; - } - - @TestOnly - public static SomeModel deserialize(Map args) { - return new SomeModel((String) args.get("name"), (Integer) args.get("num")); - } - - -} diff --git a/impl/json/src/test/java/config/source/DatabaseConfiguration.java b/impl/json/src/test/java/config/source/DatabaseConfiguration.java deleted file mode 100644 index 78027b5..0000000 --- a/impl/json/src/test/java/config/source/DatabaseConfiguration.java +++ /dev/null @@ -1,30 +0,0 @@ -package config.source; - -import cc.carm.lib.configuration.core.ConfigurationRoot; -import cc.carm.lib.configuration.core.annotation.HeaderComment; -import cc.carm.lib.configuration.core.annotation.ConfigPath; -import cc.carm.lib.configuration.core.value.ConfigValue; -import cc.carm.lib.configuration.core.value.type.ConfiguredValue; - -@HeaderComment({"数据库配置", " 用于提供数据库连接,进行数据库操作。"}) -public class DatabaseConfiguration extends ConfigurationRoot { - - @ConfigPath("driver") - protected static final ConfigValue DRIVER_NAME = ConfiguredValue.of( - String.class, "com.mysql.cj.jdbc.Driver" - ); - - protected static final ConfigValue HOST = ConfiguredValue.of(String.class, "127.0.0.1"); - protected static final ConfigValue PORT = ConfiguredValue.of(Integer.class, 3306); - - protected static final ConfigValue DATABASE = ConfiguredValue.of(String.class, "minecraft"); - protected static final ConfigValue USERNAME = ConfiguredValue.of(String.class, "root"); - protected static final ConfigValue PASSWORD = ConfiguredValue.of(String.class, "password"); - - protected static final ConfigValue EXTRA = ConfiguredValue.of(String.class, "?useSSL=false"); - - protected static String buildJDBC() { - return String.format("jdbc:mysql://%s:%s/%s%s", HOST.get(), PORT.get(), DATABASE.get(), EXTRA.get()); - } - -} diff --git a/impl/json/src/test/java/config/source/DemoConfiguration.java b/impl/json/src/test/java/config/source/DemoConfiguration.java deleted file mode 100644 index 3f219e3..0000000 --- a/impl/json/src/test/java/config/source/DemoConfiguration.java +++ /dev/null @@ -1,65 +0,0 @@ -package config.source; - -import cc.carm.lib.configuration.core.ConfigurationRoot; -import cc.carm.lib.configuration.core.annotation.ConfigPath; -import cc.carm.lib.configuration.core.value.ConfigValue; -import cc.carm.lib.configuration.core.value.type.ConfiguredList; -import cc.carm.lib.configuration.core.value.type.ConfiguredMap; -import cc.carm.lib.configuration.core.value.type.ConfiguredSection; -import cc.carm.lib.configuration.core.value.type.ConfiguredValue; -import config.model.TestModel; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; - -public class DemoConfiguration extends ConfigurationRoot { - - @ConfigPath(root = true) - protected static final ConfigValue VERSION = ConfiguredValue.of(Double.class, 1.0D); - - // 可以直接写静态内部类,并通过 Class 声明。 - public static final Class SUB_TEST = Sub.class; - - @ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。 - public static final ConfigValue MODEL_TEST = ConfiguredSection - .builder(TestModel.class) - .defaults(new TestModel("Carm", UUID.randomUUID())) - .parseValue((section, defaultValue) -> TestModel.deserialize(section)) - .serializeValue(TestModel::serialize).build(); - - // 子配置文件 - @ConfigPath("database") - public static final Class DB_CONFIG = DatabaseConfiguration.class; - - public static final ConfigValue> USERS = ConfiguredMap - .builder(Integer.class, UUID.class).fromString() - .parseKey(Integer::parseInt) - .parseValue(v -> Objects.requireNonNull(UUID.fromString(v))) - .build(); - - - public static class Sub extends ConfigurationRoot { - - @ConfigPath(value = "uuid-value", root = true) - public static final ConfigValue UUID_CONFIG_VALUE = ConfiguredValue - .builder(UUID.class).fromString() - .parseValue((data, defaultValue) -> UUID.fromString(data)) - .build(); - - public static final Class NOTHING = That.class; - - public static class That extends ConfigurationRoot { - - public static final ConfigValue> OPERATORS = ConfiguredList - .builder(UUID.class).fromString() - .parseValue(s -> Objects.requireNonNull(UUID.fromString(s))) - .build(); - - } - - } - - -} diff --git a/impl/sql/pom.xml b/impl/sql/pom.xml index a0d2590..045ab0f 100644 --- a/impl/sql/pom.xml +++ b/impl/sql/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 3.2.1 + 3.3.0 ../../pom.xml 4.0.0 diff --git a/impl/yaml/pom.xml b/impl/yaml/pom.xml index 6e2985e..6a52941 100644 --- a/impl/yaml/pom.xml +++ b/impl/yaml/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 3.2.1 + 3.3.0 ../../pom.xml 4.0.0 @@ -28,6 +28,13 @@ compile + + ${project.parent.groupId} + easyconfiguration-demo + ${project.parent.version} + test + + org.bspfsystems yamlconfiguration diff --git a/impl/yaml/src/test/java/config/DemoConfigTest.java b/impl/yaml/src/test/java/config/DemoConfigTest.java index dd61769..ea9f146 100644 --- a/impl/yaml/src/test/java/config/DemoConfigTest.java +++ b/impl/yaml/src/test/java/config/DemoConfigTest.java @@ -1,85 +1,45 @@ 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.yaml.YAMLConfigProvider; -import config.model.AbstractModel; +import config.model.AnyModel; import config.model.SomeModel; -import config.model.TestModel; -import config.source.DemoConfiguration; -import config.source.ImplConfiguration; +import config.source.ModelConfiguration; import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerialization; import org.junit.Test; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - public class DemoConfigTest { static { - ConfigurationSerialization.registerClass(TestModel.class); ConfigurationSerialization.registerClass(SomeModel.class); + ConfigurationSerialization.registerClass(AnyModel.class); } protected final YAMLConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml"); @Test public void onTest() { - provider.initialize(DemoConfiguration.class); - - testDemo(); - testSerialization(); + ConfigurationTest.testDemo(this.provider); + ConfigurationTest.testInner(this.provider); - try { - provider.save(); - } catch (Exception e) { - e.printStackTrace(); - } + testSerialization(this.provider); + ConfigurationTest.save(this.provider); } - public static void testDemo() { + public static void testSerialization(YAMLConfigProvider provider) { + provider.initialize(ModelConfiguration.class); System.out.println("----------------------------------------------------"); - System.out.println("Test Number: "); - - System.out.println("before: " + DemoConfiguration.TEST_NUMBER.get()); - DemoConfiguration.TEST_NUMBER.set((long) (Long.MAX_VALUE * Math.random())); - 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("> Test List:"); - DemoConfiguration.Sub.That.OPERATORS.getNotNull().forEach(System.out::println); - List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); - DemoConfiguration.Sub.That.OPERATORS.set(operators); + AbstractModel someModel = ModelConfiguration.SOME_MODEL.get(); + if (someModel != null) System.out.println(someModel.getName()); - System.out.println("> Test Section:"); - System.out.println(DemoConfiguration.MODEL_TEST.get()); - DemoConfiguration.MODEL_TEST.set(TestModel.random()); + AbstractModel anyModel = ModelConfiguration.ANY_MODEL.get(); + if (anyModel != null) System.out.println(anyModel.getName()); - System.out.println("> Test Maps:"); - DemoConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v)); - LinkedHashMap data = new LinkedHashMap<>(); - for (int i = 1; i <= 5; i++) { - data.put(i, UUID.randomUUID()); - } - DemoConfiguration.USERS.set(data); - System.out.println("----------------------------------------------------"); - } - - public static void testSerialization() { - System.out.println("----------------------------------------------------"); - AbstractModel model = ImplConfiguration.TEST.get(); - if (model != null) { - System.out.println(model.getName()); - } System.out.println("----------------------------------------------------"); } diff --git a/impl/yaml/src/test/java/config/model/AbstractModel.java b/impl/yaml/src/test/java/config/model/AbstractModel.java deleted file mode 100644 index 19943e4..0000000 --- a/impl/yaml/src/test/java/config/model/AbstractModel.java +++ /dev/null @@ -1,17 +0,0 @@ -package config.model; - -import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; -import org.jetbrains.annotations.NotNull; - -public abstract class AbstractModel implements ConfigurationSerializable { - - protected final @NotNull String name; - - public AbstractModel(@NotNull String name) { - this.name = name; - } - - public @NotNull String getName() { - return name; - } -} diff --git a/impl/yaml/src/test/java/config/model/AnyModel.java b/impl/yaml/src/test/java/config/model/AnyModel.java new file mode 100644 index 0000000..f123d09 --- /dev/null +++ b/impl/yaml/src/test/java/config/model/AnyModel.java @@ -0,0 +1,50 @@ +package config.model; + +import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; +import org.bspfsystems.yamlconfiguration.serialization.SerializableAs; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@SerializableAs("AnyModel") +public class AnyModel extends AbstractModel implements ConfigurationSerializable { + + public final boolean bool; + + public AnyModel(@NotNull String name, boolean bool) { + super(name); + this.bool = bool; + } + + @Override + public String toString() { + return "AnyModel{" + + "name='" + name + '\'' + + ", bool=" + bool + + '}'; + } + + @Override + public @NotNull Map serialize() { + Map map = new HashMap<>(); + map.put("name", name); + map.put("state", bool); + return map; + } + + public static AnyModel random() { + return new AnyModel(UUID.randomUUID().toString().substring(0, 5), Math.random() > 0.5); + } + + + @TestOnly + public static AnyModel deserialize(Map args) { + return new AnyModel((String) args.get("name"), (Boolean) args.get("state")); + } + + +} diff --git a/impl/yaml/src/test/java/config/model/SomeModel.java b/impl/yaml/src/test/java/config/model/SomeModel.java index 45cb736..65fdf21 100644 --- a/impl/yaml/src/test/java/config/model/SomeModel.java +++ b/impl/yaml/src/test/java/config/model/SomeModel.java @@ -1,5 +1,6 @@ package config.model; +import cc.carm.lib.configuration.demo.tests.model.AbstractModel; import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; import org.bspfsystems.yamlconfiguration.serialization.SerializableAs; import org.jetbrains.annotations.NotNull; @@ -7,6 +8,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.UUID; @SerializableAs("SomeModel") public class SomeModel extends AbstractModel implements ConfigurationSerializable { @@ -34,6 +36,11 @@ public String toString() { return map; } + public static SomeModel random() { + return new SomeModel(UUID.randomUUID().toString().substring(0, 5), (int) (Math.random() * 1000)); + } + + @TestOnly public static SomeModel deserialize(Map args) { return new SomeModel((String) args.get("name"), (Integer) args.get("num")); diff --git a/impl/yaml/src/test/java/config/model/TestModel.java b/impl/yaml/src/test/java/config/model/TestModel.java deleted file mode 100644 index 7fd67c1..0000000 --- a/impl/yaml/src/test/java/config/model/TestModel.java +++ /dev/null @@ -1,72 +0,0 @@ -package config.model; - -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; -import org.bspfsystems.yamlconfiguration.serialization.SerializableAs; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.TestOnly; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -@SerializableAs("TestModel") -public class TestModel extends AbstractModel implements ConfigurationSerializable { - - public UUID uuid; - - public TestModel(String name, UUID uuid) { - super(name); - this.uuid = uuid; - } - - public void setUuid(UUID uuid) { - this.uuid = uuid; - } - - public UUID getUuid() { - return uuid; - } - - @Override - public @NotNull Map serialize() { - Map map = new HashMap<>(); - map.put("name", name); - Map map2 = new HashMap<>(); - map2.put("uuid", uuid.toString()); - map.put("info", map2); - return map; - } - - public static TestModel deserialize(ConfigurationWrapper 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)); - } - - @TestOnly - @SuppressWarnings("unchecked") - public static TestModel deserialize(Map args) { - String name = (String) args.get("name"); - if (name == null) throw new NullPointerException("name is null"); - Map map = (Map) args.get("info"); - String uuidString = (String) map.get("uuid"); - if (uuidString == null) throw new NullPointerException("uuid is null"); - return new TestModel(name, UUID.fromString(uuidString)); - } - - public static TestModel random() { - return new TestModel(UUID.randomUUID().toString().substring(0, 5), UUID.randomUUID()); - } - - - @Override - public String toString() { - return "TestUser{" + - "name='" + name + '\'' + - ", uuid=" + uuid + - '}'; - } -} \ No newline at end of file diff --git a/impl/yaml/src/test/java/config/source/ImplConfiguration.java b/impl/yaml/src/test/java/config/source/ImplConfiguration.java deleted file mode 100644 index 1000cde..0000000 --- a/impl/yaml/src/test/java/config/source/ImplConfiguration.java +++ /dev/null @@ -1,18 +0,0 @@ -package config.source; - -import cc.carm.lib.configuration.core.ConfigurationRoot; -import cc.carm.lib.configuration.core.annotation.ConfigPath; -import cc.carm.lib.configuration.core.value.ConfigValue; -import cc.carm.lib.configuration.yaml.value.ConfiguredSerializable; -import config.model.AbstractModel; -import config.model.TestModel; - -@ConfigPath(root = true) -public class ImplConfiguration extends ConfigurationRoot { - - public static final ConfigValue TEST = ConfiguredSerializable.of( - TestModel.class, TestModel.random() - ); - - -} diff --git a/impl/yaml/src/test/java/config/source/ModelConfiguration.java b/impl/yaml/src/test/java/config/source/ModelConfiguration.java new file mode 100644 index 0000000..0e12c6f --- /dev/null +++ b/impl/yaml/src/test/java/config/source/ModelConfiguration.java @@ -0,0 +1,22 @@ +package config.source; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.ConfigPath; +import cc.carm.lib.configuration.core.value.ConfigValue; +import cc.carm.lib.configuration.demo.tests.model.AbstractModel; +import cc.carm.lib.configuration.yaml.value.ConfiguredSerializable; +import config.model.AnyModel; +import config.model.SomeModel; + +@ConfigPath("model-test") +public class ModelConfiguration extends ConfigurationRoot { + + public static final ConfigValue SOME_MODEL = ConfiguredSerializable.of( + SomeModel.class, SomeModel.random() + ); + + public static final ConfigValue ANY_MODEL = ConfiguredSerializable.of( + AnyModel.class, AnyModel.random() + ); + +} diff --git a/pom.xml b/pom.xml index 5e2729d..ba17af5 100644 --- a/pom.xml +++ b/pom.xml @@ -15,12 +15,13 @@ cc.carm.lib easyconfiguration-parent pom - 3.2.1 + 3.3.0 core impl/yaml impl/json impl/sql + demo EasyConfiguration