1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2026-06-04 10:38:19 +08:00

feat(interface): Support interface root configurations.

This commit is contained in:
2023-12-23 22:24:34 +08:00
parent 60eed8a14d
commit db8b227317
10 changed files with 116 additions and 59 deletions
@@ -14,7 +14,7 @@ import java.util.List;
/**
* 配置文件类初始化方法
* 用于初始化 {@link ConfigurationRoot} 中的每个 {@link ConfigValue} 对象
* 用于初始化 {@link Configuration} 中的每个 {@link ConfigValue} 对象
*
* @param <T> {@link ConfigurationProvider} 配置文件的数据来源
* @author CarmJos
@@ -30,21 +30,21 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
/**
* 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。
*
* @param clazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
* @param clazz 配置文件类,须继承于 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
*/
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz, boolean saveDefaults) {
public void initialize(@NotNull Class<? extends Configuration> clazz, boolean saveDefaults) {
initialize(clazz, saveDefaults, true);
}
/**
* 初始化指定类的所有 {@link ConfigValue} 对象。
*
* @param clazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
* @param clazz 配置文件类,须继承于 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
* @param loadSubClasses 是否加载内部子类(默认为 true)。
*/
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz,
public void initialize(@NotNull Class<? extends Configuration> clazz,
boolean saveDefaults, boolean loadSubClasses) {
initializeStaticClass(
clazz, null, null,
@@ -61,21 +61,21 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
}
/**
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。
*
* @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。
* @param config 配置文件实例类,须实现 {@link Configuration} 。
*/
public void initialize(@NotNull ConfigurationRoot config) {
public void initialize(@NotNull Configuration config) {
initialize(config, true);
}
/**
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。
*
* @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。
* @param config 配置文件实例类,须实现 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
*/
public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) {
public void initialize(@NotNull Configuration config, boolean saveDefaults) {
initializeInstance(
config, null, null,
null, null, null,
@@ -92,7 +92,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
// 针对实例类的初始化方法
private void initializeInstance(@NotNull ConfigurationRoot root,
private void initializeInstance(@NotNull Configuration root,
@Nullable String parentPath, @Nullable String fieldName,
@Nullable ConfigPath fieldPath,
@Nullable HeaderComment fieldHeaderComments,
@@ -114,7 +114,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
@Nullable HeaderComment fieldHeaderComments,
@Nullable InlineComment fieldInlineComments,
boolean saveDefaults, boolean loadSubClasses) {
if (!ConfigurationRoot.class.isAssignableFrom(clazz)) return; // 只解析继承了 ConfigurationRoot 的类
if (!Configuration.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));
@@ -147,10 +147,10 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
field.getAnnotation(InlineComment.class),
saveDefaults
);
} else if (source instanceof ConfigurationRoot && object instanceof ConfigurationRoot) {
} else if (source instanceof Configuration && object instanceof Configuration) {
// 当且仅当 源字段与字段 均为ConfigurationRoot实例时,才对目标字段进行下一步初始化加载。
initializeInstance(
(ConfigurationRoot) object, parent, field.getName(),
(Configuration) object, parent, field.getName(),
field.getAnnotation(ConfigPath.class),
field.getAnnotation(HeaderComment.class),
field.getAnnotation(InlineComment.class),
@@ -0,0 +1,8 @@
package cc.carm.lib.configuration.core;
/**
* The root interface of the configuration file interfaces,
* which is used to label and record the configuration information.
*/
public interface Configuration {
}
@@ -1,7 +1,8 @@
package cc.carm.lib.configuration.core;
/**
* 配置文件类的根节点,用于标注该类用于记录配置文件中的配置信息。
* The root node of the configuration file class,
* which is used to label and record the configuration information.
*/
public abstract class ConfigurationRoot {
public abstract class ConfigurationRoot implements Configuration {
}
@@ -1,7 +1,8 @@
package cc.carm.lib.configuration.core.source;
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.ConfigurationRoot;
import cc.carm.lib.configuration.core.Configuration;
import cc.carm.lib.configuration.core.Configuration;
import cc.carm.lib.configuration.core.value.ConfigValue;
import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
@@ -101,49 +102,49 @@ public abstract class ConfigurationProvider<W extends ConfigurationWrapper<?>> {
/**
* 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。
*
* @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
* @param configClazz 配置文件类,须继承于 {@link Configuration} 。
*/
public void initialize(Class<? extends ConfigurationRoot> configClazz) {
public void initialize(Class<? extends Configuration> configClazz) {
initialize(configClazz, true);
}
/**
* 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。
*
* @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
* @param configClazz 配置文件类,须继承于 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
*/
public void initialize(Class<? extends ConfigurationRoot> configClazz, boolean saveDefaults) {
public void initialize(Class<? extends Configuration> configClazz, boolean saveDefaults) {
this.getInitializer().initialize(configClazz, saveDefaults);
}
/**
* 初始化指定类的所有 {@link ConfigValue} 对象。
*
* @param configClazz 配置文件类,须继承于 {@link ConfigurationRoot} 。
* @param configClazz 配置文件类,须继承于 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
* @param loadSubClasses 是否加载内部子类(默认为 true)。
*/
public void initialize(Class<? extends ConfigurationRoot> configClazz, boolean saveDefaults, boolean loadSubClasses) {
public void initialize(Class<? extends Configuration> configClazz, boolean saveDefaults, boolean loadSubClasses) {
this.getInitializer().initialize(configClazz, saveDefaults, loadSubClasses);
}
/**
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。
*
* @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。
* @param config 配置文件实例类,须实现 {@link Configuration} 。
*/
public void initialize(@NotNull ConfigurationRoot config) {
public void initialize(@NotNull Configuration config) {
this.getInitializer().initialize(config, true);
}
/**
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link ConfigurationRoot} 对象。
* 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。
*
* @param config 配置文件实例类,须实现 {@link ConfigurationRoot} 。
* @param config 配置文件实例类,须实现 {@link Configuration} 。
* @param saveDefaults 是否写入默认值(默认为 true)。
*/
public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) {
public void initialize(@NotNull Configuration config, boolean saveDefaults) {
this.getInitializer().initialize(config, saveDefaults);
}
@@ -43,8 +43,7 @@ public class ConfiguredList<V> extends CachedConfigValue<List<V>> implements Lis
@Override
public @NotNull List<V> get() {
if (!isExpired()) return getCachedOrDefault(new ArrayList<>());
// 已过时的数据,需要重新解析一次。
// Data that is outdated and needs to be parsed again.
List<V> list = new ArrayList<>();
List<?> data = getConfiguration().contains(getConfigPath()) ?
getConfiguration().getList(getConfigPath()) : null;
@@ -31,37 +31,55 @@ public class ConfiguredSection<V> extends CachedConfigValue<V> {
this.serializer = serializer;
}
/**
* @return Value's type class
*/
public @NotNull Class<V> getValueClass() {
return valueClass;
}
/**
* @return Value's parser, cast value from section.
*/
public @NotNull ConfigValueParser<ConfigurationWrapper<?>, V> getParser() {
return parser;
}
/**
* @return Value's serializer, serialize value to section.
*/
public @NotNull ConfigDataFunction<V, ? extends Map<String, Object>> getSerializer() {
return serializer;
}
/**
* @return Get the value that parsed from the configuration section.
*/
@Override
public @Nullable V get() {
if (!isExpired()) return getCachedOrDefault();
// 已过时的数据,需要重新解析一次。
// Data that is outdated and needs to be parsed again.
ConfigurationWrapper<?> section = getConfiguration().getConfigurationSection(getConfigPath());
if (section == null) return getDefaultValue();
try {
// 若未出现错误,则直接更新缓存并返回。
// If there are no errors, update the cache and return.
return updateCache(this.parser.parse(section, this.defaultValue));
} catch (Exception e) {
// 出现了解析错误,提示并返回默认值。
// There was a parsing error, prompted and returned the default value.
e.printStackTrace();
return getDefaultValue();
}
}
/**
* Use the specified value to update the configuration section.
* Will use {@link #getSerializer()} to serialize the value to section.
*
* @param value The value that needs to be set in the configuration.
*/
@Override
public void set(V value) {
updateCache(value);
@@ -14,6 +14,11 @@ public class ConfiguredValue<V> extends CachedConfigValue<V> {
return builder().asValue(valueClass);
}
@SuppressWarnings("unchecked")
public static <V> ConfiguredValue<V> of(@NotNull V defaultValue) {
return of((Class<V>) defaultValue.getClass(), defaultValue);
}
public static <V> ConfiguredValue<V> of(Class<V> valueClass) {
return of(valueClass, null);
}
@@ -36,32 +41,51 @@ public class ConfiguredValue<V> extends CachedConfigValue<V> {
this.serializer = serializer;
}
/**
* @return Value's type class
*/
public @NotNull Class<V> getValueClass() {
return valueClass;
}
/**
* @return Value's parser, cast value from base object.
*/
public @NotNull ConfigValueParser<Object, V> getParser() {
return parser;
}
/**
* @return Value's serializer, serialize value to base object.
*/
public @NotNull ConfigDataFunction<V, Object> getSerializer() {
return serializer;
}
@Override
public V get() {
if (!isExpired()) return getCachedOrDefault();
// 已过时的数据,需要重新解析一次。
// Data that is outdated and needs to be parsed again.
Object value = getValue();
if (value == null) return getDefaultValue(); // 获取的值不存在,直接使用默认值。
try {
// 若未出现错误,则直接更新缓存并返回。
// If there are no errors, update the cache and return.
return updateCache(this.parser.parse(value, this.defaultValue));
} catch (Exception e) {
// 出现了解析错误,提示并返回默认值。
// There was a parsing error, prompted and returned the default value.
e.printStackTrace();
return getDefaultValue();
}
}
/**
* Set the value of the configuration path.
* Will use {@link #getSerializer()} to serialize the value.
*
* @param value The value to be set
*/
@Override
public void set(V value) {
updateCache(value);