1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2024-09-19 20:25:51 +00:00

[2.2.0] 实现内部静态类的自动注册。

This commit is contained in:
Carm Jos 2022-04-22 17:16:06 +08:00
parent ab2f898164
commit 51c287a0a7
8 changed files with 47 additions and 19 deletions

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyconfiguration-parent</artifactId> <artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>2.1.0</version> <version>2.2.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<properties> <properties>

View File

@ -18,18 +18,34 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
} }
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz, boolean saveDefaults) { public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz, boolean saveDefaults) {
initializeClass(clazz, null, null, null, null, saveDefaults); initialize(clazz, saveDefaults, true);
}
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz,
boolean saveDefaults, boolean loadSubClasses) {
initializeClass(clazz, null, null, null, null, saveDefaults, loadSubClasses);
} }
protected void initializeClass(@NotNull Class<?> clazz, protected void initializeClass(@NotNull Class<?> clazz,
@Nullable String parentPath, @Nullable String fieldName, @Nullable String parentPath, @Nullable String fieldName,
@Nullable ConfigPath fieldPath, @Nullable ConfigComment filedComments, @Nullable ConfigPath fieldPath, @Nullable ConfigComment filedComments,
boolean saveDefaults) { boolean saveDefaults, boolean loadSubClasses) {
if (!ConfigurationRoot.class.isAssignableFrom(clazz)) return;
String path = getClassPath(clazz, parentPath, fieldName, fieldPath); String path = getClassPath(clazz, parentPath, fieldName, fieldPath);
if (path != null) setComments(path, getClassComments(clazz, filedComments)); if (path != null) setComments(path, getClassComments(clazz, filedComments));
for (Field field : clazz.getDeclaredFields()) { for (Field field : clazz.getDeclaredFields()) {
initializeField(clazz, field, path, saveDefaults); initializeField(clazz, field, path, saveDefaults, loadSubClasses);
}
Class<?>[] classes = clazz.getDeclaredClasses();
if (loadSubClasses && classes.length > 0) {
// 逆向加载保持顺序
for (int i = classes.length - 1; i >= 0; i--) {
initializeClass(
classes[i], path, classes[i].getSimpleName(),
null, null,
saveDefaults, true
);
}
} }
} }
@ -39,8 +55,8 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
value.initialize(provider, saveDefaults, path, comments); value.initialize(provider, saveDefaults, path, comments);
} }
private void initializeField(@NotNull Class<?> source, @NotNull Field field, private void initializeField(@NotNull Class<?> source, @NotNull Field field, @Nullable String parent,
@Nullable String parent, boolean saveDefaults) { boolean saveDefaults, boolean loadSubClasses) {
try { try {
field.setAccessible(true); field.setAccessible(true);
@ -55,7 +71,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
(Class<?>) object, parent, field.getName(), (Class<?>) object, parent, field.getName(),
field.getAnnotation(ConfigPath.class), field.getAnnotation(ConfigPath.class),
field.getAnnotation(ConfigComment.class), field.getAnnotation(ConfigComment.class),
saveDefaults saveDefaults, loadSubClasses
); );
} }
} catch (IllegalAccessException ignored) { } catch (IllegalAccessException ignored) {

View File

@ -5,6 +5,8 @@ import cc.carm.lib.configuration.core.function.ConfigDataFunction;
import cc.carm.lib.configuration.core.value.type.ConfiguredList; import cc.carm.lib.configuration.core.value.type.ConfiguredList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, SourceListBuilder<S, V>> { public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, SourceListBuilder<S, V>> {
@ -30,6 +32,11 @@ public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, Source
this.valueSerializer = valueSerializer; this.valueSerializer = valueSerializer;
} }
@SafeVarargs
public final @NotNull SourceListBuilder<S, V> defaults(@NotNull V... values) {
return defaults(new ArrayList<>(Arrays.asList(values)));
}
public @NotNull SourceListBuilder<S, V> parseSource(ConfigDataFunction<Object, S> sourceParser) { public @NotNull SourceListBuilder<S, V> parseSource(ConfigDataFunction<Object, S> sourceParser) {
this.sourceParser = sourceParser; this.sourceParser = sourceParser;
return this; return this;

View File

@ -41,4 +41,8 @@ public abstract class ConfigurationProvider<W extends ConfigurationWrapper> {
getInitializer().initialize(configClazz, saveDefaults); getInitializer().initialize(configClazz, saveDefaults);
} }
public void initialize(Class<? extends ConfigurationRoot> configClazz, boolean saveDefaults, boolean loadSubClasses) {
getInitializer().initialize(configClazz, saveDefaults, loadSubClasses);
}
} }

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyconfiguration-parent</artifactId> <artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>2.1.0</version> <version>2.2.0</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyconfiguration-parent</artifactId> <artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>2.1.0</version> <version>2.2.0</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -1,5 +1,6 @@
package config.source; package config.source;
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.ConfigurationRoot; import cc.carm.lib.configuration.core.ConfigurationRoot;
import cc.carm.lib.configuration.core.annotation.ConfigComment; import cc.carm.lib.configuration.core.annotation.ConfigComment;
import cc.carm.lib.configuration.core.annotation.ConfigPath; import cc.carm.lib.configuration.core.annotation.ConfigPath;
@ -26,13 +27,15 @@ public class DemoConfiguration extends ConfigurationRoot {
protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D); protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D);
// 支持通过 Class<?> 变量标注子配置一并注册
// 注意 若对应类也有注解则优先使用类的注解 // 注意 若对应类也有注解则优先使用类的注解
@ConfigPath("impl-test") //支持通过注解修改子配置的主路径若不修改则以变量名自动生成 @ConfigPath("impl-test") //支持通过注解修改子配置的主路径若不修改则以变量名自动生成
@ConfigComment("Something...") // 支持给子路径直接打注释 @ConfigComment("Something...") // 支持给子路径直接打注释
public static final Class<?> IMPL = ImplConfiguration.class; public static final Class<?> IMPL = ImplConfiguration.class;
// 可以直接写静态内部类并通过 Class<?> 声明 // 子配置文件
public static final Class<?> SUB_TEST = Sub.class; @ConfigPath("database")
public static final Class<?> DB_CONFIG = DatabaseConfiguration.class;
@ConfigPath("user") // 通过注解规定配置文件中的路径若不进行注解则以变量名自动生成 @ConfigPath("user") // 通过注解规定配置文件中的路径若不进行注解则以变量名自动生成
@ConfigComment({"Section类型数据测试"}) // 通过注解给配置添加注释 @ConfigComment({"Section类型数据测试"}) // 通过注解给配置添加注释
@ -42,10 +45,6 @@ public class DemoConfiguration extends ConfigurationRoot {
.parseValue((section, defaultValue) -> TestModel.deserialize(section)) .parseValue((section, defaultValue) -> TestModel.deserialize(section))
.serializeValue(TestModel::serialize).build(); .serializeValue(TestModel::serialize).build();
// 子配置文件
@ConfigPath("database")
public static final Class<?> DB_CONFIG = DatabaseConfiguration.class;
@ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"}) @ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"})
public static final ConfigValue<Map<Integer, UUID>> USERS = ConfiguredMap public static final ConfigValue<Map<Integer, UUID>> USERS = ConfiguredMap
.builder(Integer.class, UUID.class).fromString() .builder(Integer.class, UUID.class).fromString()
@ -54,6 +53,10 @@ public class DemoConfiguration extends ConfigurationRoot {
.build(); .build();
/**
* 支持内部类的直接注册
* 注意需要使用 {@link ConfigInitializer#initialize(Class, boolean, boolean)} 方法并设定第三个参数为 true
*/
public static class Sub extends ConfigurationRoot { public static class Sub extends ConfigurationRoot {
@ConfigPath(value = "uuid-value", root = true) @ConfigPath(value = "uuid-value", root = true)
@ -62,8 +65,6 @@ public class DemoConfiguration extends ConfigurationRoot {
.parseValue((data, defaultValue) -> UUID.fromString(data)) .parseValue((data, defaultValue) -> UUID.fromString(data))
.build(); .build();
public static final Class<?> NOTHING = Sub.That.class;
public static class That extends ConfigurationRoot { public static class That extends ConfigurationRoot {
public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList

View File

@ -15,7 +15,7 @@
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easyconfiguration-parent</artifactId> <artifactId>easyconfiguration-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>2.1.0</version> <version>2.2.0</version>
<modules> <modules>
<module>core</module> <module>core</module>
<module>impl/yaml</module> <module>impl/yaml</module>