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 extends ConfigurationRoot> 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 super
if (Number.class.isAssignableFrom(valueClass)) {
if (Long.class.isAssignableFrom(valueClass)) {
- input = longValue().parse(input, null);
+ input = longValue().parse(input, (Long) defaultValue);
} else if (Integer.class.isAssignableFrom(valueClass)) {
- input = intValue().parse(input, null);
+ input = intValue().parse(input, (Integer) defaultValue);
} else if (Float.class.isAssignableFrom(valueClass)) {
- input = floatValue().parse(input, null);
+ input = floatValue().parse(input, (Float) defaultValue);
} else if (Double.class.isAssignableFrom(valueClass)) {
- input = doubleValue().parse(input, null);
+ input = doubleValue().parse(input, (Double) defaultValue);
} else if (Byte.class.isAssignableFrom(valueClass)) {
- input = byteValue().parse(input, null);
+ input = byteValue().parse(input, (Byte) defaultValue);
} else if (Short.class.isAssignableFrom(valueClass)) {
- input = shortValue().parse(input, null);
+ input = shortValue().parse(input, (Short) defaultValue);
}
+ } else if (Boolean.class.isAssignableFrom(valueClass)) {
+ input = booleanValue().parse(input, (Boolean) defaultValue);
}
if (valueClass.isInstance(input)) return valueClass.cast(input);
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
index 7018fee..ee9c5d0 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
@@ -2,6 +2,8 @@
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.ConfigurationRoot;
+import cc.carm.lib.configuration.core.value.ConfigValue;
+import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
@@ -17,23 +19,54 @@ public ConfigurationProvider() {
this.updateTime = System.currentTimeMillis();
}
+ /**
+ * 得到配置文件的更新(最后加载)时间。
+ *
+ * @return 更新时间
+ */
public long getUpdateTime() {
return updateTime;
}
+ /**
+ * 用于 {@link CachedConfigValue} 判断缓存值是否过期(即缓存的时间早于配置文件的最后加载时间)。
+ *
+ * @param time 缓存值时的时间戳
+ * @return 缓存值是否过期
+ */
public boolean isExpired(long time) {
return getUpdateTime() > 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 extends ConfigurationProvider> getInitializer();
+ /**
+ * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。
+ *
+ * @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
+ */
public void initialize(Class extends ConfigurationRoot> configClazz) {
initialize(configClazz, true);
}
+ /**
+ * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。
+ *
+ * @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
+ * @param saveDefaults 是否写入默认值(默认为 true)。
+ */
public void initialize(Class extends ConfigurationRoot> 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 extends ConfigurationRoot> 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
+
+ ${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 extends AbstractModel> 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 extends AbstractModel> SOME_MODEL = ConfiguredSerializable.of(
+ SomeModel.class, SomeModel.random()
+ );
+
+ public static final ConfigValue extends AbstractModel> 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