From 72584f66ac37b8e03dfeeaca9b45f3acec139c28 Mon Sep 17 00:00:00 2001 From: CarmJos Date: Sun, 17 Apr 2022 22:36:41 +0800 Subject: [PATCH] =?UTF-8?q?[1.0.6]=20=E7=89=88=E6=9C=AC=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20-=20`[F]`=20=E4=BF=AE=E5=A4=8Dprotected=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=97=A0=E6=B3=95=E8=A2=AB=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/pom.xml | 2 +- .../configuration/core/ConfigInitializer.java | 54 +++++++++++++------ .../core/annotation/ConfigPath.java | 22 +++++++- .../core/source/impl/FileConfigProvider.java | 19 ++++--- .../core/value/type/ConfiguredList.java | 2 - core/src/test/java/NameTest.java | 18 +++++++ impl/yaml/pom.xml | 2 +- .../src/test/java/config/ConfigTester.java | 25 ++++----- .../src/test/java/config/misc/TestUser.java | 22 ++++++++ ...uration.java => ComplexConfiguration.java} | 15 ++---- .../java/config/source/DemoConfiguration.java | 48 +++++++++++++++++ impl/yaml/src/test/resources/config.yml | 3 +- platform/bungee/pom.xml | 2 +- platform/spigot/pom.xml | 2 +- pom.xml | 2 +- 15 files changed, 184 insertions(+), 54 deletions(-) create mode 100644 core/src/test/java/NameTest.java rename impl/yaml/src/test/java/config/source/{TestConfiguration.java => ComplexConfiguration.java} (75%) create mode 100644 impl/yaml/src/test/java/config/source/DemoConfiguration.java diff --git a/core/pom.xml b/core/pom.xml index e822552..2721032 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.4 + 1.0.6 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 444601a..32e836c 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 @@ -18,18 +18,26 @@ public class ConfigInitializer { } public static void initialize(ConfigurationProvider provider, Class rootClazz, boolean saveDefault) { - ConfigPath sectionAnnotation = rootClazz.getAnnotation(ConfigPath.class); - String rootSection = null; + + ConfigPath sectionAnnotation = rootClazz.getAnnotation(ConfigPath.class); if (sectionAnnotation != null && sectionAnnotation.value().length() > 1) { rootSection = sectionAnnotation.value(); } + if (rootSection != null) { + //Not usable for null section. + ConfigComment comments = rootClazz.getAnnotation(ConfigComment.class); + if (comments != null && comments.value().length > 0) { + provider.setComments(rootSection, comments.value()); + } + } + for (Class innerClass : rootClazz.getDeclaredClasses()) { initSection(provider, rootSection, innerClass, saveDefault); } - for (Field field : rootClazz.getFields()) { + for (Field field : rootClazz.getDeclaredFields()) { initValue(provider, rootSection, rootClazz, field, saveDefault); } @@ -52,21 +60,22 @@ public class ConfigInitializer { provider.setComments(parentSection, comments.value()); } - for (Field field : clazz.getFields()) initValue(provider, section, clazz, field, saveDefault); + for (Field field : clazz.getDeclaredFields()) initValue(provider, section, clazz, field, saveDefault); for (Class innerClass : clazz.getDeclaredClasses()) initSection(provider, section, innerClass, saveDefault); } private static void initValue(ConfigurationProvider provider, String parentSection, Class clazz, Field field, boolean saveDefault) { try { + field.setAccessible(true); Object object = field.get(clazz); if (object instanceof ConfigValue) { initializeValue( - provider, (ConfigValue) object, + provider, (ConfigValue) object, saveDefault, getSectionPath(field.getName(), parentSection, field.getAnnotation(ConfigPath.class)), Optional.ofNullable(field.getAnnotation(ConfigComment.class)) - .map(ConfigComment::value).orElse(new String[0]), - saveDefault); + .map(ConfigComment::value).orElse(new String[0]) + ); } } catch (IllegalAccessException ignored) { } @@ -74,7 +83,7 @@ public class ConfigInitializer { public static void initializeValue(@NotNull ConfigurationProvider provider, @NotNull ConfigValue value, - @NotNull String path, @NotNull String[] comments, boolean saveDefault) { + boolean saveDefault, @NotNull String path, @NotNull String[] comments) { value.initialize(provider, path, comments); if (saveDefault && value.getDefaultValue() != null && !provider.getConfiguration().contains(path)) { value.setDefault(); @@ -84,16 +93,31 @@ public class ConfigInitializer { public static String getSectionPath(@NotNull String name, @Nullable String parentSection, @Nullable ConfigPath pathAnnotation) { - String parent = parentSection != null ? parentSection + "." : ""; - if (pathAnnotation != null && pathAnnotation.value().length() > 0) { - return parent + pathAnnotation.value(); - } else { - return parent + getSectionName(name); + @NotNull String parent = parentSection != null ? parentSection + "." : ""; + @NotNull String path = getSectionName(name); + boolean root = false; + if (pathAnnotation != null) { + if (pathAnnotation.value().length() > 0) path = pathAnnotation.value(); + root = pathAnnotation.root(); } + return (root ? "" : parent) + path; } - public static String getSectionName(String codeName) { - return codeName.toLowerCase().replace("_", "-"); + /** + * 得到指定元素的配置名称。 + * 采用 全小写,以“-”链接 的命名规则。 + * + * @param name 源名称 + * @return 全小写,以“-”链接 的 路径名称 + */ + public static String getSectionName(String name) { + return name.replaceAll("[A-Z]", "-$0") // 将驼峰转换为蛇形; + .replaceAll("-(.*)", "$1") // 若首字母也为大写,则也会被转换,需要去掉第一个横线 + .replaceAll("_-([A-Z])", "_$1") // 因为命名中可能包含 _,因此需要被特殊处理一下 + .replaceAll("([a-z])-([A-Z])", "$1_$2") // 然后将非全大写命名的内容进行转换 + .replace("-", "") // 移除掉多余的横线 + .replace("_", "-") // 将下划线替换为横线 + .toLowerCase(); // 最后转为全小写 } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java b/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java index a4dc331..5fb2b52 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java @@ -1,14 +1,34 @@ package cc.carm.lib.configuration.core.annotation; +import cc.carm.lib.configuration.core.ConfigInitializer; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +/** + * 用于标记对应类或参数的配置路径 + */ @Target({ElementType.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ConfigPath { - String value(); + /** + * 指定路径的值。 + * 若不指定,则会通过 {@link ConfigInitializer#getSectionName(String)}自动生成当前路径的值。 + * + * @return 路径的值 + */ + String value() default ""; + + /** + * 是否从根节点开始。 + *
若为 false,则会自动添加上一个路径(如果有)到本节点的路径。 + *
若为 true,则会从根节点开始直接设置本路径。 + * + * @return 是否不继承上一路径,直接从根路径为开始 + */ + boolean root() default false; } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java b/core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java index ff36ca5..e64358c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java @@ -22,17 +22,22 @@ public abstract class FileConfigProvider extends ConfigurationProvider { } public void initializeFile(@Nullable String sourcePath) throws IOException { - if (getFile().exists()) return; - if (!getFile().getParentFile().exists() && !getFile().getParentFile().mkdirs()) { + if (this.file.exists()) return; + + File parent = this.file.getParentFile(); + if (parent != null && !parent.exists() && !parent.mkdirs()) { throw new IOException("Failed to create directory " + file.getParentFile().getAbsolutePath()); } - if (!getFile().createNewFile()) { + + if (!this.file.createNewFile()) { throw new IOException("Failed to create file " + file.getAbsolutePath()); } - if (sourcePath == null) return; - try { - saveResource(sourcePath, true); - } catch (Exception ignored) { + + if (sourcePath != null) { + try { + saveResource(sourcePath, true); + } catch (Exception ignored) { + } } } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java index 77e4d18..62cdd1e 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java @@ -1,11 +1,9 @@ package cc.carm.lib.configuration.core.value.type; -import cc.carm.lib.configuration.core.builder.ConfigBuilder; import cc.carm.lib.configuration.core.builder.list.ConfigListBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.core.value.CachedConfigValue; -import cc.carm.lib.configuration.core.value.ConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/core/src/test/java/NameTest.java b/core/src/test/java/NameTest.java new file mode 100644 index 0000000..b1d935e --- /dev/null +++ b/core/src/test/java/NameTest.java @@ -0,0 +1,18 @@ +import cc.carm.lib.configuration.core.ConfigInitializer; +import org.junit.Test; + +public class NameTest { + + + @Test + public void onTest() { + + System.out.println(ConfigInitializer.getSectionName("LoveGames")); // -> love-games + System.out.println(ConfigInitializer.getSectionName("EASY_GAME")); // -> easy-game + System.out.println(ConfigInitializer.getSectionName("F")); //-? f + System.out.println(ConfigInitializer.getSectionName("Test123123")); // -? test123123123 + + } + + +} diff --git a/impl/yaml/pom.xml b/impl/yaml/pom.xml index 6dc0bcc..2a24c8b 100644 --- a/impl/yaml/pom.xml +++ b/impl/yaml/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.4 + 1.0.6 ../../pom.xml 4.0.0 diff --git a/impl/yaml/src/test/java/config/ConfigTester.java b/impl/yaml/src/test/java/config/ConfigTester.java index 8762e67..ed52fa4 100644 --- a/impl/yaml/src/test/java/config/ConfigTester.java +++ b/impl/yaml/src/test/java/config/ConfigTester.java @@ -1,10 +1,10 @@ package config; import cc.carm.lib.configuration.EasyConfiguration; -import cc.carm.lib.configuration.core.ConfigInitializer; import cc.carm.lib.configuration.yaml.YamlConfigProvider; import config.misc.TestUser; -import config.source.TestConfiguration; +import config.source.DemoConfiguration; +import config.source.ComplexConfiguration; import org.junit.Test; import java.util.LinkedHashMap; @@ -19,27 +19,28 @@ public class ConfigTester { public void onTest() { YamlConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml"); - ConfigInitializer.initialize(provider, TestConfiguration.class, true); + provider.initialize(DemoConfiguration.class); + provider.initialize(ComplexConfiguration.class); - System.out.println("before: " + TestConfiguration.Sub.UUID_CONFIG_VALUE.get()); - TestConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID()); - System.out.println("after: " + TestConfiguration.Sub.UUID_CONFIG_VALUE.get()); + System.out.println("before: " + ComplexConfiguration.Sub.UUID_CONFIG_VALUE.get()); + ComplexConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID()); + System.out.println("after: " + ComplexConfiguration.Sub.UUID_CONFIG_VALUE.get()); - TestConfiguration.Sub.That.Operators.getNotNull().forEach(System.out::println); + ComplexConfiguration.Sub.That.Operators.getNotNull().forEach(System.out::println); List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); - TestConfiguration.Sub.That.Operators.set(operators); + ComplexConfiguration.Sub.That.Operators.set(operators); - System.out.println(TestConfiguration.USER.get()); + System.out.println(ComplexConfiguration.USER.get()); TestUser b = new TestUser(UUID.randomUUID().toString().substring(0, 3), UUID.randomUUID()); - TestConfiguration.USER.set(b); + ComplexConfiguration.USER.set(b); - TestConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v)); + ComplexConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v)); LinkedHashMap data = new LinkedHashMap<>(); for (int i = 0; i < 5; i++) { data.put((int) (1000 * Math.random()), UUID.randomUUID()); } - TestConfiguration.USERS.set(data); + ComplexConfiguration.USERS.set(data); try { provider.save(); diff --git a/impl/yaml/src/test/java/config/misc/TestUser.java b/impl/yaml/src/test/java/config/misc/TestUser.java index 4f826eb..8755c11 100644 --- a/impl/yaml/src/test/java/config/misc/TestUser.java +++ b/impl/yaml/src/test/java/config/misc/TestUser.java @@ -1,5 +1,10 @@ package config.misc; +import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; import java.util.UUID; public class TestUser { @@ -28,6 +33,23 @@ public class TestUser { return uuid; } + 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 TestUser deserialize(ConfigurationWrapper section) throws Exception { + 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 TestUser(name, UUID.fromString(uuidString)); + } + @Override public String toString() { return "TestUser{" + diff --git a/impl/yaml/src/test/java/config/source/TestConfiguration.java b/impl/yaml/src/test/java/config/source/ComplexConfiguration.java similarity index 75% rename from impl/yaml/src/test/java/config/source/TestConfiguration.java rename to impl/yaml/src/test/java/config/source/ComplexConfiguration.java index f4a2d66..9a27f07 100644 --- a/impl/yaml/src/test/java/config/source/TestConfiguration.java +++ b/impl/yaml/src/test/java/config/source/ComplexConfiguration.java @@ -3,7 +3,6 @@ package config.source; import cc.carm.lib.configuration.core.ConfigurationRoot; import cc.carm.lib.configuration.core.annotation.ConfigComment; import cc.carm.lib.configuration.core.annotation.ConfigPath; -import cc.carm.lib.configuration.core.util.MapFactory; 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; @@ -16,20 +15,14 @@ import java.util.Map; import java.util.Objects; import java.util.UUID; -public class TestConfiguration extends ConfigurationRoot { +public class ComplexConfiguration extends ConfigurationRoot { @ConfigComment({"User测试"}) public static final ConfigValue USER = ConfiguredSection .builder(TestUser.class) .defaults(new TestUser("Carm", UUID.randomUUID())) - .parseValue((section, defaultValue) -> new TestUser( - section.getString("name"), - UUID.fromString(section.getString("user.uuid", UUID.randomUUID().toString())) - )).serializeValue(user -> MapFactory.linkedMap() - .put("name", user.getName()) - .put("user.uuid", user.getUuid().toString()) - .build() - ).build(); + .parseValue((section, defaultValue) -> TestUser.deserialize(section)) + .serializeValue(TestUser::serialize).build(); @ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"}) public static final ConfigValue> USERS = ConfiguredMap @@ -40,7 +33,7 @@ public class TestConfiguration extends ConfigurationRoot { public static class Sub { - @ConfigPath("uuid") + @ConfigPath(value = "uuid", root = true) public static final ConfigValue UUID_CONFIG_VALUE = ConfiguredValue .builder(UUID.class).fromString() .parseValue((data, defaultValue) -> UUID.fromString(data)) diff --git a/impl/yaml/src/test/java/config/source/DemoConfiguration.java b/impl/yaml/src/test/java/config/source/DemoConfiguration.java new file mode 100644 index 0000000..51b117d --- /dev/null +++ b/impl/yaml/src/test/java/config/source/DemoConfiguration.java @@ -0,0 +1,48 @@ +package config.source; + +import cc.carm.lib.configuration.core.ConfigurationRoot; +import cc.carm.lib.configuration.core.annotation.ConfigComment; +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; + +@ConfigPath("database") +@ConfigComment({"数据库配置", " 用于提供数据库连接,进行数据库操作。"}) +public class DemoConfiguration extends ConfigurationRoot { + + @ConfigPath(root = true) + @ConfigComment({ + "有时候,需要在配置文件最上面显示点东西,", + "此时就推荐添加一个可以用到但并不重要的参数到最上面", + "并给他添加对应的注释。" + }) + protected static final ConfigValue VERSION = ConfiguredValue.of(Double.class, 1.0D); + + + @ConfigPath("driver") + @ConfigComment({ + "数据库驱动配置,请根据数据库类型设置。", + "- MySQL: com.mysql.cj.jdbc.Driver", + "- MariaDB(推荐): org.mariadb.jdbc.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/yaml/src/test/resources/config.yml b/impl/yaml/src/test/resources/config.yml index 749f192..b12b56a 100644 --- a/impl/yaml/src/test/resources/config.yml +++ b/impl/yaml/src/test/resources/config.yml @@ -1 +1,2 @@ -something: 123123 \ No newline at end of file +# Test Header +version: 1.0 \ No newline at end of file diff --git a/platform/bungee/pom.xml b/platform/bungee/pom.xml index 4e97895..1b5ca9c 100644 --- a/platform/bungee/pom.xml +++ b/platform/bungee/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.4 + 1.0.6 ../../pom.xml 4.0.0 diff --git a/platform/spigot/pom.xml b/platform/spigot/pom.xml index c416a39..8252c8d 100644 --- a/platform/spigot/pom.xml +++ b/platform/spigot/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.4 + 1.0.6 ../../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index 8523df7..f3cf858 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ cc.carm.lib easyconfiguration-parent pom - 1.0.4 + 1.0.6 core