diff --git a/core/pom.xml b/core/pom.xml index 2721032..bb8fc32 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.6 + 1.1.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 32e836c..0638a65 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 @@ -11,13 +11,19 @@ import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Optional; -public class ConfigInitializer { +public class ConfigInitializer> { - public static void initialize(ConfigurationProvider source, Class rootClazz) { - initialize(source, rootClazz, true); + protected final @NotNull T provider; + + public ConfigInitializer(@NotNull T provider) { + this.provider = provider; } - public static void initialize(ConfigurationProvider provider, Class rootClazz, boolean saveDefault) { + public void initialize(Class rootClazz) { + initialize(rootClazz, true); + } + + public void initialize(Class rootClazz, boolean saveDefault) { String rootSection = null; ConfigPath sectionAnnotation = rootClazz.getAnnotation(ConfigPath.class); @@ -34,11 +40,11 @@ public class ConfigInitializer { } for (Class innerClass : rootClazz.getDeclaredClasses()) { - initSection(provider, rootSection, innerClass, saveDefault); + initSection(rootSection, innerClass, saveDefault); } for (Field field : rootClazz.getDeclaredFields()) { - initValue(provider, rootSection, rootClazz, field, saveDefault); + initValue(rootSection, rootClazz, field, saveDefault); } if (saveDefault) { @@ -51,7 +57,7 @@ public class ConfigInitializer { } - private static void initSection(ConfigurationProvider provider, String parentSection, Class clazz, boolean saveDefault) { + private void initSection(String parentSection, Class clazz, boolean saveDefault) { if (!Modifier.isStatic(clazz.getModifiers()) || !Modifier.isPublic(clazz.getModifiers())) return; String section = getSectionPath(clazz.getSimpleName(), parentSection, clazz.getAnnotation(ConfigPath.class)); @@ -60,18 +66,18 @@ public class ConfigInitializer { provider.setComments(parentSection, comments.value()); } - for (Field field : clazz.getDeclaredFields()) initValue(provider, section, clazz, field, saveDefault); - for (Class innerClass : clazz.getDeclaredClasses()) initSection(provider, section, innerClass, saveDefault); + for (Field field : clazz.getDeclaredFields()) initValue(section, clazz, field, saveDefault); + for (Class innerClass : clazz.getDeclaredClasses()) initSection(section, innerClass, saveDefault); } - private static void initValue(ConfigurationProvider provider, String parentSection, Class clazz, Field field, boolean saveDefault) { + private void initValue(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, saveDefault, + (ConfigValue) object, saveDefault, getSectionPath(field.getName(), parentSection, field.getAnnotation(ConfigPath.class)), Optional.ofNullable(field.getAnnotation(ConfigComment.class)) .map(ConfigComment::value).orElse(new String[0]) @@ -82,8 +88,8 @@ public class ConfigInitializer { } - public static void initializeValue(@NotNull ConfigurationProvider provider, @NotNull ConfigValue value, - boolean saveDefault, @NotNull String path, @NotNull String[] comments) { + public void initializeValue(@NotNull ConfigValue value, boolean saveDefault, + @NotNull String path, @NotNull String[] comments) { value.initialize(provider, path, comments); if (saveDefault && value.getDefaultValue() != null && !provider.getConfiguration().contains(path)) { value.setDefault(); diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java index f1f355c..2b6b275 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java @@ -5,20 +5,25 @@ import cc.carm.lib.configuration.core.value.ConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class AbstractConfigBuilder, T> { +public abstract class AbstractConfigBuilder, P extends ConfigurationProvider> { + protected final Class providerClass; - protected @Nullable ConfigurationProvider provider; + protected @Nullable P provider; protected @Nullable String path; protected @NotNull String[] comments = new String[0]; protected @Nullable T defaultValue; + public AbstractConfigBuilder(Class providerClass) { + this.providerClass = providerClass; + } + protected abstract @NotNull B getThis(); public abstract @NotNull ConfigValue build(); - public @NotNull B from(@Nullable ConfigurationProvider provider) { + public @NotNull B from(@Nullable P provider) { this.provider = provider; return getThis(); } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java new file mode 100644 index 0000000..72b395c --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java @@ -0,0 +1,46 @@ +package cc.carm.lib.configuration.core.builder; + +import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.core.value.ConfigValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class CommonConfigBuilder> + extends AbstractConfigBuilder> { + + protected @Nullable ConfigurationProvider provider; + protected @Nullable String path; + + protected @NotNull String[] comments = new String[0]; + protected @Nullable T defaultValue; + + public CommonConfigBuilder() { + super(ConfigurationProvider.class); + } + + protected abstract @NotNull B getThis(); + + public abstract @NotNull ConfigValue build(); + + public @NotNull B from(@Nullable ConfigurationProvider provider) { + this.provider = provider; + return getThis(); + } + + public @NotNull B path(@Nullable String path) { + this.path = path; + return getThis(); + } + + public @NotNull B comments(@NotNull String... comments) { + this.comments = comments; + return getThis(); + } + + public @NotNull B defaults(@Nullable T defaultValue) { + this.defaultValue = defaultValue; + return getThis(); + } + + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java index 6d597f0..f7b2693 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java @@ -1,14 +1,13 @@ package cc.carm.lib.configuration.core.builder.list; -import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.value.type.ConfiguredList; import org.jetbrains.annotations.NotNull; import java.util.List; -public class SourceListBuilder - extends AbstractConfigBuilder, List> { +public class SourceListBuilder extends CommonConfigBuilder, SourceListBuilder> { protected final @NotNull Class sourceClass; protected @NotNull ConfigDataFunction sourceParser; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java index ad20f4c..1667bd0 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.core.builder.map; -import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.value.type.ConfiguredMap; import org.jetbrains.annotations.NotNull; @@ -8,8 +8,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; import java.util.function.Supplier; -public class SourceMapBuilder, S, K, V> - extends AbstractConfigBuilder, M> { +public class SourceMapBuilder, S, K, V> extends CommonConfigBuilder> { protected final @NotNull Supplier<@NotNull M> supplier; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java index e17b6a3..d9bdbe2 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.core.builder.value; -import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.function.ConfigValueParser; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; public class SectionValueBuilder - extends AbstractConfigBuilder, V> { + extends CommonConfigBuilder> { protected final @NotNull Class valueClass; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java index 2bf90e2..deb77fb 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java @@ -1,12 +1,12 @@ package cc.carm.lib.configuration.core.builder.value; -import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.function.ConfigValueParser; import cc.carm.lib.configuration.core.value.type.ConfiguredValue; import org.jetbrains.annotations.NotNull; -public class SourceValueBuilder extends AbstractConfigBuilder, V> { +public class SourceValueBuilder extends CommonConfigBuilder> { protected final @NotNull Class sourceClass; protected @NotNull ConfigDataFunction sourceParser; 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 e483fcb..05b3fed 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 @@ -5,7 +5,7 @@ import cc.carm.lib.configuration.core.ConfigurationRoot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class ConfigurationProvider { +public abstract class ConfigurationProvider { protected long updateTime; @@ -21,7 +21,7 @@ public abstract class ConfigurationProvider { return this.updateTime > time; } - public abstract @NotNull ConfigurationWrapper getConfiguration(); + public abstract @NotNull W getConfiguration(); public abstract void reload() throws Exception; @@ -31,8 +31,10 @@ public abstract class ConfigurationProvider { public abstract @Nullable String[] getComments(@NotNull String path); + public abstract @NotNull ConfigInitializer> getInitializer(); + public void initialize(Class configClazz) { - ConfigInitializer.initialize(this, configClazz, true); + getInitializer().initialize(configClazz, true); } } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java index 6795775..a9ec9f5 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java @@ -9,7 +9,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -public interface ConfigurationWrapper extends ConfigurationReader{ +public interface ConfigurationWrapper extends ConfigurationReader { @Override default ConfigurationWrapper getWrapper() { @@ -68,5 +68,4 @@ public interface ConfigurationWrapper extends ConfigurationReader{ @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path); - } 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 e64358c..6eeb56c 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 @@ -1,6 +1,7 @@ package cc.carm.lib.configuration.core.source.impl; import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -9,7 +10,7 @@ import java.net.URL; import java.net.URLConnection; import java.util.Objects; -public abstract class FileConfigProvider extends ConfigurationProvider { +public abstract class FileConfigProvider extends ConfigurationProvider { protected final @NotNull File file; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java index 09ea385..a082257 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java @@ -10,28 +10,26 @@ import java.util.Objects; import java.util.Optional; public abstract class ConfigValue { - + public static @NotNull ConfigBuilder builder() { return new ConfigBuilder(); } - protected @Nullable T defaultValue; - - protected @Nullable ConfigurationProvider provider; + protected @Nullable ConfigurationProvider provider; protected @Nullable String configPath; protected @NotNull String[] comments; - public ConfigValue(@Nullable ConfigurationProvider provider, @Nullable String configPath, - @NotNull String[] comments, @Nullable T defaultValue) { + protected @Nullable T defaultValue; + + public ConfigValue(@Nullable ConfigurationProvider provider, + @Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) { this.provider = provider; this.configPath = configPath; this.comments = comments; - this.defaultValue = defaultValue; } - public void initialize(@NotNull ConfigurationProvider provider, @NotNull String configPath, - @NotNull String... comments) { + public void initialize(@NotNull ConfigurationProvider provider, @NotNull String configPath, @NotNull String... comments) { if (this.provider == null) this.provider = provider; if (this.configPath == null) this.configPath = configPath; if (this.comments.length == 0) this.comments = comments; @@ -68,7 +66,15 @@ public abstract class ConfigValue { Optional.ofNullable(getDefaultValue()).ifPresent(this::set); } - public @NotNull ConfigurationProvider getProvider() { + public boolean isDefault() { + T defaultValue = getDefaultValue(); + T value = get(); + if (defaultValue == null && value == null) return true; + else if (defaultValue != null && value != null) return defaultValue.equals(value); + else return false; + } + + public @NotNull ConfigurationProvider getProvider() { return Optional.ofNullable(this.provider) .orElseThrow(() -> new IllegalStateException("Value(" + configPath + ") does not have a provider.")); } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/CachedConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java similarity index 83% rename from core/src/main/java/cc/carm/lib/configuration/core/value/CachedConfigValue.java rename to core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java index 31d649e..368809c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/CachedConfigValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java @@ -1,6 +1,7 @@ -package cc.carm.lib.configuration.core.value; +package cc.carm.lib.configuration.core.value.impl; import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.core.value.ConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,7 +11,7 @@ public abstract class CachedConfigValue extends ConfigValue { protected @Nullable T cachedValue; protected long parsedTime = -1; - public CachedConfigValue(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, + public CachedConfigValue(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, @NotNull String[] comments, @Nullable T defaultValue) { super(provider, sectionPath, comments, defaultValue); } 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 62cdd1e..3ece531 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 @@ -3,7 +3,7 @@ package cc.carm.lib.configuration.core.value.type; 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.impl.CachedConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,7 +21,7 @@ public class ConfiguredList extends CachedConfigValue> { protected final @NotNull ConfigDataFunction parser; protected final @NotNull ConfigDataFunction serializer; - public ConfiguredList(@Nullable ConfigurationProvider provider, + public ConfiguredList(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, @NotNull String[] comments, @NotNull Class valueClass, @Nullable List defaultValue, @NotNull ConfigDataFunction parser, @@ -34,6 +34,9 @@ public class ConfiguredList extends CachedConfigValue> { @Override public @NotNull List get() { + + + if (isExpired()) { // 已过时的数据,需要重新解析一次。 List list = new ArrayList<>(); diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java index 2e347b3..80d8c0d 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java @@ -1,11 +1,10 @@ package cc.carm.lib.configuration.core.value.type; -import cc.carm.lib.configuration.core.builder.ConfigBuilder; import cc.carm.lib.configuration.core.builder.map.ConfigMapBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import cc.carm.lib.configuration.core.value.CachedConfigValue; +import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,7 +31,7 @@ public class ConfiguredMap extends CachedConfigValue> { protected final @NotNull ConfigDataFunction keySerializer; protected final @NotNull ConfigDataFunction valueSerializer; - public ConfiguredMap(@Nullable ConfigurationProvider provider, + public ConfiguredMap(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, @NotNull String[] comments, @Nullable Map defaultValue, @NotNull Supplier> supplier, @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java index 6444002..e3e4b41 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java @@ -1,12 +1,11 @@ package cc.carm.lib.configuration.core.value.type; -import cc.carm.lib.configuration.core.builder.ConfigBuilder; import cc.carm.lib.configuration.core.builder.value.SectionValueBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.function.ConfigValueParser; import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import cc.carm.lib.configuration.core.value.CachedConfigValue; +import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,7 +23,7 @@ public class ConfiguredSection extends CachedConfigValue { protected final @NotNull ConfigValueParser parser; protected final @NotNull ConfigDataFunction> serializer; - public ConfiguredSection(@Nullable ConfigurationProvider provider, + public ConfiguredSection(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, @NotNull String[] comments, @NotNull Class valueClass, @Nullable V defaultValue, @NotNull ConfigValueParser parser, diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java index 8537a6c..6ca5a3a 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java @@ -1,11 +1,10 @@ package cc.carm.lib.configuration.core.value.type; -import cc.carm.lib.configuration.core.builder.ConfigBuilder; import cc.carm.lib.configuration.core.builder.value.ConfigValueBuilder; import cc.carm.lib.configuration.core.function.ConfigDataFunction; import cc.carm.lib.configuration.core.function.ConfigValueParser; import cc.carm.lib.configuration.core.source.ConfigurationProvider; -import cc.carm.lib.configuration.core.value.CachedConfigValue; +import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -30,7 +29,7 @@ public class ConfiguredValue extends CachedConfigValue { protected final @NotNull ConfigValueParser parser; protected final @NotNull ConfigDataFunction serializer; - public ConfiguredValue(@Nullable ConfigurationProvider provider, + public ConfiguredValue(@Nullable ConfigurationProvider provider, @Nullable String sectionPath, @NotNull String[] comments, @NotNull Class valueClass, @Nullable V defaultValue, @NotNull ConfigValueParser parser, diff --git a/impl/yaml/pom.xml b/impl/yaml/pom.xml index 2a24c8b..4f2b2d0 100644 --- a/impl/yaml/pom.xml +++ b/impl/yaml/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.6 + 1.1.0 ../../pom.xml 4.0.0 diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java new file mode 100644 index 0000000..9cbfefc --- /dev/null +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java @@ -0,0 +1,32 @@ +package cc.carm.lib.configuration.yaml; + +import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; +import cc.carm.lib.configuration.yaml.YamlConfigProvider; +import cc.carm.lib.configuration.yaml.YamlSectionWrapper; +import cc.carm.lib.configuration.yaml.builder.YamlConfigBuilder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class YAMLValue extends CachedConfigValue { + + public static @NotNull YamlConfigBuilder builder() { + return new YamlConfigBuilder(); + } + + public YAMLValue(@Nullable YamlConfigProvider provider, + @Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) { + super(provider, configPath, comments, defaultValue); + } + + public YamlConfigProvider getYAMLProvider() { + ConfigurationProvider provider = getProvider(); + if (provider instanceof YamlConfigProvider) return (YamlConfigProvider) getProvider(); + else throw new IllegalStateException("Provider is not a SpigotConfigProvider"); + } + + public YamlSectionWrapper getYAMLConfig() { + return getYAMLProvider().getConfiguration(); + } + +} diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlConfigProvider.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlConfigProvider.java index a805f8c..85019f8 100644 --- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlConfigProvider.java +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlConfigProvider.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.yaml; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.core.ConfigInitializer; import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; import org.bspfsystems.yamlconfiguration.commented.CommentedYamlConfiguration; import org.jetbrains.annotations.NotNull; @@ -8,10 +8,11 @@ import org.jetbrains.annotations.Nullable; import java.io.File; -public class YamlConfigProvider extends FileConfigProvider { +public class YamlConfigProvider extends FileConfigProvider { - YamlComments comments = new YamlComments(); - CommentedYamlConfiguration configuration; + protected final @NotNull YamlComments comments = new YamlComments(); + protected CommentedYamlConfiguration configuration; + protected ConfigInitializer initializer; public YamlConfigProvider(@NotNull File file) { super(file); @@ -19,10 +20,11 @@ public class YamlConfigProvider extends FileConfigProvider { public void initializeConfig() { this.configuration = CommentedYamlConfiguration.loadConfiguration(comments, file); + this.initializer = new ConfigInitializer<>(this); } @Override - public @NotNull ConfigurationWrapper getConfiguration() { + public @NotNull YamlSectionWrapper getConfiguration() { return YamlSectionWrapper.of(configuration); } @@ -46,4 +48,9 @@ public class YamlConfigProvider extends FileConfigProvider { return this.comments.get(path); } + @Override + public @NotNull ConfigInitializer getInitializer() { + return this.initializer; + } + } diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlSectionWrapper.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlSectionWrapper.java index e7aa29d..c4ac9ec 100644 --- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlSectionWrapper.java +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YamlSectionWrapper.java @@ -2,6 +2,7 @@ package cc.carm.lib.configuration.yaml; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.bspfsystems.yamlconfiguration.configuration.ConfigurationSection; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,4 +69,16 @@ public class YamlSectionWrapper implements ConfigurationWrapper { public @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path) { return of(this.section.getConfigurationSection(path)); } + + @Nullable + public T getSerializable(@NotNull String path, @NotNull Class clazz) { + return getSerializable(path, clazz, null); + } + + @Nullable + @Contract("_, _, !null -> !null") + public T getSerializable(@NotNull String path, @NotNull Class clazz, @Nullable T defaultValue) { + return this.section.getSerializable(path, clazz, defaultValue); + } + } diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java new file mode 100644 index 0000000..9a2ac1f --- /dev/null +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java @@ -0,0 +1,13 @@ +package cc.carm.lib.configuration.yaml.builder; + +import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.yaml.YamlConfigProvider; + +public abstract class AbstractYAMLBuilder> + extends AbstractConfigBuilder { + + public AbstractYAMLBuilder() { + super(YamlConfigProvider.class); + } + +} diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YamlConfigBuilder.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YamlConfigBuilder.java new file mode 100644 index 0000000..ac4ee06 --- /dev/null +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YamlConfigBuilder.java @@ -0,0 +1,14 @@ +package cc.carm.lib.configuration.yaml.builder; + +import cc.carm.lib.configuration.core.builder.ConfigBuilder; +import cc.carm.lib.configuration.yaml.builder.serializable.SerializableBuilder; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; + +public class YamlConfigBuilder extends ConfigBuilder { + + public @NotNull SerializableBuilder ofSerializable(@NotNull Class valueClass) { + return new SerializableBuilder<>(valueClass); + } + +} diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java new file mode 100644 index 0000000..75bcff2 --- /dev/null +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java @@ -0,0 +1,29 @@ +package cc.carm.lib.configuration.yaml.builder.serializable; + +import cc.carm.lib.configuration.yaml.builder.AbstractYAMLBuilder; +import cc.carm.lib.configuration.yaml.value.ConfiguredSerializable; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; + +public class SerializableBuilder + extends AbstractYAMLBuilder> { + + protected final @NotNull Class valueClass; + + public SerializableBuilder(@NotNull Class valueClass) { + this.valueClass = valueClass; + } + + @Override + protected @NotNull SerializableBuilder getThis() { + return this; + } + + @Override + public @NotNull ConfiguredSerializable build() { + return new ConfiguredSerializable<>(this.provider, this.path, this.comments, this.valueClass, this.defaultValue); + } + + +} + diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java new file mode 100644 index 0000000..f3a20c4 --- /dev/null +++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java @@ -0,0 +1,52 @@ +package cc.carm.lib.configuration.yaml.value; + +import cc.carm.lib.configuration.yaml.YAMLValue; +import cc.carm.lib.configuration.yaml.YamlConfigProvider; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ConfiguredSerializable extends YAMLValue { + + public static ConfiguredSerializable of(@NotNull Class valueClass) { + return of(valueClass, null); + } + + public static ConfiguredSerializable of(@NotNull Class valueClass, + @Nullable V defaultValue) { + return builder().ofSerializable(valueClass).defaults(defaultValue).build(); + } + + protected final @NotNull Class valueClass; + + public ConfiguredSerializable(@Nullable YamlConfigProvider provider, + @Nullable String configPath, @NotNull String[] comments, + @NotNull Class valueClass, @Nullable T defaultValue) { + super(provider, configPath, comments, defaultValue); + this.valueClass = valueClass; + } + + @Override + public @Nullable T get() { + if (isExpired()) { // 已过时的数据,需要重新解析一次。 + try { + // 若未出现错误,则直接更新缓存并返回。 + return updateCache(getYAMLConfig().getSerializable(getConfigPath(), valueClass, getDefaultValue())); + } catch (Exception e) { + // 出现了解析错误,提示并返回默认值。 + e.printStackTrace(); + return useDefault(); + } + } else return Optional.ofNullable(getCachedValue()).orElse(defaultValue); + } + + @Override + public void set(@Nullable T value) { + updateCache(value); + setValue(value); + } + + +} diff --git a/impl/yaml/src/test/java/config/ConfigTester.java b/impl/yaml/src/test/java/config/ConfigTester.java index ed52fa4..1ac0174 100644 --- a/impl/yaml/src/test/java/config/ConfigTester.java +++ b/impl/yaml/src/test/java/config/ConfigTester.java @@ -2,9 +2,11 @@ package config; import cc.carm.lib.configuration.EasyConfiguration; import cc.carm.lib.configuration.yaml.YamlConfigProvider; -import config.misc.TestUser; -import config.source.DemoConfiguration; +import config.model.TestModel; import config.source.ComplexConfiguration; +import config.source.DemoConfiguration; +import config.source.ImplConfiguration; +import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerialization; import org.junit.Test; import java.util.LinkedHashMap; @@ -15,32 +17,16 @@ import java.util.stream.IntStream; public class ConfigTester { + @Test public void onTest() { + ConfigurationSerialization.registerClass(TestModel.class); YamlConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml"); - provider.initialize(DemoConfiguration.class); - provider.initialize(ComplexConfiguration.class); - 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()); - - - ComplexConfiguration.Sub.That.Operators.getNotNull().forEach(System.out::println); - List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); - ComplexConfiguration.Sub.That.Operators.set(operators); - - System.out.println(ComplexConfiguration.USER.get()); - TestUser b = new TestUser(UUID.randomUUID().toString().substring(0, 3), UUID.randomUUID()); - ComplexConfiguration.USER.set(b); - - 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()); - } - ComplexConfiguration.USERS.set(data); + testDemo(provider); + testComplex(provider); + testSerialization(provider); try { provider.save(); @@ -50,5 +36,45 @@ public class ConfigTester { } + public static void testSerialization(YamlConfigProvider provider) { + System.out.println("----------------------------------------------------"); + provider.initialize(ImplConfiguration.class); + System.out.println(ImplConfiguration.TEST.get()); + ImplConfiguration.TEST.set(TestModel.random()); + System.out.println("----------------------------------------------------"); + } + + public static void testDemo(YamlConfigProvider provider) { + provider.initialize(DemoConfiguration.class); + } + + public static void testComplex(YamlConfigProvider provider) { + System.out.println("----------------------------------------------------"); + provider.initialize(ComplexConfiguration.class); + + System.out.println("> Test Value:"); + 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()); + + System.out.println("> Test List:"); + ComplexConfiguration.Sub.That.Operators.getNotNull().forEach(System.out::println); + List operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList()); + ComplexConfiguration.Sub.That.Operators.set(operators); + + System.out.println("> Test Section:"); + System.out.println(ComplexConfiguration.USER.get()); + ComplexConfiguration.USER.set(TestModel.random()); + + System.out.println("> Test Maps:"); + 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()); + } + ComplexConfiguration.USERS.set(data); + System.out.println("----------------------------------------------------"); + } + } diff --git a/impl/yaml/src/test/java/config/misc/TestUser.java b/impl/yaml/src/test/java/config/model/TestModel.java similarity index 52% rename from impl/yaml/src/test/java/config/misc/TestUser.java rename to impl/yaml/src/test/java/config/model/TestModel.java index 8755c11..cdfa23b 100644 --- a/impl/yaml/src/test/java/config/misc/TestUser.java +++ b/impl/yaml/src/test/java/config/model/TestModel.java @@ -1,18 +1,22 @@ -package config.misc; +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; -public class TestUser { +@SerializableAs("TestModel") +public class TestModel implements ConfigurationSerializable { public String name; public UUID uuid; - public TestUser(String name, UUID uuid) { + public TestModel(String name, UUID uuid) { this.name = name; this.uuid = uuid; } @@ -33,6 +37,7 @@ public class TestUser { return uuid; } + @Override public @NotNull Map serialize() { Map map = new HashMap<>(); map.put("name", name); @@ -42,14 +47,30 @@ public class TestUser { return map; } - public static TestUser deserialize(ConfigurationWrapper section) throws Exception { + 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 TestUser(name, UUID.fromString(uuidString)); + 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{" + diff --git a/impl/yaml/src/test/java/config/source/ComplexConfiguration.java b/impl/yaml/src/test/java/config/source/ComplexConfiguration.java index 9a27f07..ee80738 100644 --- a/impl/yaml/src/test/java/config/source/ComplexConfiguration.java +++ b/impl/yaml/src/test/java/config/source/ComplexConfiguration.java @@ -8,7 +8,7 @@ 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.misc.TestUser; +import config.model.TestModel; import java.util.List; import java.util.Map; @@ -18,11 +18,11 @@ import java.util.UUID; 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) -> TestUser.deserialize(section)) - .serializeValue(TestUser::serialize).build(); + public static final ConfigValue USER = ConfiguredSection + .builder(TestModel.class) + .defaults(new TestModel("Carm", UUID.randomUUID())) + .parseValue((section, defaultValue) -> TestModel.deserialize(section)) + .serializeValue(TestModel::serialize).build(); @ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"}) public static final ConfigValue> USERS = ConfiguredMap diff --git a/impl/yaml/src/test/java/config/source/ImplConfiguration.java b/impl/yaml/src/test/java/config/source/ImplConfiguration.java new file mode 100644 index 0000000..a64be5a --- /dev/null +++ b/impl/yaml/src/test/java/config/source/ImplConfiguration.java @@ -0,0 +1,14 @@ +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.TestModel; + +@ConfigPath("ImplConfiguration") +public class ImplConfiguration extends ConfigurationRoot { + + public static final ConfigValue TEST = ConfiguredSerializable.of(TestModel.class); + +} diff --git a/platform/bungee/pom.xml b/platform/bungee/pom.xml index 1b5ca9c..727e720 100644 --- a/platform/bungee/pom.xml +++ b/platform/bungee/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.6 + 1.1.0 ../../pom.xml 4.0.0 diff --git a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java b/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java index 39f48c4..a303e38 100644 --- a/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java +++ b/platform/bungee/src/main/java/cc/carm/lib/configuration/bungee/BungeeConfigProvider.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.bungee; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.core.ConfigInitializer; import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; import net.md_5.bungee.config.Configuration; import net.md_5.bungee.config.ConfigurationProvider; @@ -11,9 +11,10 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; -public class BungeeConfigProvider extends FileConfigProvider { +public class BungeeConfigProvider extends FileConfigProvider { - Configuration configuration; + protected Configuration configuration; + protected ConfigInitializer initializer; public BungeeConfigProvider(@NotNull File file) { super(file); @@ -21,10 +22,11 @@ public class BungeeConfigProvider extends FileConfigProvider { public void initializeConfig() throws IOException { this.configuration = getLoader().load(file); + this.initializer = new ConfigInitializer<>(this); } @Override - public @NotNull ConfigurationWrapper getConfiguration() { + public @NotNull BungeeSectionWrapper getConfiguration() { return BungeeSectionWrapper.of(configuration); } @@ -47,6 +49,11 @@ public class BungeeConfigProvider extends FileConfigProvider { return null; } + @Override + public @NotNull ConfigInitializer getInitializer() { + return this.initializer; + } + public static ConfigurationProvider getLoader() { return ConfigurationProvider.getProvider(YamlConfiguration.class); } diff --git a/platform/spigot/pom.xml b/platform/spigot/pom.xml index 8252c8d..230003d 100644 --- a/platform/spigot/pom.xml +++ b/platform/spigot/pom.xml @@ -5,7 +5,7 @@ easyconfiguration-parent cc.carm.lib - 1.0.6 + 1.1.0 ../../pom.xml 4.0.0 diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java index 7df9a8f..43ad57a 100644 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/commented/CommentedYaml.java @@ -17,7 +17,7 @@ import java.util.Iterator; import java.util.List; /** - * An hacky extension of {@link Yaml} that allows to write comments when dumping. + * A hacky extension of {@link Yaml} that allows to write comments when dumping. */ public class CommentedYaml extends Yaml { diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java index 583a2b2..7ad2727 100644 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotConfigProvider.java @@ -1,17 +1,18 @@ package cc.carm.lib.configuration.spigot; -import cc.carm.lib.configuration.commented.CommentedYamlConfiguration; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.core.ConfigInitializer; import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; +import cc.carm.lib.configuration.commented.CommentedYamlConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -public class SpigotConfigProvider extends FileConfigProvider { +public class SpigotConfigProvider extends FileConfigProvider { - ConfigComments comments = new ConfigComments(); - CommentedYamlConfiguration configuration; + protected final ConfigComments comments = new ConfigComments(); + protected ConfigInitializer initializer; + protected CommentedYamlConfiguration configuration; public SpigotConfigProvider(@NotNull File file) { super(file); @@ -19,10 +20,15 @@ public class SpigotConfigProvider extends FileConfigProvider { public void initializeConfig() { this.configuration = CommentedYamlConfiguration.loadConfiguration(comments, file); + this.initializer = new ConfigInitializer<>(this); + } + + public void say() { + System.out.println("Hello"); } @Override - public @NotNull ConfigurationWrapper getConfiguration() { + public @NotNull SpigotSectionWrapper getConfiguration() { return SpigotSectionWrapper.of(configuration); } @@ -46,4 +52,9 @@ public class SpigotConfigProvider extends FileConfigProvider { return this.comments.get(path); } + @Override + public @NotNull ConfigInitializer getInitializer() { + return this.initializer; + } + } diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java index 29e65f9..55451f5 100644 --- a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotSectionWrapper.java @@ -2,6 +2,7 @@ package cc.carm.lib.configuration.spigot; import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.serialization.ConfigurationSerializable; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -68,4 +69,17 @@ public class SpigotSectionWrapper implements ConfigurationWrapper { public @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path) { return of(this.section.getConfigurationSection(path)); } + + + @Nullable + public T getSerializable(@NotNull String path, @NotNull Class clazz) { + return getSerializable(path, clazz, null); + } + + @Nullable + @Contract("_, _, !null -> !null") + public T getSerializable(@NotNull String path, @NotNull Class clazz, @Nullable T defaultValue) { + return this.section.getSerializable(path, clazz, defaultValue); + } + } diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java new file mode 100644 index 0000000..f41b6d1 --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/SpigotValue.java @@ -0,0 +1,32 @@ +package cc.carm.lib.configuration.spigot; + +import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.core.value.impl.CachedConfigValue; +import cc.carm.lib.configuration.spigot.builder.SpigotConfigBuilder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class SpigotValue extends CachedConfigValue { + + public static @NotNull SpigotConfigBuilder builder() { + return new SpigotConfigBuilder(); + } + + + public SpigotValue(@Nullable SpigotConfigProvider provider, + @Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) { + super(provider, configPath, comments, defaultValue); + } + + public SpigotConfigProvider getSpigotProvider() { + ConfigurationProvider provider = getProvider(); + if (provider instanceof SpigotConfigProvider) return (SpigotConfigProvider) getProvider(); + else throw new IllegalStateException("Provider is not a SpigotConfigProvider"); + } + + public SpigotSectionWrapper getSpigotConfig() { + return getSpigotProvider().getConfiguration(); + } + + +} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java new file mode 100644 index 0000000..bd3753a --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/AbstractSpigotBuilder.java @@ -0,0 +1,13 @@ +package cc.carm.lib.configuration.spigot.builder; + +import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder; +import cc.carm.lib.configuration.spigot.SpigotConfigProvider; + +public abstract class AbstractSpigotBuilder> + extends AbstractConfigBuilder { + + public AbstractSpigotBuilder() { + super(SpigotConfigProvider.class); + } + +} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java new file mode 100644 index 0000000..690e4ad --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/SpigotConfigBuilder.java @@ -0,0 +1,14 @@ +package cc.carm.lib.configuration.spigot.builder; + +import cc.carm.lib.configuration.core.builder.ConfigBuilder; +import cc.carm.lib.configuration.spigot.builder.serializable.SerializableBuilder; +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; + +public class SpigotConfigBuilder extends ConfigBuilder { + + public @NotNull SerializableBuilder ofSerializable(@NotNull Class valueClass) { + return new SerializableBuilder<>(valueClass); + } + +} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java new file mode 100644 index 0000000..8007b2f --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/builder/serializable/SerializableBuilder.java @@ -0,0 +1,29 @@ +package cc.carm.lib.configuration.spigot.builder.serializable; + +import cc.carm.lib.configuration.spigot.builder.AbstractSpigotBuilder; +import cc.carm.lib.configuration.spigot.value.ConfiguredSerializable; +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; + +public class SerializableBuilder + extends AbstractSpigotBuilder> { + + protected final @NotNull Class valueClass; + + public SerializableBuilder(@NotNull Class valueClass) { + this.valueClass = valueClass; + } + + @Override + protected @NotNull SerializableBuilder getThis() { + return this; + } + + @Override + public @NotNull ConfiguredSerializable build() { + return new ConfiguredSerializable<>(this.provider, this.path, this.comments, this.valueClass, this.defaultValue); + } + + +} + diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java new file mode 100644 index 0000000..2a3c5e9 --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/item/ItemConfiguration.java @@ -0,0 +1,4 @@ +package cc.carm.lib.configuration.spigot.item; + +public class ItemConfiguration { +} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java new file mode 100644 index 0000000..b34501a --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredItem.java @@ -0,0 +1,4 @@ +package cc.carm.lib.configuration.spigot.value; + +public class ConfiguredItem { +} diff --git a/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java new file mode 100644 index 0000000..516ca82 --- /dev/null +++ b/platform/spigot/src/main/java/cc/carm/lib/configuration/spigot/value/ConfiguredSerializable.java @@ -0,0 +1,52 @@ +package cc.carm.lib.configuration.spigot.value; + +import cc.carm.lib.configuration.spigot.SpigotConfigProvider; +import cc.carm.lib.configuration.spigot.SpigotValue; +import org.bukkit.configuration.serialization.ConfigurationSerializable; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ConfiguredSerializable extends SpigotValue { + + public static ConfiguredSerializable of(@NotNull Class valueClass) { + return of(valueClass, null); + } + + public static ConfiguredSerializable of(@NotNull Class valueClass, + @Nullable V defaultValue) { + return builder().ofSerializable(valueClass).defaults(defaultValue).build(); + } + + protected final @NotNull Class valueClass; + + public ConfiguredSerializable(@Nullable SpigotConfigProvider provider, + @Nullable String configPath, @NotNull String[] comments, + @NotNull Class valueClass, @Nullable T defaultValue) { + super(provider, configPath, comments, defaultValue); + this.valueClass = valueClass; + } + + @Override + public @Nullable T get() { + if (isExpired()) { // 已过时的数据,需要重新解析一次。 + try { + // 若未出现错误,则直接更新缓存并返回。 + return updateCache(getSpigotConfig().getSerializable(getConfigPath(), valueClass, getDefaultValue())); + } catch (Exception e) { + // 出现了解析错误,提示并返回默认值。 + e.printStackTrace(); + return useDefault(); + } + } else return Optional.ofNullable(getCachedValue()).orElse(defaultValue); + } + + @Override + public void set(@Nullable T value) { + updateCache(value); + setValue(value); + } + + +} diff --git a/pom.xml b/pom.xml index f3cf858..9e4eeac 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ cc.carm.lib easyconfiguration-parent pom - 1.0.6 + 1.1.0 core