diff --git a/features/versioned/pom.xml b/features/versioned/pom.xml new file mode 100644 index 0000000..1b40382 --- /dev/null +++ b/features/versioned/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + cc.carm.lib + easyconfiguration-parent + 3.9.1 + ../../pom.xml + + + ${project.jdk.version} + ${project.jdk.version} + UTF-8 + UTF-8 + + + easyconfiguration-feature-versioned + jar + + + + ${project.groupId} + easyconfiguration-core + ${project.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + + + \ No newline at end of file diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java b/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java new file mode 100644 index 0000000..19ba260 --- /dev/null +++ b/features/versioned/src/main/java/cc/carm/lib/configuration/annotation/ConfigVersion.java @@ -0,0 +1,28 @@ +package cc.carm.lib.configuration.annotation; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Range; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + +/** + * The version of specific {@link cc.carm.lib.configuration.value.ConfigValue}. + *
Used for versioning target field for rewrite/upgrade. + */ +@Target({ElementType.FIELD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface ConfigVersion { + + /** + * The version of the configuration field. + * + * @return the version of the configuration field + */ + @Range(from = 0, to = Integer.MAX_VALUE) + int value() default 0; + +} diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java b/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java new file mode 100644 index 0000000..5b77346 --- /dev/null +++ b/features/versioned/src/main/java/cc/carm/lib/configuration/commentable/VersionedMetaTypes.java @@ -0,0 +1,25 @@ +package cc.carm.lib.configuration.commentable; + +import cc.carm.lib.configuration.annotation.ConfigVersion; +import cc.carm.lib.configuration.source.ConfigurationHolder; +import cc.carm.lib.configuration.source.loader.ConfigurationInitializer; +import cc.carm.lib.configuration.source.meta.ConfigurationMetadata; +import org.jetbrains.annotations.NotNull; + +public interface VersionedMetaTypes { + + /** + * The version of specific {@link cc.carm.lib.configuration.value.ConfigValue}. + *
Used for versioning target field for rewrite/upgrade. + */ + ConfigurationMetadata VERSION = ConfigurationMetadata.of(0); + + static void register(@NotNull ConfigurationHolder provider) { + register(provider.initializer()); + } + + static void register(@NotNull ConfigurationInitializer initializer) { + initializer.registerAnnotation(ConfigVersion.class, VERSION, ConfigVersion::value); + } + +} diff --git a/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java b/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java new file mode 100644 index 0000000..4387206 --- /dev/null +++ b/features/versioned/src/main/java/cc/carm/lib/configuration/option/VersionedOptions.java @@ -0,0 +1,13 @@ +package cc.carm.lib.configuration.option; + +import cc.carm.lib.configuration.source.option.ConfigurationOption; + +public interface VersionedOptions { + + /** + * Whether to set newer defaults when a {@link cc.carm.lib.configuration.value.ConfigValue}'s marked version + * is newer than the current in storage. + */ + ConfigurationOption RESET_NEWER_DEFAULTS = ConfigurationOption.of(true); + +} diff --git a/pom.xml b/pom.xml index fcbba7f..5e691ce 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ core features/commentable features/file + features/versioned providers/yaml providers/gson