From da3d4d1fd23469609860b9687066e0605855a9da Mon Sep 17 00:00:00 2001 From: carm Date: Tue, 30 Jan 2024 18:01:36 +0800 Subject: [PATCH] feat(loader): Refactor loaders and metadata. --- .../commentable/CommentableMetaTypes.java | 26 - core/pom.xml | 7 +- .../{core => }/Configuration.java | 2 +- .../configuration/adapter/ValueAdapter.java | 10 +- .../adapter/ValueAdapterRegistry.java | 30 +- .../adapter/ValueDeserializer.java | 5 +- .../adapter/ValueSerializer.java | 5 +- .../adapter/strandard/EnumAdapter.java | 8 +- .../adapter/strandard/PrimitiveAdapters.java | 38 +- .../configuration/annotation/ConfigPath.java | 4 +- .../core/function/ConfigValueParser.java | 159 ------ .../core/source/ConfigurationProvider.java | 150 ------ .../core/source/ConfigurationWrapper.java | 73 --- .../core/source/impl/FileConfigProvider.java | 89 ---- .../function/ConfigDataFunction.java | 2 +- .../function/ConfigValueParser.java | 62 +++ .../loader/ConfigurationLoader.java | 107 ++++ .../configuration/loader/PathGenerator.java | 43 ++ .../loader/StandardPathGenerator.java | 86 ++++ .../configuration/manifest/ValueManifest.java | 8 - .../ConfigurationOptions.java | 11 +- ...Builder.java => ConfigurationFactory.java} | 30 +- .../source/ConfigurationLoader.java | 196 -------- .../source/ConfigurationProvider.java | 53 +- .../ConfigurationSection.java} | 124 +++-- .../source/ConfigurationSource.java | 41 ++ .../source/path/PathGenerator.java | 33 -- .../source/path/StandardPathGenerator.java | 74 --- .../standard/ConfigurationMetaTypes.java | 12 - .../lib/configuration/value/ConfigValue.java | 47 +- .../configuration/value/ValueManifest.java | 202 ++++---- .../value/impl/CachedConfigValue.java | 9 +- .../value/impl/ConfigValueMap.java | 427 ++++++++-------- .../value/meta/ValueMetaList.java | 11 + .../value/meta/ValueMetaType.java | 59 +++ .../value/standard/ConfiguredList.java | 458 +++++++++--------- .../value/standard/ConfiguredMap.java | 55 ++- .../value/standard/ConfiguredSection.java | 193 ++++---- .../value/standard/ConfiguredSectionMap.java | 63 ++- .../value/standard/ConfiguredValue.java | 45 +- core/src/main/old/ValueManifestv.java | 123 +++++ .../builder/AbstractConfigBuilder.java | 3 +- .../builder/CommonConfigBuilder.java | 4 +- .../core => old}/builder/ConfigBuilder.java | 10 +- .../builder/list/ConfigListBuilder.java | 4 +- .../builder/list/SourceListBuilder.java | 6 +- .../builder/map/ConfigMapBuilder.java | 4 +- .../builder/map/ConfigMapCreator.java | 2 +- .../builder/map/SectionMapBuilder.java | 7 +- .../builder/map/SourceMapBuilder.java | 6 +- .../builder/value/ConfigValueBuilder.java | 7 +- .../builder/value/SectionValueBuilder.java | 9 +- .../builder/value/SourceValueBuilder.java | 8 +- core/src/test/java/AdaptTest.java | 9 +- core/src/test/java/NameTest.java | 9 +- .../java/cc/carm/test/config/LoaderTest.java | 42 ++ .../java/cc/carm/test/config/TestSource.java | 82 ++++ .../demo/DatabaseConfiguration.java | 2 +- .../demo/tests/ConfigurationTest.java | 1 - .../demo/tests/conf/DemoConfiguration.java | 2 +- .../demo/tests/conf/TestConfiguration.java | 2 +- .../tests/conf/TestInnerConfiguration.java | 2 +- .../demo/tests/model/TestModel.java | 1 - features/commentable/pom.xml | 51 ++ .../annotation/HeaderComment.java | 0 .../annotation/InlineComment.java | 0 .../commentable/CommentableMetaTypes.java | 22 + .../commentable/ConfigurationComments.java | 0 .../option}/CommentableOptions.java | 4 +- {commentable => features/file}/pom.xml | 25 +- .../option/FileConfigOptions.java | 15 + .../source/FileConfigProvider.java | 87 ++++ .../source/FileConfigSource.java | 6 + pom.xml | 14 +- {impl/json => providers/gson}/README.md | 0 {impl/json => providers/gson}/pom.xml | 2 +- .../lib/configuration/EasyConfiguration.java | 0 .../json/JSONConfigProvider.java | 1 - .../configuration/json/JSONConfigWrapper.java | 1 - .../src/test/java/config/JSONConfigTest.java | 0 {impl => providers}/hocon/README.md | 0 {impl => providers}/hocon/pom.xml | 0 .../lib/configuration/EasyConfiguration.java | 0 .../hocon/HOCONConfigWrapper.java | 1 - .../hocon/HOCONFileConfigProvider.java | 0 .../exception/HOCONGetValueException.java | 0 .../configuration/hocon/util/HOCONUtils.java | 0 .../test/easyconfiguration/HOCONTest.java | 0 {impl => providers}/sql/README.md | 0 {impl => providers}/sql/pom.xml | 0 .../lib/configuration/EasyConfiguration.java | 0 .../configuration/sql/SQLConfigProvider.java | 1 - .../configuration/sql/SQLConfigWrapper.java | 1 - .../configuration/sql/SQLValueResolver.java | 0 .../lib/configuration/sql/SQLValueTypes.java | 0 .../src/test/java/config/SQLConfigTest.java | 0 .../sql/src/test/resources/log4j2.xml | 0 {impl => providers}/yaml/README.md | 0 {impl => providers}/yaml/pom.xml | 0 .../lib/configuration/EasyConfiguration.java | 0 .../yaml/YAMLConfigProvider.java | 0 .../yaml/YAMLSectionWrapper.java | 1 - .../lib/configuration/yaml/YAMLValue.java | 1 - .../yaml/builder/AbstractYAMLBuilder.java | 0 .../yaml/builder/YAMLConfigBuilder.java | 0 .../serializable/SerializableBuilder.java | 0 .../yaml/value/ConfiguredSerializable.java | 0 .../src/test/java/config/DemoConfigTest.java | 0 .../src/test/java/config/model/AnyModel.java | 0 .../src/test/java/config/model/SomeModel.java | 0 .../config/source/ModelConfiguration.java | 2 +- .../yaml/src/test/java/sample/Sample.java | 1 - .../src/test/java/sample/SampleConfig.java | 2 +- .../src/test/resources/test/test2/config.yml | 0 114 files changed, 1868 insertions(+), 1772 deletions(-) delete mode 100644 commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java rename core/src/main/java/cc/carm/lib/configuration/{core => }/Configuration.java (81%) delete mode 100644 core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java rename core/src/main/java/cc/carm/lib/configuration/{core => }/function/ConfigDataFunction.java (99%) create mode 100644 core/src/main/java/cc/carm/lib/configuration/function/ConfigValueParser.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/loader/ConfigurationLoader.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/loader/PathGenerator.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/loader/StandardPathGenerator.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/manifest/ValueManifest.java rename core/src/main/java/cc/carm/lib/configuration/{source/standard => option}/ConfigurationOptions.java (56%) rename core/src/main/java/cc/carm/lib/configuration/source/{ConfigurationBuilder.java => ConfigurationFactory.java} (62%) delete mode 100644 core/src/main/java/cc/carm/lib/configuration/source/ConfigurationLoader.java rename core/src/main/java/cc/carm/lib/configuration/{core/source/ConfigurationReader.java => source/ConfigurationSection.java} (53%) create mode 100644 core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSource.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/source/path/PathGenerator.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/source/path/StandardPathGenerator.java delete mode 100644 core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationMetaTypes.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaList.java create mode 100644 core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaType.java create mode 100644 core/src/main/old/ValueManifestv.java rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/AbstractConfigBuilder.java (94%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/CommonConfigBuilder.java (67%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/ConfigBuilder.java (82%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/list/ConfigListBuilder.java (94%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/list/SourceListBuilder.java (93%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/map/ConfigMapBuilder.java (95%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/map/ConfigMapCreator.java (95%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/map/SectionMapBuilder.java (93%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/map/SourceMapBuilder.java (95%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/value/ConfigValueBuilder.java (90%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/value/SectionValueBuilder.java (83%) rename core/src/main/{java/cc/carm/lib/configuration/core => old}/builder/value/SourceValueBuilder.java (90%) create mode 100644 core/src/test/java/cc/carm/test/config/LoaderTest.java create mode 100644 core/src/test/java/cc/carm/test/config/TestSource.java create mode 100644 features/commentable/pom.xml rename {commentable => features/commentable}/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java (100%) rename {commentable => features/commentable}/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java (100%) create mode 100644 features/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java rename {commentable => features/commentable}/src/main/java/cc/carm/lib/configuration/commentable/ConfigurationComments.java (100%) rename {commentable/src/main/java/cc/carm/lib/configuration/commentable => features/commentable/src/main/java/cc/carm/lib/configuration/option}/CommentableOptions.java (88%) rename {commentable => features/file}/pom.xml (54%) create mode 100644 features/file/src/main/java/cc/carm/lib/configuration/option/FileConfigOptions.java create mode 100644 features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigProvider.java create mode 100644 features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java rename {impl/json => providers/gson}/README.md (100%) rename {impl/json => providers/gson}/pom.xml (97%) rename {impl/json => providers/gson}/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java (100%) rename {impl/json => providers/gson}/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java (97%) rename {impl/json => providers/gson}/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java (98%) rename {impl/json => providers/gson}/src/test/java/config/JSONConfigTest.java (100%) rename {impl => providers}/hocon/README.md (100%) rename {impl => providers}/hocon/pom.xml (100%) rename {impl => providers}/hocon/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java (100%) rename {impl => providers}/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java (98%) rename {impl => providers}/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONFileConfigProvider.java (100%) rename {impl => providers}/hocon/src/main/java/cc/carm/lib/configuration/hocon/exception/HOCONGetValueException.java (100%) rename {impl => providers}/hocon/src/main/java/cc/carm/lib/configuration/hocon/util/HOCONUtils.java (100%) rename {impl => providers}/hocon/src/test/java/online/flowerinsnow/test/easyconfiguration/HOCONTest.java (100%) rename {impl => providers}/sql/README.md (100%) rename {impl => providers}/sql/pom.xml (100%) rename {impl => providers}/sql/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java (100%) rename {impl => providers}/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java (98%) rename {impl => providers}/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java (98%) rename {impl => providers}/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueResolver.java (100%) rename {impl => providers}/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueTypes.java (100%) rename {impl => providers}/sql/src/test/java/config/SQLConfigTest.java (100%) rename {impl => providers}/sql/src/test/resources/log4j2.xml (100%) rename {impl => providers}/yaml/README.md (100%) rename {impl => providers}/yaml/pom.xml (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLConfigProvider.java (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java (97%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java (93%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YAMLConfigBuilder.java (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java (100%) rename {impl => providers}/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java (100%) rename {impl => providers}/yaml/src/test/java/config/DemoConfigTest.java (100%) rename {impl => providers}/yaml/src/test/java/config/model/AnyModel.java (100%) rename {impl => providers}/yaml/src/test/java/config/model/SomeModel.java (100%) rename {impl => providers}/yaml/src/test/java/config/source/ModelConfiguration.java (97%) rename {impl => providers}/yaml/src/test/java/sample/Sample.java (89%) rename {impl => providers}/yaml/src/test/java/sample/SampleConfig.java (95%) rename {impl => providers}/yaml/src/test/resources/test/test2/config.yml (100%) diff --git a/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java b/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java deleted file mode 100644 index 372fe98..0000000 --- a/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java +++ /dev/null @@ -1,26 +0,0 @@ -package cc.carm.lib.configuration.commentable; - -import cc.carm.lib.configuration.annotation.HeaderComment; -import cc.carm.lib.configuration.annotation.InlineComment; -import cc.carm.lib.easyannotation.AnnotatedMetaType; - -import java.util.Arrays; -import java.util.List; - -public interface CommentableMetaTypes { - - /** - * Configuration's {@link HeaderComment} - */ - AnnotatedMetaType> HEADER_COMMENT = AnnotatedMetaType.of( - HeaderComment.class, h -> h.value().length == 0 ? null : Arrays.asList(h.value()) - ); - - /** - * Configuration's {@link InlineComment} - */ - AnnotatedMetaType INLINE_COMMENT = AnnotatedMetaType.of( - InlineComment.class, c -> c.value().isEmpty() ? null : c.value() - ); - -} diff --git a/core/pom.xml b/core/pom.xml index c3b88a3..4a285d5 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -22,12 +22,7 @@ cc.carm.lib easyoptions - 1.0.0 - - - cc.carm.lib - easyannotation - 1.0.0 + 1.1.0 diff --git a/core/src/main/java/cc/carm/lib/configuration/core/Configuration.java b/core/src/main/java/cc/carm/lib/configuration/Configuration.java similarity index 81% rename from core/src/main/java/cc/carm/lib/configuration/core/Configuration.java rename to core/src/main/java/cc/carm/lib/configuration/Configuration.java index f925a20..3596cf7 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/Configuration.java +++ b/core/src/main/java/cc/carm/lib/configuration/Configuration.java @@ -1,4 +1,4 @@ -package cc.carm.lib.configuration.core; +package cc.carm.lib.configuration; /** * The root interface of the configuration file interfaces, diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapter.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapter.java index ab265d3..deeb81d 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapter.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapter.java @@ -5,12 +5,10 @@ import cc.carm.lib.configuration.source.ConfigurationProvider; /** * Value adapter, used to convert the value of the configuration file into the objects. * - * @param

The type of the configuration provider. * @param The type of the base data * @param The type of the target value */ -public abstract class ValueAdapter

- implements ValueSerializer, ValueDeserializer { +public abstract class ValueAdapter implements ValueSerializer, ValueDeserializer { protected final Class baseType; protected final Class valueType; @@ -36,17 +34,17 @@ public abstract class ValueAdapter

return isAdaptedFrom(object.getClass()); } - public boolean isAdapterOf(Class clazz) { + public boolean isAdaptedTo(Class clazz) { return clazz == valueType; } @SuppressWarnings("unchecked") - protected final V deserializeObject(P provider, Class valueClass, Object data) throws Exception { + protected final V deserializeObject(ConfigurationProvider provider, Class valueClass, Object data) throws Exception { return deserialize(provider, (Class) valueClass, (B) data); } @SuppressWarnings("unchecked") - protected final B serializeObject(P provider, Object value) throws Exception { + protected final B serializeObject(ConfigurationProvider provider, Object value) throws Exception { return serialize(provider, (V) value); } diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapterRegistry.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapterRegistry.java index 460e4ca..3216c79 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapterRegistry.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapterRegistry.java @@ -1,7 +1,7 @@ package cc.carm.lib.configuration.adapter; import cc.carm.lib.configuration.adapter.strandard.PrimitiveAdapters; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigDataFunction; import cc.carm.lib.configuration.source.ConfigurationProvider; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -10,29 +10,29 @@ import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; -public class ValueAdapterRegistry

{ +public class ValueAdapterRegistry { - protected final Map, ValueAdapter> adapters = new HashMap<>(); + protected final Map, ValueAdapter> adapters = new HashMap<>(); - public void register(@NotNull ValueAdapter adapter) { + public void register(@NotNull ValueAdapter adapter) { adapters.put(adapter.getValueClass(), adapter); } - public void register(Class clazz, @NotNull ValueAdapter adapter) { + public void register(Class clazz, @NotNull ValueAdapter adapter) { adapters.put(clazz, adapter); } public void register(Class baseClass, Class valueClass, ConfigDataFunction parser, ConfigDataFunction serializer) { - register(new ValueAdapter(baseClass, valueClass) { + register(new ValueAdapter(baseClass, valueClass) { @Override - public B serialize(@NotNull P provider, @NotNull V value) throws Exception { + public B serialize(@NotNull ConfigurationProvider provider, @NotNull V value) throws Exception { return serializer.parse(value); } @Override - public V deserialize(@NotNull P provider, @NotNull Class clazz, @NotNull B data) throws Exception { + public V deserialize(@NotNull ConfigurationProvider provider, @NotNull Class clazz, @NotNull B data) throws Exception { return parser.parse(data); } }); @@ -44,11 +44,11 @@ public class ValueAdapterRegistry

{ @SuppressWarnings("unchecked") @Contract("_,_,null -> null") - public T deserialize(@NotNull P provider, @NotNull Class type, @Nullable Object source) throws Exception { + public T deserialize(@NotNull ConfigurationProvider provider, @NotNull Class type, @Nullable Object source) throws Exception { if (source == null) return null; // Null check if (type.isInstance(source)) return type.cast(source); // Not required to deserialize - ValueAdapter adapter = getAdapter(type); + ValueAdapter adapter = getAdapter(type); if (adapter == null) throw new RuntimeException("No adapter for type " + type.getName()); // Check if value is adapted from given value's type @@ -64,10 +64,10 @@ public class ValueAdapterRegistry

{ } @Contract("_,null -> null") - public Object serialize(@NotNull P provider, @Nullable T value) throws Exception { + public Object serialize(@NotNull ConfigurationProvider provider, @Nullable T value) throws Exception { if (value == null) return null; // Null check - ValueAdapter adapter = getAdapter(value.getClass()); + ValueAdapter adapter = getAdapter(value.getClass()); if (adapter == null) return value; // No adapters, try to return the original value if (adapter instanceof PrimitiveAdapters) { @@ -80,12 +80,12 @@ public class ValueAdapterRegistry

{ return serialize(provider, adapter.serializeObject(provider, value)); } - public ValueAdapter getAdapter(Class clazz) { + public ValueAdapter getAdapter(Class clazz) { return adapters.getOrDefault(clazz, findAdapter(clazz)); } - public ValueAdapter findAdapter(Class clazz) { - return adapters.values().stream().filter(adapter -> adapter.isAdapterOf(clazz)).findFirst().orElse(null); + public ValueAdapter findAdapter(Class clazz) { + return adapters.values().stream().filter(adapter -> adapter.isAdaptedTo(clazz)).findFirst().orElse(null); } diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueDeserializer.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueDeserializer.java index 381d315..2f63ebb 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueDeserializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueDeserializer.java @@ -6,13 +6,12 @@ import org.jetbrains.annotations.NotNull; /** * Value deserializer, convert base data to target value. * - * @param

Configuration provider * @param The type of base data * @param The type of target value */ @FunctionalInterface -public interface ValueDeserializer

{ +public interface ValueDeserializer { - V deserialize(@NotNull P provider, @NotNull Class clazz, @NotNull B data) throws Exception; + V deserialize(@NotNull ConfigurationProvider provider, @NotNull Class clazz, @NotNull B data) throws Exception; } diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueSerializer.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueSerializer.java index 3161bf2..d27e8c9 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueSerializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueSerializer.java @@ -6,13 +6,12 @@ import org.jetbrains.annotations.NotNull; /** * Value serializer, convert target value to base data. * - * @param

Configuration provider * @param The type of base data * @param The type of value */ @FunctionalInterface -public interface ValueSerializer

{ +public interface ValueSerializer { - B serialize(@NotNull P provider, @NotNull V value) throws Exception; + B serialize(@NotNull ConfigurationProvider provider, @NotNull V value) throws Exception; } diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/EnumAdapter.java b/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/EnumAdapter.java index 6f53595..ee4a3a4 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/EnumAdapter.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/EnumAdapter.java @@ -5,24 +5,24 @@ import cc.carm.lib.configuration.source.ConfigurationProvider; import org.jetbrains.annotations.NotNull; @SuppressWarnings({"unchecked", "rawtypes"}) -public class EnumAdapter

extends ValueAdapter { +public class EnumAdapter extends ValueAdapter { public EnumAdapter() { super(String.class, Enum.class); } @Override - public String serialize(@NotNull P provider, @NotNull Enum value) throws Exception { + public String serialize(@NotNull ConfigurationProvider provider, @NotNull Enum value) throws Exception { return value.name(); } @Override - public Enum deserialize(@NotNull P provider, @NotNull Class clazz, @NotNull String data) throws Exception { + public Enum deserialize(@NotNull ConfigurationProvider provider, @NotNull Class clazz, @NotNull String data) throws Exception { return Enum.valueOf(clazz, data); } @Override - public boolean isAdapterOf(Class clazz) { + public boolean isAdaptedTo(Class clazz) { return clazz.isEnum(); } diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/PrimitiveAdapters.java b/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/PrimitiveAdapters.java index 6062b7b..5a36a73 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/PrimitiveAdapters.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/strandard/PrimitiveAdapters.java @@ -1,45 +1,45 @@ package cc.carm.lib.configuration.adapter.strandard; import cc.carm.lib.configuration.adapter.ValueAdapter; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigDataFunction; import cc.carm.lib.configuration.source.ConfigurationProvider; import org.jetbrains.annotations.NotNull; -public abstract class PrimitiveAdapters

extends ValueAdapter { +public abstract class PrimitiveAdapters extends ValueAdapter { - public static

PrimitiveAdapters ofString() { + public static PrimitiveAdapters ofString() { return of(String.class, o -> o instanceof String ? (String) o : o.toString()); } - public static

PrimitiveAdapters ofBoolean() { + public static PrimitiveAdapters ofBoolean() { return of(Boolean.class, o -> o instanceof Boolean ? (Boolean) o : Boolean.parseBoolean(o.toString())); } - public static

PrimitiveAdapters ofCharacter() { + public static PrimitiveAdapters ofCharacter() { return of(Character.class, o -> o instanceof Character ? (Character) o : o.toString().charAt(0)); } - public static

PrimitiveAdapters ofInteger() { + public static PrimitiveAdapters ofInteger() { return ofNumber(Integer.class, Number::intValue, Integer::parseInt); } - public static

PrimitiveAdapters ofLong() { + public static PrimitiveAdapters ofLong() { return ofNumber(Long.class, Number::longValue, Long::parseLong); } - public static

PrimitiveAdapters ofDouble() { + public static PrimitiveAdapters ofDouble() { return ofNumber(Double.class, Number::doubleValue, Double::parseDouble); } - public static

PrimitiveAdapters ofFloat() { + public static PrimitiveAdapters ofFloat() { return ofNumber(Float.class, Number::floatValue, Float::parseFloat); } - public static

PrimitiveAdapters ofShort() { + public static PrimitiveAdapters ofShort() { return ofNumber(Short.class, Number::shortValue, Short::parseShort); } - public static

PrimitiveAdapters ofByte() { + public static PrimitiveAdapters ofByte() { return ofNumber(Byte.class, Number::byteValue, Byte::parseByte); } @@ -48,23 +48,23 @@ public abstract class PrimitiveAdapters

exte } @Override - public Object serialize(@NotNull P provider, @NotNull T value) throws Exception { + public Object serialize(@NotNull ConfigurationProvider provider, @NotNull T value) throws Exception { return value; } - public static

PrimitiveAdapters of(@NotNull Class clazz, - @NotNull ConfigDataFunction function) { - return new PrimitiveAdapters(clazz) { + public static PrimitiveAdapters of(@NotNull Class clazz, + @NotNull ConfigDataFunction function) { + return new PrimitiveAdapters(clazz) { @Override - public T deserialize(@NotNull P provider, @NotNull Class clazz, @NotNull Object data) throws Exception { + public T deserialize(@NotNull ConfigurationProvider provider, @NotNull Class clazz, @NotNull Object data) throws Exception { return function.parse(data); } }; } - public static

PrimitiveAdapters ofNumber(@NotNull Class numberClass, - @NotNull ConfigDataFunction castFunction, - @NotNull ConfigDataFunction parseFunction) { + public static PrimitiveAdapters ofNumber(@NotNull Class numberClass, + @NotNull ConfigDataFunction castFunction, + @NotNull ConfigDataFunction parseFunction) { return of(numberClass, o -> o instanceof Number ? castFunction.parse((Number) o) : parseFunction.parse(o.toString())); } } diff --git a/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java index 252e6a4..c843e17 100644 --- a/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java +++ b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java @@ -1,5 +1,7 @@ package cc.carm.lib.configuration.annotation; +import cc.carm.lib.configuration.loader.PathGenerator; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -14,7 +16,7 @@ public @interface ConfigPath { /** * The path value of the current configuration. - * If not set,will generate the path by {@link cc.carm.lib.configuration.source.path.PathGenerator}. + * If not set,will generate the path by {@link PathGenerator}. * * @return The path value of the current configuration */ diff --git a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java b/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java deleted file mode 100644 index 7dc7762..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigValueParser.java +++ /dev/null @@ -1,159 +0,0 @@ -package cc.carm.lib.configuration.core.function; - - -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Objects; -import java.util.UUID; - -@FunctionalInterface -public interface ConfigValueParser { - - @Nullable R parse(@NotNull T data, @Nullable R defaultValue) throws Exception; - - default ConfigValueParser andThen(@NotNull ConfigValueParser after) { - Objects.requireNonNull(after); - return ((data, defaultValue) -> { - R result = parse(data, null); - if (result == null) return defaultValue; - else return after.parse(result, defaultValue); - }); - } - - default ConfigValueParser compose(@NotNull ConfigDataFunction before) { - Objects.requireNonNull(before); - return ((data, defaultValue) -> { - T result = before.parse(data); - return parse(result, defaultValue); - }); - } - - - @Contract(pure = true) - static @NotNull ConfigValueParser identity() { - return (input, defaultValue) -> input; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser toObject() { - return (input, defaultValue) -> input; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser required() { - return (input, defaultValue) -> { - throw new IllegalArgumentException("Please specify the value parser."); - }; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser castObject(Class valueClass) { - if (Number.class.isAssignableFrom(valueClass)) return castNumber(valueClass); - else return (input, defaultValue) -> { - if (Boolean.class.isAssignableFrom(valueClass) || boolean.class.isAssignableFrom(valueClass)) { - input = booleanValue().parse(input, (Boolean) defaultValue); - } else if (Enum.class.isAssignableFrom(valueClass) && input instanceof String) { - String enumName = (String) input; - input = valueClass.getDeclaredMethod("valueOf", String.class).invoke(null, enumName); - } else if (UUID.class.isAssignableFrom(valueClass) && input instanceof String) { - input = UUID.fromString((String) input); - } - - if (valueClass.isInstance(input)) return valueClass.cast(input); - else throw new IllegalArgumentException("Cannot cast value to " + valueClass.getName()); - }; - } - - - @Contract(pure = true) - static @NotNull ConfigValueParser castNumber(Class valueClass) { - return (input, defaultValue) -> { - if (Long.class.isAssignableFrom(valueClass) || long.class.isAssignableFrom(valueClass)) { - input = longValue().parse(input, (Long) defaultValue); - } else if (Integer.class.isAssignableFrom(valueClass) || int.class.isAssignableFrom(valueClass)) { - input = intValue().parse(input, (Integer) defaultValue); - } else if (Float.class.isAssignableFrom(valueClass) || float.class.isAssignableFrom(valueClass)) { - input = floatValue().parse(input, (Float) defaultValue); - } else if (Double.class.isAssignableFrom(valueClass) || double.class.isAssignableFrom(valueClass)) { - input = doubleValue().parse(input, (Double) defaultValue); - } else if (Byte.class.isAssignableFrom(valueClass) || byte.class.isAssignableFrom(valueClass)) { - input = byteValue().parse(input, (Byte) defaultValue); - } else if (Short.class.isAssignableFrom(valueClass) || short.class.isAssignableFrom(valueClass)) { - input = shortValue().parse(input, (Short) defaultValue); - } - if (valueClass.isInstance(input)) return valueClass.cast(input); - else throw new IllegalArgumentException("Cannot cast value to " + valueClass.getName()); - }; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser parseString(Class valueClass) { - return (input, defaultValue) -> { - if (valueClass.isInstance(input)) return valueClass.cast(input); - else throw new IllegalArgumentException("Cannot cast string to " + valueClass.getName()); - }; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser castToString() { - return (input, defaultValue) -> { - if (input instanceof String) return (String) input; - else return input.toString(); - }; - } - - @Contract(pure = true) - static @NotNull ConfigValueParser intValue() { - return (input, defaultValue) -> ConfigDataFunction.intValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser shortValue() { - return (input, defaultValue) -> ConfigDataFunction.shortValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser doubleValue() { - return (input, defaultValue) -> ConfigDataFunction.doubleValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser byteValue() { - return (input, defaultValue) -> ConfigDataFunction.byteValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser floatValue() { - return (input, defaultValue) -> ConfigDataFunction.floatValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser longValue() { - return (input, defaultValue) -> ConfigDataFunction.longValue().parse(input); - } - - @Contract(pure = true) - static @NotNull ConfigValueParser booleanValue() { - return (input, defaultValue) -> ConfigDataFunction.booleanValue().parse(input); - } - - @Contract(pure = true) - static @NotNull > ConfigValueParser enumValue(Class enumClass) { - return (input, defaultValue) -> { - if (input instanceof Enum) { - return enumClass.cast(input); - } else if (input instanceof String) { - return Enum.valueOf(enumClass, (String) input); - } else if (input instanceof Number) { - return enumClass.getEnumConstants()[((Number) input).intValue()]; - } else { - throw new IllegalArgumentException("Cannot cast value to " + enumClass.getName()); - } - }; - } - -} - - 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 deleted file mode 100644 index 09de47b..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java +++ /dev/null @@ -1,150 +0,0 @@ -package cc.carm.lib.configuration.core.source; - -import cc.carm.lib.configuration.core.Configuration; -import cc.carm.lib.configuration.source.comment.ConfigurationComments; -import cc.carm.lib.configuration.value.ConfigValue; -import cc.carm.lib.configuration.value.impl.CachedConfigValue; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; - -import java.util.List; -import java.util.Optional; - -/** - * 配置文件提供者,用于为 {@link ConfigValue} 提供配置文件的源,以便实现读取、保存等操作。 - * - * @param 配置文件的原生功能类 - */ -public abstract class ConfigurationProvider> { - - protected long updateTime; - - protected ConfigurationProvider() { - this.updateTime = System.currentTimeMillis(); - } - - /** - * 得到配置文件的更新(最后加载)时间。 - * - * @return 更新时间 - */ - public long getUpdateTime() { - return updateTime; - } - - /** - * 用于 {@link CachedConfigValue} 判断缓存值是否过期(即缓存的时间早于配置文件的最后加载时间)。 - * - * @param time 缓存值时的时间戳 - * @return 缓存值是否过期 - */ - public boolean isExpired(long time) { - return getUpdateTime() > time; - } - - /** - * 得到配置文件的原生功能类。 - * - * @return 原生类 - */ - public abstract @NotNull W getConfiguration(); - - /** - * 重载当前配置文件。(将不会保存已修改的内容) - * - * @throws Exception 当重载出现错误时抛出 - */ - public void reload() throws Exception { - onReload(); // 调用重写的Reload方法 - this.updateTime = System.currentTimeMillis(); - } - - /** - * 将当前对配置文件的更改进行保存。 - * - * @throws Exception 当保存出现错误时抛出 - */ - public abstract void save() throws Exception; - - /** - * 针对于不同配置文件类型所执行的重载操作。 - * - * @throws Exception 当操作出现错误时抛出。 - */ - protected abstract void onReload() throws Exception; - - public abstract @Nullable ConfigurationComments getComments(); - - public void setHeaderComment(@Nullable String path, @Nullable List comments) { - if (getComments() == null) return; - getComments().setHeaderComments(path, comments); - } - - public void setInlineComment(@NotNull String path, @Nullable String comment) { - if (getComments() == null) return; - getComments().setInlineComment(path, comment); - } - - @Nullable - @Unmodifiable - public List getHeaderComment(@Nullable String path) { - return Optional.ofNullable(getComments()).map(c -> c.getHeaderComment(path)).orElse(null); - } - - public @Nullable String getInlineComment(@NotNull String path) { - return Optional.ofNullable(getComments()).map(c -> c.getInlineComment(path)).orElse(null); - } - - public abstract @NotNull ConfigInitializer> getInitializer(); - - /** - * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。 - * - * @param configClazz 配置文件类,须继承于 {@link Configuration} 。 - */ - public void initialize(Class configClazz) { - initialize(configClazz, true); - } - - /** - * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。 - * - * @param configClazz 配置文件类,须继承于 {@link Configuration} 。 - * @param saveDefaults 是否写入默认值(默认为 true)。 - */ - public void initialize(Class configClazz, boolean saveDefaults) { - this.getInitializer().initialize(configClazz, saveDefaults); - } - - /** - * 初始化指定类的所有 {@link ConfigValue} 对象。 - * - * @param configClazz 配置文件类,须继承于 {@link Configuration} 。 - * @param saveDefaults 是否写入默认值(默认为 true)。 - * @param loadSubClasses 是否加载内部子类(默认为 true)。 - */ - public void initialize(Class configClazz, boolean saveDefaults, boolean loadSubClasses) { - this.getInitializer().initialize(configClazz, saveDefaults, loadSubClasses); - } - - /** - * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。 - * - * @param config 配置文件实例类,须实现 {@link Configuration} 。 - */ - public void initialize(@NotNull Configuration config) { - this.getInitializer().initialize(config, true); - } - - /** - * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。 - * - * @param config 配置文件实例类,须实现 {@link Configuration} 。 - * @param saveDefaults 是否写入默认值(默认为 true)。 - */ - public void initialize(@NotNull Configuration config, boolean saveDefaults) { - this.getInitializer().initialize(config, saveDefaults); - } - -} 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 deleted file mode 100644 index 478af95..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationWrapper.java +++ /dev/null @@ -1,73 +0,0 @@ -package cc.carm.lib.configuration.core.source; - -import cc.carm.lib.configuration.core.function.ConfigValueParser; -import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public interface ConfigurationWrapper extends ConfigurationReader { - - @Override - default ConfigurationWrapper getWrapper() { - return this; - } - - @NotNull S getSource(); - - @NotNull - Set getKeys(boolean deep); - - @NotNull - Map getValues(boolean deep); - - void set(@NotNull String path, @Nullable Object value); - - boolean contains(@NotNull String path); - - default boolean isType(@NotNull String path, @NotNull Class typeClass) { - return typeClass.isInstance(get(path)); - } - - @Nullable Object get(@NotNull String path); - - default @Nullable T get(@NotNull String path, @NotNull Class clazz) { - return get(path, null, clazz); - } - - default @Nullable T get(@NotNull String path, @NotNull ConfigValueParser parser) { - return get(path, null, parser); - } - - @Contract("_,!null,_->!null") - default @Nullable T get(@NotNull String path, @Nullable T defaultValue, @NotNull Class clazz) { - return get(path, defaultValue, ConfigValueParser.castObject(clazz)); - } - - @Contract("_,!null,_->!null") - default @Nullable T get(@NotNull String path, @Nullable T defaultValue, - @NotNull ConfigValueParser parser) { - Object value = get(path); - if (value != null) { - try { - return parser.parse(value, defaultValue); - } catch (Exception e) { - e.printStackTrace(); - } - } - return defaultValue; - } - - boolean isList(@NotNull String path); - - @Nullable List getList(@NotNull String path); - - boolean isConfigurationSection(@NotNull String path); - - @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 deleted file mode 100644 index ffffd13..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/impl/FileConfigProvider.java +++ /dev/null @@ -1,89 +0,0 @@ -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; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.net.URLConnection; -import java.nio.file.Files; -import java.util.Objects; - -public abstract class FileConfigProvider> extends ConfigurationProvider { - - protected final @NotNull File file; - - protected FileConfigProvider(@NotNull File file) { - this.file = file; - } - - public @NotNull File getFile() { - return file; - } - - public void initializeFile(@Nullable String sourcePath) throws IOException { - 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 (!this.file.createNewFile()) { - throw new IOException("Failed to create file " + file.getAbsolutePath()); - } - - if (sourcePath != null) { - try { - saveResource(sourcePath, true); - } catch (IllegalArgumentException ignored) { - } - } - } - - public void saveResource(@NotNull String resourcePath, boolean replace) - throws IOException, IllegalArgumentException { - Objects.requireNonNull(resourcePath, "ResourcePath cannot be null"); - if (resourcePath.isEmpty()) throw new IllegalArgumentException("ResourcePath cannot be empty"); - - resourcePath = resourcePath.replace('\\', '/'); - - URL url = this.getClass().getClassLoader().getResource(resourcePath); - if (url == null) throw new IllegalArgumentException("The resource '" + resourcePath + "' not exists"); - - File outDir = file.getParentFile(); - - if (!outDir.exists() && !outDir.mkdirs()) throw new IOException("Failed to create directory " + outDir); - if (!file.exists() || replace) { - try (OutputStream out = Files.newOutputStream(file.toPath())) { - URLConnection connection = url.openConnection(); - connection.setUseCaches(false); - try (InputStream in = connection.getInputStream()) { - byte[] buf = new byte[1024]; - int len; - while ((len = in.read(buf)) > 0) { - out.write(buf, 0, len); - } - } - } - } - } - - @Nullable - public InputStream getResource(@NotNull String filename) { - try { - URL url = this.getClass().getClassLoader().getResource(filename); - if (url == null) return null; - URLConnection connection = url.openConnection(); - connection.setUseCaches(false); - return connection.getInputStream(); - } catch (IOException ex) { - return null; - } - } -} diff --git a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigDataFunction.java b/core/src/main/java/cc/carm/lib/configuration/function/ConfigDataFunction.java similarity index 99% rename from core/src/main/java/cc/carm/lib/configuration/core/function/ConfigDataFunction.java rename to core/src/main/java/cc/carm/lib/configuration/function/ConfigDataFunction.java index d40fda3..04d8cff 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/function/ConfigDataFunction.java +++ b/core/src/main/java/cc/carm/lib/configuration/function/ConfigDataFunction.java @@ -1,4 +1,4 @@ -package cc.carm.lib.configuration.core.function; +package cc.carm.lib.configuration.function; import org.jetbrains.annotations.Contract; diff --git a/core/src/main/java/cc/carm/lib/configuration/function/ConfigValueParser.java b/core/src/main/java/cc/carm/lib/configuration/function/ConfigValueParser.java new file mode 100644 index 0000000..9554776 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/function/ConfigValueParser.java @@ -0,0 +1,62 @@ +package cc.carm.lib.configuration.function; + + +import cc.carm.lib.configuration.source.ConfigurationProvider; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +@FunctionalInterface +public interface ConfigValueParser { + + @Nullable R parse(@NotNull ConfigurationProvider provider, + @NotNull T data, @Nullable R defaultValue) throws Exception; + + default ConfigValueParser andThen(@NotNull ConfigValueParser after) { + Objects.requireNonNull(after); + return ((provider, data, defaultValue) -> { + R result = parse(provider, data, null); + if (result == null) return defaultValue; + else return after.parse(provider, result, defaultValue); + }); + } + + default ConfigValueParser compose(@NotNull ConfigValueParser before) { + Objects.requireNonNull(before); + return ((provider, data, defaultValue) -> { + T result = before.parse(provider, data, null); + if (result == null) return null; + return parse(provider, result, defaultValue); + }); + } + + default ConfigValueParser compose(@NotNull ConfigDataFunction before) { + Objects.requireNonNull(before); + return ((provider, data, defaultValue) -> { + T result = before.parse(data); + return parse(provider, result, defaultValue); + }); + } + + @Contract(pure = true) + static @NotNull ConfigValueParser identity() { + return (provider, input, defaultValue) -> input; + } + + @Contract(pure = true) + static @NotNull ConfigValueParser toObject() { + return (provider, input, defaultValue) -> input; + } + + @Contract(pure = true) + static @NotNull ConfigValueParser required() { + return (provider, input, defaultValue) -> { + throw new IllegalArgumentException("Please specify the value parser."); + }; + } + +} + + diff --git a/core/src/main/java/cc/carm/lib/configuration/loader/ConfigurationLoader.java b/core/src/main/java/cc/carm/lib/configuration/loader/ConfigurationLoader.java new file mode 100644 index 0000000..d2d341a --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/loader/ConfigurationLoader.java @@ -0,0 +1,107 @@ +package cc.carm.lib.configuration.loader; + +import cc.carm.lib.configuration.Configuration; +import cc.carm.lib.configuration.source.ConfigurationProvider; +import cc.carm.lib.configuration.option.ConfigurationOptions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.Arrays; + +/** + * Configuration loader, + * used to load configuration values from {@link Configuration} classes. + */ +public class ConfigurationLoader { + + protected PathGenerator pathGenerator; + + public ConfigurationLoader() { + this(StandardPathGenerator.of()); + } + + public ConfigurationLoader(PathGenerator pathGenerator) { + this.pathGenerator = pathGenerator; + } + + public void setPathGenerator(PathGenerator pathGenerator) { + this.pathGenerator = pathGenerator; + } + + public PathGenerator getPathGenerator() { + return pathGenerator; + } + + public @Nullable String getFieldPath(ConfigurationProvider provider, @Nullable String parentPath, @NotNull Field field) { + return pathGenerator.getFieldPath(provider, parentPath, field); + } + + public @Nullable String getClassPath(ConfigurationProvider provider, @Nullable String parentPath, + @NotNull Class clazz, @Nullable Field clazzField) { + return pathGenerator.getClassPath(provider, parentPath, clazz, clazzField); + } + + public void load(ConfigurationProvider provider, @NotNull Configuration config) throws Exception { + initializeInstance(provider, config, null, null); + if (provider.option(ConfigurationOptions.SET_DEFAULTS)) provider.save(); + } + + public void load(ConfigurationProvider provider, @NotNull Class clazz) throws Exception { + initializeStaticClass(provider, clazz, null, null); + if (provider.option(ConfigurationOptions.SET_DEFAULTS)) provider.save(); + } + + + // 针对实例类的初始化方法 + private void initializeInstance(@NotNull ConfigurationProvider provider, + @NotNull Configuration root, @Nullable String parentPath, @Nullable Field configField) { + String path = getClassPath(provider, parentPath, root.getClass(), configField); + Arrays.stream(root.getClass().getDeclaredFields()).forEach(field -> initializeField(provider, root, field, path)); + } + + // 针对静态类的初始化方法 + private void initializeStaticClass(@NotNull ConfigurationProvider provider, + @NotNull Class clazz, @Nullable String parentPath, @Nullable Field configField) { + if (!Configuration.class.isAssignableFrom(clazz)) return; // 只解析继承了 ConfigurationRoot 的类 + String path = getClassPath(provider, parentPath, clazz, configField); + + for (Field field : clazz.getDeclaredFields()) { + initializeField(provider, clazz, field, path); + } + + if (!provider.option(ConfigurationOptions.LOAD_SUB_CLASSES)) return; + Class[] classes = clazz.getDeclaredClasses(); + for (int i = classes.length - 1; i >= 0; i--) { // 逆向加载,保持顺序。 + initializeStaticClass(provider, classes[i], path, null); + } + } + + private void initializeField(@NotNull ConfigurationProvider provider, + @NotNull Object source, @NotNull Field field, @Nullable String parent) { + try { + field.setAccessible(true); + Object object = field.get(source); +// +// if (object instanceof ConfigValue) { +// // 目标是 ConfigValue 实例,进行具体的初始化注入 +// +// } else + + if (source instanceof Configuration && object instanceof Configuration) { + // 当且仅当 源字段与字段 均为ConfigurationRoot实例时,才对目标字段进行下一步初始化加载。 + initializeInstance(provider, (Configuration) object, parent, field); + } else if (source instanceof Class && object instanceof Class) { + // 当且仅当 源字段与字段 均为静态类时,才对目标字段进行下一步初始化加载。 + initializeStaticClass(provider, (Class) object, parent, field); + } + + // 以上判断实现以下规范: + // - 实例类中仅加载 ConfigValue实例 与 ConfigurationRoot实例 + // - 静态类中仅加载 静态ConfigValue实例 与 静态ConfigurationRoot类 + + } catch (IllegalAccessException ignored) { + } + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/loader/PathGenerator.java b/core/src/main/java/cc/carm/lib/configuration/loader/PathGenerator.java new file mode 100644 index 0000000..d2ad485 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/loader/PathGenerator.java @@ -0,0 +1,43 @@ +package cc.carm.lib.configuration.loader; + +import cc.carm.lib.configuration.source.ConfigurationProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; + +public interface PathGenerator { + + @Nullable String getFieldPath(@NotNull ConfigurationProvider provider, + @Nullable String parentPath, @NotNull Field field); + + @Nullable String getClassPath(@NotNull ConfigurationProvider provider, + @Nullable String parentPath, @NotNull Class clazz, @Nullable Field clazzField); + + /** + * Get the configuration name of the specified element. + * Use the naming convention of all lowercase and "-" links. + * + * @param name source name + * @return the final path + */ + static String covertPathName(String name) { + return name + // Replace all uppercase letters with dashes + .replaceAll("[A-Z]", "-$0") + // If the first letter is also capitalized, + // it will also be converted and the first dash will need to be removed + .replaceAll("-(.*)", "$1") + // Because the name may contain _, it needs to be treated a little differently + .replaceAll("_-([A-Z])", "_$1") + // The content that is not named in all caps is then converted + .replaceAll("([a-z])-([A-Z])", "$1_$2") + // Remove any extra horizontal lines + .replace("-", "") + // Replace the underscore with a dash + .replace("_", "-") + // Finally, convert it to all lowercase + .toLowerCase(); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/loader/StandardPathGenerator.java b/core/src/main/java/cc/carm/lib/configuration/loader/StandardPathGenerator.java new file mode 100644 index 0000000..4513647 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/loader/StandardPathGenerator.java @@ -0,0 +1,86 @@ +package cc.carm.lib.configuration.loader; + +import cc.carm.lib.configuration.annotation.ConfigPath; +import cc.carm.lib.configuration.source.ConfigurationProvider; +import cc.carm.lib.configuration.option.ConfigurationOptions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.function.UnaryOperator; + +public class StandardPathGenerator implements PathGenerator { + + public static StandardPathGenerator of() { + return of(PathGenerator::covertPathName); + } + + public static StandardPathGenerator of(UnaryOperator pathConverter) { + return new StandardPathGenerator(pathConverter); + } + + protected UnaryOperator pathConverter; + + public StandardPathGenerator(UnaryOperator pathConverter) { + this.pathConverter = pathConverter; + } + + public @NotNull UnaryOperator getPathConverter() { + return pathConverter; + } + + public void setPathConverter(UnaryOperator pathConverter) { + this.pathConverter = pathConverter; + } + + public String covertPath(String name) { + return pathConverter.apply(name); + } + + public char pathSeparator(ConfigurationProvider provider) { + return provider.option(ConfigurationOptions.PATH_SEPARATOR); + } + + @Override + public @Nullable String getFieldPath(@NotNull ConfigurationProvider provider, + @Nullable String parentPath, @NotNull Field field) { + ConfigPath path = field.getAnnotation(ConfigPath.class); + if (path == null) return link(provider, parentPath, false, field.getName()); // No annotation, use field name. + else return link(provider, parentPath, path.root(), select(path.value(), field.getName())); + } + + @Override + public @Nullable String getClassPath(@NotNull ConfigurationProvider provider, + @Nullable String parentPath, @NotNull Class clazz, @Nullable Field clazzField) { + // For standard path generator, we generate path following by: + // 1. Check if the class has a ConfigPath annotation, if so, use the root and value as the path. + // 2. If the class defined as a field, check if the field has a ConfigPath annotation, + // and use filed information. + ConfigPath clazzPath = clazz.getAnnotation(ConfigPath.class); + + if (clazzPath != null) return link(provider, parentPath, clazzPath.root(), clazzPath.value()); + if (clazzField == null) { + return link(provider, parentPath, false, clazz.getSimpleName()); // No field, use class name. + } + + ConfigPath fieldPath = clazzField.getAnnotation(ConfigPath.class); + if (fieldPath == null) return link(provider, parentPath, false, clazzField.getName()); + else return getFieldPath(provider, parentPath, clazzField); + } + + protected String select(String path, String defaultValue) { + if (path == null || path.isEmpty()) return defaultValue; + else return isBlank(path) ? null : path; + } + + protected boolean isBlank(String path) { + return path == null || path.replace(" ", "").isEmpty(); + } + + protected @Nullable String link(@NotNull ConfigurationProvider provider, @Nullable String parent, boolean root, @Nullable String path) { + if (path == null || path.isEmpty()) return root ? null : parent; + return root || parent == null ? covertPath(path) : parent + pathSeparator(provider) + covertPath(path); + } + + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/manifest/ValueManifest.java b/core/src/main/java/cc/carm/lib/configuration/manifest/ValueManifest.java deleted file mode 100644 index 8ef68e2..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/manifest/ValueManifest.java +++ /dev/null @@ -1,8 +0,0 @@ -package cc.carm.lib.configuration.manifest; - -public class ValueManifest { - - - - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationOptions.java b/core/src/main/java/cc/carm/lib/configuration/option/ConfigurationOptions.java similarity index 56% rename from core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationOptions.java rename to core/src/main/java/cc/carm/lib/configuration/option/ConfigurationOptions.java index 88485b8..6e17d6c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationOptions.java +++ b/core/src/main/java/cc/carm/lib/configuration/option/ConfigurationOptions.java @@ -1,4 +1,4 @@ -package cc.carm.lib.configuration.source.standard; +package cc.carm.lib.configuration.option; import cc.carm.lib.easyoptions.OptionType; @@ -13,14 +13,9 @@ public interface ConfigurationOptions { OptionType PATH_SEPARATOR = of('.'); /** - * Whether to copy files from resource if exists. + * Whether to set & save default values if offered and not exists in configuration. */ - OptionType COPY_DEFAULTS = of(true); - - /** - * Whether to save default values if offered and not exists in configuration. - */ - OptionType SAVE_DEFAULTS = of(true); + OptionType SET_DEFAULTS = of(true); /** * Whether to load subclasses of configuration class. diff --git a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationFactory.java similarity index 62% rename from core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java rename to core/src/main/java/cc/carm/lib/configuration/source/ConfigurationFactory.java index 188dae2..2e7b229 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationFactory.java @@ -2,8 +2,9 @@ package cc.carm.lib.configuration.source; import cc.carm.lib.configuration.adapter.ValueAdapter; import cc.carm.lib.configuration.adapter.ValueAdapterRegistry; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.source.path.PathGenerator; +import cc.carm.lib.configuration.function.ConfigDataFunction; +import cc.carm.lib.configuration.loader.ConfigurationLoader; +import cc.carm.lib.configuration.loader.PathGenerator; import cc.carm.lib.easyoptions.OptionHolder; import cc.carm.lib.easyoptions.OptionType; import org.jetbrains.annotations.NotNull; @@ -11,53 +12,52 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; import java.util.function.Function; -public abstract class ConfigurationBuilder

, C> { +public abstract class ConfigurationFactory

, C> { - - protected Function> loaderFunction = ConfigurationLoader::new; - protected Consumer> loaderConsumer = loader -> { + protected Function loaderFunction = p -> new ConfigurationLoader(); + protected Consumer loaderConsumer = loader -> { }; - protected ValueAdapterRegistry

adapters = new ValueAdapterRegistry<>(); + protected ValueAdapterRegistry adapters = new ValueAdapterRegistry(); protected OptionHolder options = new OptionHolder(); public abstract C getThis(); - public C loader(Function> loaderFunction) { + public C loader(Function loaderFunction) { this.loaderFunction = loaderFunction; return getThis(); } - public C loader(ConfigurationLoader

loader) { + public C loader(ConfigurationLoader loader) { return loader(p -> loader); } - public C loader(Consumer> loaderConsumer) { + public C loader(Consumer loaderConsumer) { this.loaderConsumer = this.loaderConsumer.andThen(loaderConsumer); return getThis(); } - public C pathGenerator(PathGenerator

pathGenerator) { + public C pathGenerator(PathGenerator pathGenerator) { return loader(loader -> { loader.setPathGenerator(pathGenerator); }); } - public C adapters(ValueAdapterRegistry

adapters) { + public C adapters(ValueAdapterRegistry adapters) { this.adapters = adapters; return getThis(); } - public C adapter(Consumer> adapterRegistryConsumer) { + public C adapter(Consumer adapterRegistryConsumer) { adapterRegistryConsumer.accept(adapters); return getThis(); } - public C adapter(@NotNull ValueAdapter adapter) { + public C adapter(@NotNull ValueAdapter adapter) { return adapter(a -> a.register(adapter)); } - public C adapter(Class clazz, @NotNull ValueAdapter adapter) { + public C adapter(Class clazz, @NotNull ValueAdapter adapter) { return adapter(a -> a.register(clazz, adapter)); } diff --git a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationLoader.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationLoader.java deleted file mode 100644 index a56eae9..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationLoader.java +++ /dev/null @@ -1,196 +0,0 @@ -package cc.carm.lib.configuration.source; - -import cc.carm.lib.configuration.annotation.ConfigPath; -import cc.carm.lib.configuration.core.Configuration; -import cc.carm.lib.configuration.source.path.PathGenerator; -import cc.carm.lib.configuration.source.path.StandardPathGenerator; -import cc.carm.lib.configuration.value.ConfigValue; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; - -/** - * Configuration loader, - * used to load configuration values from {@link cc.carm.lib.configuration.core.Configuration} classes. - */ -public class ConfigurationLoader

> { - - protected final P provider; - protected PathGenerator

pathGenerator; - - public ConfigurationLoader(P provider) { - this(provider, StandardPathGenerator.of(provider)); - } - - public ConfigurationLoader(P provider, PathGenerator

pathGenerator) { - this.provider = provider; - this.pathGenerator = pathGenerator; - } - - public void setPathGenerator(PathGenerator

pathGenerator) { - this.pathGenerator = pathGenerator; - } - - public PathGenerator

getPathGenerator() { - return pathGenerator; - } - - /** - * 初始化指定类以及其子类的所有 {@link ConfigValue} 对象。 - * - * @param clazz 配置文件类,须继承于 {@link Configuration} 。 - */ - public void initialize(@NotNull P provider, @NotNull Class clazz) { - initialize(clazz, saveDefaults, true); - } - - /** - * 初始化指定类的所有 {@link ConfigValue} 对象。 - * - * @param clazz 配置文件类,须继承于 {@link Configuration} 。 - * @param saveDefaults 是否写入默认值(默认为 true)。 - * @param loadSubClasses 是否加载内部子类(默认为 true)。 - */ - public void initialize(@NotNull Class clazz) { - initializeStaticClass( - clazz, null, null, - null, null, null, - saveDefaults, loadSubClasses - ); - if (saveDefaults) { - try { - provider.save(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - /** - * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。 - * - * @param config 配置文件实例类,须实现 {@link Configuration} 。 - */ - public void initialize(@NotNull Configuration config) { - initialize(config, true); - } - - /** - * 初始化指定实例的所有 {@link ConfigValue} 与内部 {@link Configuration} 对象。 - * - * @param config 配置文件实例类,须实现 {@link Configuration} 。 - * @param saveDefaults 是否写入默认值(默认为 true)。 - */ - public void initialize(@NotNull Configuration config, boolean saveDefaults) { - initializeInstance( - config, null, null, - null, null, null, - saveDefaults - ); - if (saveDefaults) { - try { - provider.save(); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - - // 针对实例类的初始化方法 - private void initializeInstance(@NotNull Configuration root, - @Nullable String parentPath, @Nullable String fieldName, - @Nullable ConfigPath fieldPath, - @Nullable HeaderComment fieldHeaderComments, - @Nullable InlineComment fieldInlineComments, - boolean saveDefaults) { - String path = getClassPath(root.getClass(), parentPath, fieldName, fieldPath); - this.provider.setHeaderComment(path, getClassHeaderComments(root.getClass(), fieldHeaderComments)); - if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments)); - - for (Field field : root.getClass().getDeclaredFields()) { - initializeField(root, field, path, saveDefaults, false); - } - } - - // 针对静态类的初始化方法 - private void initializeStaticClass(@NotNull Class clazz, - @Nullable String parentPath, @Nullable String fieldName, - @Nullable ConfigPath fieldPath, - @Nullable HeaderComment fieldHeaderComments, - @Nullable InlineComment fieldInlineComments, - boolean saveDefaults, boolean loadSubClasses) { - 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)); - - for (Field field : clazz.getDeclaredFields()) { - initializeField(clazz, field, path, saveDefaults, loadSubClasses); - } - - if (!loadSubClasses) return; - Class[] classes = clazz.getDeclaredClasses(); - for (int i = classes.length - 1; i >= 0; i--) { // 逆向加载,保持顺序。 - initializeStaticClass( - classes[i], path, classes[i].getSimpleName(), - null, null, null, - saveDefaults, true - ); - } - } - - private void initializeField(@NotNull Object source, @NotNull Field field, - @Nullable String parent, boolean saveDefaults, boolean loadSubClasses) { - try { - field.setAccessible(true); - Object object = field.get(source); - - if (object instanceof ConfigValue) { - initializeValue( - (ConfigValue) object, getFieldPath(field, parent), - field.getAnnotation(HeaderComment.class), - field.getAnnotation(InlineComment.class), - saveDefaults - ); - } else if (source instanceof Configuration && object instanceof Configuration) { - // 当且仅当 源字段与字段 均为ConfigurationRoot实例时,才对目标字段进行下一步初始化加载。 - initializeInstance( - (Configuration) object, parent, field.getName(), - field.getAnnotation(ConfigPath.class), - field.getAnnotation(HeaderComment.class), - field.getAnnotation(InlineComment.class), - saveDefaults - ); - } else if (source instanceof Class && object instanceof Class) { - // 当且仅当 源字段与字段 均为静态类时,才对目标字段进行下一步初始化加载。 - initializeStaticClass( - (Class) object, parent, field.getName(), - field.getAnnotation(ConfigPath.class), - field.getAnnotation(HeaderComment.class), - field.getAnnotation(InlineComment.class), - saveDefaults, loadSubClasses - ); - } - - // 以上判断实现以下规范: - // - 实例类中仅加载 ConfigValue实例 与 ConfigurationRoot实例 - // - 静态类中仅加载 静态ConfigValue实例 与 静态ConfigurationRoot类 - - } catch (IllegalAccessException ignored) { - } - } - - protected void initializeValue(@NotNull ConfigValue value, @NotNull String path, - @Nullable HeaderComment fieldHeaderComment, - @Nullable InlineComment fieldInlineComment, - boolean saveDefaults) { - value.initialize( - provider, saveDefaults, path, - readHeaderComments(fieldHeaderComment), - readInlineComments(fieldInlineComment) - ); - } - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationProvider.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationProvider.java index fb662ed..82cc98b 100644 --- a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationProvider.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationProvider.java @@ -1,17 +1,38 @@ package cc.carm.lib.configuration.source; +import cc.carm.lib.configuration.Configuration; import cc.carm.lib.configuration.adapter.ValueAdapterRegistry; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.loader.ConfigurationLoader; import cc.carm.lib.easyoptions.OptionHolder; import cc.carm.lib.easyoptions.OptionType; import org.jetbrains.annotations.NotNull; -public abstract class ConfigurationProvider

> { +public class ConfigurationProvider> { - protected @NotNull ConfigurationLoader

loader = new ConfigurationLoader<>(); - protected @NotNull ValueAdapterRegistry

adapters = new ValueAdapterRegistry<>(); - protected @NotNull OptionHolder options = new OptionHolder(); + protected final @NotNull S source; + protected final @NotNull ConfigurationLoader loader; + protected final @NotNull ValueAdapterRegistry adapters; + protected final @NotNull OptionHolder options; + public ConfigurationProvider(@NotNull S source, @NotNull ConfigurationLoader loader, + @NotNull ValueAdapterRegistry adapters, @NotNull OptionHolder options) { + this.source = source; + this.loader = loader; + this.adapters = adapters; + this.options = options; + } + + public @NotNull S source() { + return source; + } + + public void reload() throws Exception { + source().reload(); + } + + public void save() throws Exception { + source().save(); + } public OptionHolder options() { return options; @@ -25,13 +46,29 @@ public abstract class ConfigurationProvider

> options.set(option, value); } - public ConfigurationLoader

loader() { + public ValueAdapterRegistry adapters() { + return this.adapters; + } + + + public ConfigurationLoader loader() { return loader; } - public void load(Configuration configuration) { - loader().load(configuration); + public void load(Class configClass) { + try { + loader.load(this, configClass); + } catch (Exception e) { + e.printStackTrace(); + } } + public void load(@NotNull Configuration config) { + try { + loader.load(this, config); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationReader.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSection.java similarity index 53% rename from core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationReader.java rename to core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSection.java index 96b85f4..c058695 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationReader.java +++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSection.java @@ -1,21 +1,71 @@ -package cc.carm.lib.configuration.core.source; +package cc.carm.lib.configuration.source; -import cc.carm.lib.configuration.core.function.ConfigValueParser; +import cc.carm.lib.configuration.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigValueParser; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; -interface ConfigurationReader { +public interface ConfigurationSection { + + @NotNull + Set getKeys(boolean deep); + + @NotNull + Map getValues(boolean deep); + + void set(@NotNull String path, @Nullable Object value); + + boolean contains(@NotNull String path); + + default boolean isType(@NotNull String path, @NotNull Class typeClass) { + return typeClass.isInstance(get(path)); + } + + boolean isList(@NotNull String path); + + @Nullable List getList(@NotNull String path); + + boolean isSection(@NotNull String path); + + @Nullable + ConfigurationSection getSection(@NotNull String path); + + @Nullable Object get(@NotNull String path); + + default @Nullable T get(@NotNull String path, @NotNull Class clazz) { + return get(path, null, clazz); + } + + default @Nullable T get(@NotNull String path, @NotNull ConfigValueParser parser) { + return get(path, null, parser); + } + + @Contract("_,!null,_->!null") + default @Nullable T get(@NotNull String path, @Nullable T defaultValue, @NotNull Class clazz) { + return get(path, defaultValue, ConfigValueParser.castObject(clazz)); + } + + @Contract("_,!null,_->!null") + default @Nullable T get(@NotNull String path, @Nullable T defaultValue, + @NotNull ConfigValueParser parser) { + Object value = get(path); + if (value != null) { + try { + return parser.parse(value, defaultValue); + } catch (Exception e) { + e.printStackTrace(); + } + } + return defaultValue; + } - ConfigurationWrapper getWrapper(); default boolean isBoolean(@NotNull String path) { - return getWrapper().isType(path, Boolean.class); + return isType(path, Boolean.class); } default boolean getBoolean(@NotNull String path) { @@ -24,11 +74,11 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Boolean getBoolean(@NotNull String path, @Nullable Boolean def) { - return getWrapper().get(path, def, ConfigValueParser.booleanValue()); + return get(path, def, ConfigValueParser.booleanValue()); } default @Nullable Boolean isByte(@NotNull String path) { - return getWrapper().isType(path, Byte.class); + return isType(path, Byte.class); } default @Nullable Byte getByte(@NotNull String path) { @@ -37,11 +87,11 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Byte getByte(@NotNull String path, @Nullable Byte def) { - return getWrapper().get(path, def, ConfigValueParser.byteValue()); + return get(path, def, ConfigValueParser.byteValue()); } default boolean isShort(@NotNull String path) { - return getWrapper().isType(path, Short.class); + return isType(path, Short.class); } default @Nullable Short getShort(@NotNull String path) { @@ -50,12 +100,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Short getShort(@NotNull String path, @Nullable Short def) { - return getWrapper().get(path, def, ConfigValueParser.shortValue()); + return get(path, def, ConfigValueParser.shortValue()); } default boolean isInt(@NotNull String path) { - return getWrapper().isType(path, Integer.class); + return isType(path, Integer.class); } default @Nullable Integer getInt(@NotNull String path) { @@ -64,12 +114,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Integer getInt(@NotNull String path, @Nullable Integer def) { - return getWrapper().get(path, def, ConfigValueParser.intValue()); + return get(path, def, ConfigValueParser.intValue()); } default boolean isLong(@NotNull String path) { - return getWrapper().isType(path, Long.class); + return isType(path, Long.class); } default @Nullable Long getLong(@NotNull String path) { @@ -78,12 +128,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Long getLong(@NotNull String path, @Nullable Long def) { - return getWrapper().get(path, def, ConfigValueParser.longValue()); + return get(path, def, ConfigValueParser.longValue()); } default boolean isFloat(@NotNull String path) { - return getWrapper().isType(path, Float.class); + return isType(path, Float.class); } default @Nullable Float getFloat(@NotNull String path) { @@ -92,12 +142,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Float getFloat(@NotNull String path, @Nullable Float def) { - return getWrapper().get(path, def, ConfigValueParser.floatValue()); + return get(path, def, ConfigValueParser.floatValue()); } default boolean isDouble(@NotNull String path) { - return getWrapper().isType(path, Double.class); + return isType(path, Double.class); } default @Nullable Double getDouble(@NotNull String path) { @@ -106,12 +156,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Double getDouble(@NotNull String path, @Nullable Double def) { - return getWrapper().get(path, def, ConfigValueParser.doubleValue()); + return get(path, def, ConfigValueParser.doubleValue()); } default boolean isChar(@NotNull String path) { - return getWrapper().isType(path, Boolean.class); + return isType(path, Boolean.class); } default @Nullable Character getChar(@NotNull String path) { @@ -120,12 +170,12 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable Character getChar(@NotNull String path, @Nullable Character def) { - return getWrapper().get(path, def, Character.class); + return get(path, def, Character.class); } default boolean isString(@NotNull String path) { - return getWrapper().isType(path, String.class); + return isType(path, String.class); } default @Nullable String getString(@NotNull String path) { @@ -134,61 +184,59 @@ interface ConfigurationReader { @Contract("_, !null -> !null") default @Nullable String getString(@NotNull String path, @Nullable String def) { - return getWrapper().get(path, def, String.class); + return get(path, def, String.class); } - default @NotNull List getList(@NotNull String path, @NotNull ConfigValueParser parser) { - return parseList(getWrapper().getList(path), parser); + default @NotNull List getList(@NotNull String path, @NotNull ConfigDataFunction parser) { + return parseList(getList(path), parser); } @Unmodifiable default @NotNull List getStringList(@NotNull String path) { - return getList(path, ConfigValueParser.castToString()); + return getList(path, ConfigDataFunction.castToString()); } @Unmodifiable default @NotNull List getIntegerList(@NotNull String path) { - return getList(path, ConfigValueParser.intValue()); + return getList(path, ConfigDataFunction.intValue()); } @Unmodifiable default @NotNull List getLongList(@NotNull String path) { - return getList(path, ConfigValueParser.longValue()); + return getList(path, ConfigDataFunction.longValue()); } @Unmodifiable default @NotNull List getDoubleList(@NotNull String path) { - return getList(path, ConfigValueParser.doubleValue()); + return getList(path, ConfigDataFunction.doubleValue()); } @Unmodifiable default @NotNull List getFloatList(@NotNull String path) { - return getList(path, ConfigValueParser.floatValue()); + return getList(path, ConfigDataFunction.floatValue()); } @Unmodifiable default @NotNull List getByteList(@NotNull String path) { - return getList(path, ConfigValueParser.byteValue()); + return getList(path, ConfigDataFunction.byteValue()); } @Unmodifiable default @NotNull List getCharList(@NotNull String path) { - return getList(path, ConfigValueParser.castObject(Character.class)); + return getList(path, ConfigDataFunction.castObject(Character.class)); } @Unmodifiable - static @NotNull List parseList(@Nullable List list, ConfigValueParser parser) { + static @NotNull List parseList(@Nullable List list, ConfigDataFunction parser) { if (list == null) return Collections.emptyList(); List values = new ArrayList<>(); for (Object o : list) { try { - T parsed = parser.parse(o, null); - if (parsed != null) values.add(parsed); + values.add(parser.parse(o)); } catch (Exception ignored) { } } return values; } - } diff --git a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSource.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSource.java new file mode 100644 index 0000000..72723ed --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationSource.java @@ -0,0 +1,41 @@ +package cc.carm.lib.configuration.source; + +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +public abstract class ConfigurationSource, O> implements ConfigurationSection { + + protected long updateMillis; + + protected ConfigurationSource(long updateMillis) { + this.updateMillis = updateMillis; + } + + public void reload() throws Exception { + onReload(); // 调用重写的Reload方法 + this.updateMillis = System.currentTimeMillis(); + } + + protected abstract S getThis(); + + public abstract void save() throws Exception; + + protected abstract void onReload() throws Exception; + + public abstract @NotNull O original(); + + @NotNull + public Set getKeys(boolean deep) { + return getValues(deep).keySet(); + } + + public long getUpdateMillis() { + return this.updateMillis; + } + + public boolean isExpired(long time) { + return getUpdateMillis() > time; + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/source/path/PathGenerator.java b/core/src/main/java/cc/carm/lib/configuration/source/path/PathGenerator.java deleted file mode 100644 index 19d0a6d..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/source/path/PathGenerator.java +++ /dev/null @@ -1,33 +0,0 @@ -package cc.carm.lib.configuration.source.path; - -import cc.carm.lib.configuration.source.ConfigurationProvider; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; - -public interface PathGenerator

> { - - @Nullable String getFieldPath(@Nullable String parentPath, @NotNull Field field); - - @Nullable String getClassPath(@Nullable String parentPath, - @NotNull Class clazz, @Nullable Field clazzField); - - /** - * Get the configuration name of the specified element. - * Use the naming convention of all lowercase and "-" links. - * - * @param name source name - * @return the final path - */ - static String covertPathName(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/source/path/StandardPathGenerator.java b/core/src/main/java/cc/carm/lib/configuration/source/path/StandardPathGenerator.java deleted file mode 100644 index 824db53..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/source/path/StandardPathGenerator.java +++ /dev/null @@ -1,74 +0,0 @@ -package cc.carm.lib.configuration.source.path; - -import cc.carm.lib.configuration.annotation.ConfigPath; -import cc.carm.lib.configuration.source.ConfigurationProvider; -import cc.carm.lib.configuration.source.standard.ConfigurationOptions; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Field; -import java.util.function.UnaryOperator; - -public class StandardPathGenerator

> implements PathGenerator

{ - - public static > StandardPathGenerator of(T provider) { - return of(provider, PathGenerator::covertPathName); - } - - public static > StandardPathGenerator of(T provider, UnaryOperator pathConverter) { - return new StandardPathGenerator<>(provider, pathConverter); - } - - protected final P provider; - protected UnaryOperator pathConverter; - - public StandardPathGenerator(P provider, UnaryOperator pathConverter) { - this.provider = provider; - this.pathConverter = pathConverter; - } - - public @NotNull UnaryOperator getPathConverter() { - return pathConverter; - } - - public void setPathConverter(UnaryOperator pathConverter) { - this.pathConverter = pathConverter; - } - - public String covertPath(String name) { - return pathConverter.apply(name); - } - - public char pathSeparator() { - return provider.option(ConfigurationOptions.PATH_SEPARATOR); - } - - protected String link(@Nullable String parent, boolean root, @Nullable String path) { - if (path == null || path.isEmpty()) return root ? null : parent; - return root && parent != null ? covertPath(path) : parent + pathSeparator() + covertPath(path); - } - - @Override - public @Nullable String getFieldPath(@Nullable String parentPath, @NotNull Field field) { - ConfigPath path = field.getAnnotation(ConfigPath.class); - if (path == null) return link(parentPath, false, field.getName()); // No annotation, use field name. - else return link(parentPath, path.root(), path.value().isEmpty() ? field.getName() : path.value()); - } - - @Override - public @Nullable String getClassPath(@Nullable String parentPath, @NotNull Class clazz, @Nullable Field clazzField) { - // For standard path generator, we generate path following by: - // 1. Check if the class has a ConfigPath annotation, if so, use the root and value as the path. - // 2. If the class defined as a field, check if the field has a ConfigPath annotation, - // and use filed information. - ConfigPath clazzPath = clazz.getAnnotation(ConfigPath.class); - - if (clazzPath != null) return link(parentPath, clazzPath.root(), clazzPath.value()); - if (clazzField == null) return parentPath; // No field, return same as parent. - - ConfigPath fieldPath = clazzField.getAnnotation(ConfigPath.class); - if (fieldPath == null) return link(parentPath, false, clazzField.getName()); - else return getFieldPath(parentPath, clazzField); - } - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationMetaTypes.java b/core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationMetaTypes.java deleted file mode 100644 index 90e4499..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/source/standard/ConfigurationMetaTypes.java +++ /dev/null @@ -1,12 +0,0 @@ -package cc.carm.lib.configuration.source.standard; - -import cc.carm.lib.configuration.annotation.ConfigPath; -import cc.carm.lib.easyannotation.AnnotatedMetaType; - -public interface ConfigurationMetaTypes { - - AnnotatedMetaType PATH = AnnotatedMetaType.of(ConfigPath.class, ConfigPath::value); - - AnnotatedMetaType ROOT = AnnotatedMetaType.of(ConfigPath.class, ConfigPath::root); - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java index 8b6ecd7..e2901d9 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java @@ -1,43 +1,20 @@ package cc.carm.lib.configuration.value; -import cc.carm.lib.configuration.core.builder.ConfigBuilder; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; +import cc.carm.lib.configuration.source.ConfigurationProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Objects; import java.util.Optional; public abstract class ConfigValue extends ValueManifest { - public static @NotNull ConfigBuilder builder() { - return new ConfigBuilder(); - } +// public static @NotNull ConfigBuilder builder() { +// return new ConfigBuilder(); +// } protected ConfigValue(@NotNull ValueManifest manifest) { - super(manifest.provider, manifest.configPath, manifest.headerComments, manifest.inlineComment, manifest.defaultValue); - } - - /** - * @param provider Provider of config files {@link ConfigurationProvider} - * @param configPath Config path of this value - * @param headerComments Header comment contents - * @param inlineComments Inline comment contents - * @param defaultValue The default value - * @deprecated Please use {@link #ConfigValue(ValueManifest)} instead. - */ - @Deprecated - protected ConfigValue(@Nullable ConfigurationProvider provider, @Nullable String configPath, - @Nullable List headerComments, @Nullable String inlineComments, - @Nullable T defaultValue) { - super(provider, configPath, headerComments, inlineComments, defaultValue); - } - - public void initialize(@NotNull ConfigurationProvider provider, boolean saveDefault, @NotNull String configPath, - @Nullable List headerComments, @Nullable String inlineComments) { - this.initialize(provider, configPath, headerComments, inlineComments); - if (saveDefault) setDefault(); + super(manifest.metadata, manifest.provider, manifest.defaultSupplier); } /** @@ -53,8 +30,8 @@ public abstract class ConfigValue extends ValueManifest { * * @return 设定值或默认值 */ - public @Nullable T getOrDefault() { - return getOptional().orElse(getDefaultValue()); + public T getOrDefault() { + return optional().orElse(defaults()); } /** @@ -64,10 +41,10 @@ public abstract class ConfigValue extends ValueManifest { * @throws NullPointerException 对应数据为空时抛出 */ public @NotNull T getNotNull() { - return Objects.requireNonNull(getOrDefault(), "Value(" + configPath + ") is null."); + return Objects.requireNonNull(getOrDefault(), "Value(" + path() + ") is null."); } - public @NotNull Optional<@Nullable T> getOptional() { + public @NotNull Optional<@Nullable T> optional() { return Optional.ofNullable(get()); } @@ -94,8 +71,8 @@ public abstract class ConfigValue extends ValueManifest { * @param override 是否覆盖已设定的值 */ public void setDefault(boolean override) { - if (!override && getConfiguration().contains(getConfigPath())) return; - Optional.ofNullable(getDefaultValue()).ifPresent(this::set); + if (!override && config().contains(path())) return; + Optional.ofNullable(defaults()).ifPresent(this::set); } /** @@ -104,7 +81,7 @@ public abstract class ConfigValue extends ValueManifest { * @return 获取当前值是否为默认值。 */ public boolean isDefault() { - return Objects.equals(getDefaultValue(), get()); + return Objects.equals(defaults(), get()); } } diff --git a/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java b/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java index e9caa02..fb4b36d 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java @@ -1,124 +1,150 @@ package cc.carm.lib.configuration.value; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.source.ConfigurationProvider; +import cc.carm.lib.configuration.source.ConfigurationSource; +import cc.carm.lib.configuration.value.meta.ValueMetaList; +import cc.carm.lib.configuration.value.meta.ValueMetaType; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; -import java.util.List; -import java.util.Optional; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.function.Supplier; -/** - * ConfigValue Manifests. - * The basic information that describes a configuration value. - * - * @param Value type - * @author CarmJos - */ public class ValueManifest { - public static ValueManifest of(@Nullable ConfigurationProvider provider, @Nullable String configPath, - @Nullable List headerComments, @Nullable String inlineComments) { - return new ValueManifest<>(provider, configPath, headerComments, inlineComments, null); - } - - public static ValueManifest of(@Nullable ConfigurationProvider provider, @Nullable String configPath, - @Nullable List headerComments, @Nullable String inlineComments, - @Nullable V defaultValue) { - return new ValueManifest<>(provider, configPath, headerComments, inlineComments, defaultValue); - } - + protected final @NotNull Map, Object> metadata; protected @Nullable ConfigurationProvider provider; - protected @Nullable String configPath; + protected @NotNull Supplier<@Nullable T> defaultSupplier; - protected @Nullable List headerComments; - protected @Nullable String inlineComment; - - protected @Nullable T defaultValue; - - /** - * @param provider Provider of config files {@link ConfigurationProvider} - * @param configPath Config path of this value - * @param headerComments Header comment contents - * @param inlineComment Inline comment content - * @param defaultValue The default value - */ - public ValueManifest(@Nullable ConfigurationProvider provider, @Nullable String configPath, - @Nullable List headerComments, @Nullable String inlineComment, - @Nullable T defaultValue) { + public ValueManifest(@NotNull Map, Object> metadata, + @Nullable ConfigurationProvider provider, @NotNull Supplier<@Nullable T> defaultSupplier) { + this.metadata = metadata; this.provider = provider; - this.configPath = configPath; - this.headerComments = headerComments; - this.inlineComment = inlineComment; - this.defaultValue = defaultValue; + this.defaultSupplier = defaultSupplier; } - /** - * The initialize method for {@link ConfigInitializer}, which is used to initialize the value. - * - * @param provider Provider of config files {@link ConfigurationProvider} - * @param configPath Config path of this value - * @param headerComments Header comment contents - * @param inlineComment Inline comment content - */ - protected void initialize(@NotNull ConfigurationProvider provider, @NotNull String configPath, - @Nullable List headerComments, @Nullable String inlineComment) { - if (this.provider == null) this.provider = provider; - if (this.configPath == null) this.configPath = configPath; - if (this.headerComments == null) this.headerComments = headerComments; - if (this.inlineComment == null) this.inlineComment = inlineComment; - - if (getHeaderComments() != null) { - this.provider.setHeaderComment(getConfigPath(), getHeaderComments()); - } - if (getInlineComment() != null) { - this.provider.setInlineComment(getConfigPath(), getInlineComment()); - } + public @Nullable T defaults() { + return this.defaultSupplier.get(); } - public @Nullable T getDefaultValue() { - return this.defaultValue; + public void defaults(@Nullable T defaultValue) { + defaults(() -> defaultValue); } - public void setDefaultValue(@Nullable T defaultValue) { - this.defaultValue = defaultValue; + public void defaults(@NotNull Supplier<@Nullable T> defaultValue) { + this.defaultSupplier = defaultValue; } - public @NotNull ConfigurationProvider getProvider() { - return Optional.ofNullable(this.provider) - .orElseThrow(() -> new IllegalStateException("Value(" + configPath + ") does not have a provider.")); + public @NotNull ConfigurationProvider provider() { + if (this.provider != null) return this.provider; + throw new IllegalStateException("Value does not have a provider."); } - public final @NotNull ConfigurationWrapper getConfiguration() { - try { - return getProvider().getConfiguration(); - } catch (Exception ex) { - throw new IllegalStateException("Value(" + configPath + ") has not been initialized", ex); - } + public @NotNull ConfigurationSource config() { + return provider().source(); } - public @NotNull String getConfigPath() { - return Optional.ofNullable(this.configPath) - .orElseThrow(() -> new IllegalStateException("No section path provided.")); + public @NotNull String path() { + String path = getMeta(ValueMetaList.PATH); + if (path != null) return path; + else throw new IllegalStateException("No section path provided."); } protected Object getValue() { - String path = getConfigPath(); // 当未指定路径时,优先抛出异常 - return getConfiguration().get(path); + return config().get(path()); } protected void setValue(@Nullable Object value) { - getConfiguration().set(getConfigPath(), value); + config().set(path(), value); } - public @Nullable String getInlineComment() { - return inlineComment; + public Map, Object> metadata() { + return metadata; } - @Unmodifiable - public @Nullable List getHeaderComments() { - return headerComments; + /** + * Get the value of option. + * + * @param type {@link ValueMetaType} + * @param defaultValue Default value if the value of option is not set. + * @param Value type + * @return Value of option + */ + @SuppressWarnings("unchecked") + @Contract("_, !null -> !null") + public @Nullable V getMeta(@NotNull ValueMetaType type, @Nullable V defaultValue) { + return (V) metadata().getOrDefault(type, type.getDefault(this, defaultValue)); + } + + /** + * Get the value of option. + * + * @param type {@link ValueMetaType} + * @param Value type + * @return Value of option + */ + public @Nullable V getMeta(@NotNull ValueMetaType type) { + return getMeta(type, null); + } + + public boolean hasMeta(@NotNull ValueMetaType type) { + return metadata().containsKey(type) || type.hasDefaults(this); + } + + /** + * Set the value of meta, if the value is null, the meta will be removed. + *
Will only be changed in current holder. + * + * @param type {@link ValueMetaType} + * @param value Value of meta + * @param Value type + * @return Previous value of meta + */ + @SuppressWarnings("unchecked") + public @Nullable V setMeta(@NotNull ValueMetaType type, @Nullable V value) { + if (value == null || type.isDefault(this, value)) { + return (V) metadata().remove(type); + } else { + return (V) metadata().put(type, value); + } + } + + /** + * Set the value of meta, if the value is null, the meta will not be changed. + *
Will only be changed in current holder. + * + * @param type {@link ValueMetaType} + * @param value Value of meta + * @param Value type + */ + public void setMetaIfAbsent(@NotNull ValueMetaType type, @Nullable V value) { + if (value == null || type.isDefault(this, value)) { + metadata().remove(type); + } else { + metadata().putIfAbsent(type, value); + } + } + + /** + * Set the value of meta, if the value is null, the meta will not be changed. + *
Will only be changed in current holder. + * + * @param type {@link ValueMetaType} + * @param value Value of meta + * @param Value type + */ + @SuppressWarnings("unchecked") + public @Nullable V setMetaIfPresent(@NotNull ValueMetaType type, @Nullable V value) { + Object exists = metadata().get(type); + if (exists == null) return null; + + if (value == null || type.isDefault(this, value)) { + return (V) metadata().remove(type); + } else { + return (V) metadata().put(type, value); + } } diff --git a/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java index 92cd162..6cd50ea 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java @@ -7,8 +7,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class CachedConfigValue extends ConfigValue { - - + protected @Nullable T cachedValue; protected long parsedTime = -1; @@ -27,11 +26,11 @@ public abstract class CachedConfigValue extends ConfigValue { } public boolean isExpired() { - return this.parsedTime <= 0 || getProvider().isExpired(this.parsedTime); + return this.parsedTime <= 0 || config().isExpired(this.parsedTime); } protected final T getDefaultFirst(@Nullable T value) { - return updateCache(this.defaultValue == null ? value : this.defaultValue); + return updateCache(this.defaultSupplier == null ? value : this.defaultSupplier); } protected @Nullable T getCachedOrDefault() { @@ -41,7 +40,7 @@ public abstract class CachedConfigValue extends ConfigValue { @Contract("!null->!null") protected T getCachedOrDefault(@Nullable T emptyValue) { if (getCachedValue() != null) return getCachedValue(); - else if (getDefaultValue() != null) return getDefaultValue(); + else if (defaults() != null) return defaults(); else return emptyValue; } diff --git a/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java b/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java index f45b057..e4f8c8b 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java @@ -1,214 +1,213 @@ -package cc.carm.lib.configuration.value.impl; - -import cc.carm.lib.configuration.core.builder.map.ConfigMapCreator; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import cc.carm.lib.configuration.value.ValueManifest; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.Unmodifiable; - -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -public abstract class ConfigValueMap extends CachedConfigValue> implements Map { - - public static @NotNull ConfigMapCreator builderOf(@NotNull Class keyClass, - @NotNull Class valueClass) { - return builder().asMap(keyClass, valueClass); - } - - protected final @NotNull Supplier> supplier; - - protected final @NotNull Class sourceClass; - protected final @NotNull Class keyClass; - protected final @NotNull Class valueClass; - - protected final @NotNull ConfigDataFunction keyParser; - protected final @NotNull ConfigDataFunction valueParser; - - protected final @NotNull ConfigDataFunction keySerializer; - protected final @NotNull ConfigDataFunction valueSerializer; - - - protected ConfigValueMap(@NotNull ValueManifest> manifest, @NotNull Class sourceClass, - @NotNull Supplier> mapObjSupplier, - @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, - @NotNull Class valueClass, @NotNull ConfigDataFunction valueParser, - @NotNull ConfigDataFunction keySerializer, - @NotNull ConfigDataFunction valueSerializer) { - super(manifest); - this.supplier = mapObjSupplier; - this.sourceClass = sourceClass; - this.keyClass = keyClass; - this.valueClass = valueClass; - this.keyParser = keyParser; - this.valueParser = valueParser; - this.keySerializer = keySerializer; - this.valueSerializer = valueSerializer; - } - - public @NotNull Class getSourceClass() { - return sourceClass; - } - - public @NotNull Class getKeyClass() { - return keyClass; - } - - public @NotNull Class getValueClass() { - return valueClass; - } - - public @NotNull ConfigDataFunction getKeyParser() { - return keyParser; - } - - public @NotNull ConfigDataFunction getValueParser() { - return valueParser; - } - - public @NotNull ConfigDataFunction getKeySerializer() { - return keySerializer; - } - - public @NotNull ConfigDataFunction getValueSerializer() { - return valueSerializer; - } - - public abstract S getSource(ConfigurationWrapper section, String dataKey); - - @Override - public @NotNull Map get() { - if (!isExpired()) return getCachedOrDefault(supplier.get()); - - // 已过时的数据,需要重新解析一次。 - Map map = supplier.get(); - - ConfigurationWrapper section = getConfiguration().getConfigurationSection(getConfigPath()); - if (section == null) return getDefaultFirst(map); - - Set keys = section.getKeys(false); - if (keys.isEmpty()) return getDefaultFirst(map); - - for (String dataKey : keys) { - S dataVal = getSource(section, dataKey); - if (dataVal == null) continue; - try { - K key = keyParser.parse(dataKey); - V value = valueParser.parse(dataVal); - map.put(key, value); - } catch (Exception e) { - e.printStackTrace(); - } - } - - return updateCache(map); - } - - @Override - public V get(Object key) { - return get().get(key); - } - - public V getNotNull(Object key) { - return Objects.requireNonNull(get(key)); - } - - @Override - public void set(@Nullable Map value) { - updateCache(value); - if (value == null) setValue(null); - else { - Map data = new LinkedHashMap<>(); - for (Map.Entry entry : value.entrySet()) { - try { - data.put( - keySerializer.parse(entry.getKey()), - valueSerializer.parse(entry.getValue()) - ); - } catch (Exception e) { - e.printStackTrace(); - } - } - setValue(data); - } - } - - public @NotNull T modifyValue(Function, T> function) { - Map m = get(); - T result = function.apply(m); - set(m); - return result; - } - - public @NotNull Map modifyMap(Consumer> consumer) { - Map m = get(); - consumer.accept(m); - set(m); - return m; - } - - @Override - public int size() { - return get().size(); - } - - @Override - public boolean isEmpty() { - return get().isEmpty(); - } - - @Override - public boolean containsKey(Object key) { - return get().containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return get().containsValue(value); - } - - @Nullable - @Override - public V put(K key, V value) { - return modifyValue(m -> m.put(key, value)); - } - - @Override - public V remove(Object key) { - return modifyValue(m -> m.remove(key)); - } - - @Override - public void putAll(@NotNull Map m) { - modifyMap(map -> map.putAll(m)); - } - - @Override - public void clear() { - modifyMap(Map::clear); - } - - @NotNull - @Override - public Set keySet() { - return get().keySet(); - } - - @NotNull - @Override - public Collection values() { - return get().values(); - } - - @NotNull - @Override - @Unmodifiable - public Set> entrySet() { - return get().entrySet(); - } - -} +//package cc.carm.lib.configuration.value.impl; +// +//import cc.carm.lib.configuration.builder.map.ConfigMapCreator; +//import cc.carm.lib.configuration.function.ConfigDataFunction; +//import cc.carm.lib.configuration.value.ValueManifest; +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +//import org.jetbrains.annotations.Unmodifiable; +// +//import java.util.*; +//import java.util.function.Consumer; +//import java.util.function.Function; +//import java.util.function.Supplier; +// +//public abstract class ConfigValueMap extends CachedConfigValue> implements Map { +// +// public static @NotNull ConfigMapCreator builderOf(@NotNull Class keyClass, +// @NotNull Class valueClass) { +// return builder().asMap(keyClass, valueClass); +// } +// +// protected final @NotNull Supplier> supplier; +// +// protected final @NotNull Class sourceClass; +// protected final @NotNull Class keyClass; +// protected final @NotNull Class valueClass; +// +// protected final @NotNull ConfigDataFunction keyParser; +// protected final @NotNull ConfigDataFunction valueParser; +// +// protected final @NotNull ConfigDataFunction keySerializer; +// protected final @NotNull ConfigDataFunction valueSerializer; +// +// +// protected ConfigValueMap(@NotNull ValueManifest> manifest, @NotNull Class sourceClass, +// @NotNull Supplier> mapObjSupplier, +// @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, +// @NotNull Class valueClass, @NotNull ConfigDataFunction valueParser, +// @NotNull ConfigDataFunction keySerializer, +// @NotNull ConfigDataFunction valueSerializer) { +// super(manifest); +// this.supplier = mapObjSupplier; +// this.sourceClass = sourceClass; +// this.keyClass = keyClass; +// this.valueClass = valueClass; +// this.keyParser = keyParser; +// this.valueParser = valueParser; +// this.keySerializer = keySerializer; +// this.valueSerializer = valueSerializer; +// } +// +// public @NotNull Class getSourceClass() { +// return sourceClass; +// } +// +// public @NotNull Class getKeyClass() { +// return keyClass; +// } +// +// public @NotNull Class getValueClass() { +// return valueClass; +// } +// +// public @NotNull ConfigDataFunction getKeyParser() { +// return keyParser; +// } +// +// public @NotNull ConfigDataFunction getValueParser() { +// return valueParser; +// } +// +// public @NotNull ConfigDataFunction getKeySerializer() { +// return keySerializer; +// } +// +// public @NotNull ConfigDataFunction getValueSerializer() { +// return valueSerializer; +// } +// +// public abstract S getSource(ConfigurationWrapper section, String dataKey); +// +// @Override +// public @NotNull Map get() { +// if (!isExpired()) return getCachedOrDefault(supplier.get()); +// +// // 已过时的数据,需要重新解析一次。 +// Map map = supplier.get(); +// +// ConfigurationWrapper section = getConfiguration().getConfigurationSection(getConfigPath()); +// if (section == null) return getDefaultFirst(map); +// +// Set keys = section.getKeys(false); +// if (keys.isEmpty()) return getDefaultFirst(map); +// +// for (String dataKey : keys) { +// S dataVal = getSource(section, dataKey); +// if (dataVal == null) continue; +// try { +// K key = keyParser.parse(dataKey); +// V value = valueParser.parse(dataVal); +// map.put(key, value); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +// return updateCache(map); +// } +// +// @Override +// public V get(Object key) { +// return get().get(key); +// } +// +// public V getNotNull(Object key) { +// return Objects.requireNonNull(get(key)); +// } +// +// @Override +// public void set(@Nullable Map value) { +// updateCache(value); +// if (value == null) setValue(null); +// else { +// Map data = new LinkedHashMap<>(); +// for (Map.Entry entry : value.entrySet()) { +// try { +// data.put( +// keySerializer.parse(entry.getKey()), +// valueSerializer.parse(entry.getValue()) +// ); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// setValue(data); +// } +// } +// +// public @NotNull T modifyValue(Function, T> function) { +// Map m = get(); +// T result = function.apply(m); +// set(m); +// return result; +// } +// +// public @NotNull Map modifyMap(Consumer> consumer) { +// Map m = get(); +// consumer.accept(m); +// set(m); +// return m; +// } +// +// @Override +// public int size() { +// return get().size(); +// } +// +// @Override +// public boolean isEmpty() { +// return get().isEmpty(); +// } +// +// @Override +// public boolean containsKey(Object key) { +// return get().containsKey(key); +// } +// +// @Override +// public boolean containsValue(Object value) { +// return get().containsValue(value); +// } +// +// @Nullable +// @Override +// public V put(K key, V value) { +// return modifyValue(m -> m.put(key, value)); +// } +// +// @Override +// public V remove(Object key) { +// return modifyValue(m -> m.remove(key)); +// } +// +// @Override +// public void putAll(@NotNull Map m) { +// modifyMap(map -> map.putAll(m)); +// } +// +// @Override +// public void clear() { +// modifyMap(Map::clear); +// } +// +// @NotNull +// @Override +// public Set keySet() { +// return get().keySet(); +// } +// +// @NotNull +// @Override +// public Collection values() { +// return get().values(); +// } +// +// @NotNull +// @Override +// @Unmodifiable +// public Set> entrySet() { +// return get().entrySet(); +// } +// +//} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaList.java b/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaList.java new file mode 100644 index 0000000..abd0614 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaList.java @@ -0,0 +1,11 @@ +package cc.carm.lib.configuration.value.meta; + +public interface ValueMetaList { + + /** + * The value path in configuration. + * Also see {@link cc.carm.lib.configuration.option.ConfigurationOptions#PATH_SEPARATOR} + */ + ValueMetaType PATH = ValueMetaType.of(); + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaType.java b/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaType.java new file mode 100644 index 0000000..6c5d825 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/value/meta/ValueMetaType.java @@ -0,0 +1,59 @@ +package cc.carm.lib.configuration.value.meta; + +import cc.carm.lib.configuration.value.ValueManifest; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; +import java.util.function.Supplier; + +public class ValueMetaType { + + public static ValueMetaType of() { + return of(() -> null); + } + + public static ValueMetaType of(T defaults) { + return of(() -> defaults); + } + + public static ValueMetaType of(@NotNull Supplier<@Nullable T> defaults) { + return of(v -> defaults.get()); + } + + public static ValueMetaType of(@NotNull Function, @Nullable T> defaults) { + return new ValueMetaType<>(defaults); + } + + protected Function, @Nullable T> defaultFunction; + + public ValueMetaType(@NotNull Function, @Nullable T> defaults) { + this.defaultFunction = defaults; + } + + public boolean isDefault(ValueManifest manifest, @NotNull T value) { + return value.equals(defaults(manifest)); + } + + public boolean hasDefaults(ValueManifest manifest) { + return defaults(manifest) != null; + } + + public T getDefault(ValueManifest manifest, @Nullable T suppliedValue) { + T defaults = defaults(manifest); + return defaults == null ? suppliedValue : defaults; + } + + public @Nullable T defaults(ValueManifest manifest) { + return defaultFunction.apply(manifest); + } + + public void setDefaults(Function, T> defaultFunction) { + this.defaultFunction = defaultFunction; + } + + public void setDefaults(T value) { + setDefaults((v) -> value); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java index 555d4b2..b7c9713 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java @@ -1,229 +1,229 @@ -package cc.carm.lib.configuration.value.standard; - -import cc.carm.lib.configuration.core.builder.list.ConfigListBuilder; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.value.ValueManifest; -import cc.carm.lib.configuration.value.impl.CachedConfigValue; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; - -public class ConfiguredList extends CachedConfigValue> implements List { - - public static @NotNull ConfigListBuilder builderOf(@NotNull Class valueClass) { - return builder().asList(valueClass); - } - - public static @NotNull ConfiguredList of(@NotNull Class valueClass, @NotNull Collection defaults) { - return builderOf(valueClass).fromObject().defaults(defaults).build(); - } - - @SafeVarargs - public static @NotNull ConfiguredList of(@NotNull Class valueClass, @NotNull V... defaults) { - return builderOf(valueClass).fromObject().defaults(defaults).build(); - } - - @SafeVarargs - @SuppressWarnings("unchecked") - public static @NotNull ConfiguredList of(@NotNull V defaultValue, @NotNull V... moreDefaults) { - Collection values = new ArrayList<>(); - values.add(defaultValue); - values.addAll(Arrays.asList(moreDefaults)); - return of((Class) defaultValue.getClass(), values); - } - - protected final @NotNull Class valueClass; - - protected final @NotNull ConfigDataFunction parser; - protected final @NotNull ConfigDataFunction serializer; - - public ConfiguredList(@NotNull ValueManifest> manifest, @NotNull Class valueClass, - @NotNull ConfigDataFunction parser, - @NotNull ConfigDataFunction serializer) { - super(manifest); - this.valueClass = valueClass; - this.parser = parser; - this.serializer = serializer; - } - - @Override - public @NotNull List get() { - if (!isExpired()) return getCachedOrDefault(new ArrayList<>()); - // Data that is outdated and needs to be parsed again. - List list = new ArrayList<>(); - List data = getConfiguration().contains(getConfigPath()) ? - getConfiguration().getList(getConfigPath()) : null; - if (data == null) return getDefaultFirst(list); - for (Object dataVal : data) { - if (dataVal == null) continue; - try { - list.add(parser.parse(dataVal)); - } catch (Exception e) { - e.printStackTrace(); - } - } - return updateCache(list); - } - - @Override - public V get(int index) { - return get().get(index); - } - - public @NotNull List copy() { - return new ArrayList<>(get()); - } - - public @NotNull T handle(Function, T> function) { - List list = get(); - T result = function.apply(list); - set(list); - return result; - } - - public @NotNull List modify(Consumer> consumer) { - List list = get(); - consumer.accept(list); - set(list); - return list; - } - - @Override - public void set(@Nullable List value) { - updateCache(value); - if (value == null) setValue(null); - else { - List data = new ArrayList<>(); - for (V val : value) { - if (val == null) continue; - try { - data.add(serializer.parse(val)); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - setValue(data); - } - } - - @Override - public V set(int index, V element) { - return handle(list -> list.set(index, element)); - } - - @Override - public int size() { - return get().size(); - } - - @Override - public boolean isEmpty() { - return get().isEmpty(); - } - - @Override - public boolean contains(Object o) { - return get().contains(o); - } - - @NotNull - @Override - public Iterator iterator() { - return get().iterator(); - } - - @NotNull - @Override - public Object @NotNull [] toArray() { - return get().toArray(); - } - - @NotNull - @Override - public T @NotNull [] toArray(@NotNull T[] a) { - return get().toArray(a); - } - - @Override - public boolean containsAll(@NotNull Collection c) { - return new HashSet<>(get()).containsAll(c); - } - - @Override - public boolean add(V v) { - handle(list -> list.add(v)); - return true; - } - - @Override - public void add(int index, V element) { - modify(list -> list.add(index, element)); - } - - @Override - public boolean addAll(@NotNull Collection c) { - return handle(list -> list.addAll(c)); - } - - @Override - public boolean addAll(int index, @NotNull Collection c) { - return handle(list -> list.addAll(index, c)); - } - - @Override - public boolean remove(Object o) { - return handle(list -> list.remove(o)); - } - - @Override - public V remove(int index) { - return handle(list -> list.remove(index)); - } - - @Override - public boolean removeAll(@NotNull Collection c) { - return handle(list -> list.removeAll(c)); - } - - @Override - public boolean retainAll(@NotNull Collection c) { - return handle(list -> list.retainAll(c)); - } - - @Override - public void clear() { - modify(List::clear); - } - - @Override - public int indexOf(Object o) { - return get().indexOf(o); - } - - @Override - public int lastIndexOf(Object o) { - return get().lastIndexOf(o); - } - - @NotNull - @Override - public ListIterator listIterator() { - return get().listIterator(); - } - - @NotNull - @Override - public ListIterator listIterator(int index) { - return get().listIterator(index); - } - - @NotNull - @Override - public List subList(int fromIndex, int toIndex) { - return get().subList(fromIndex, toIndex); - } - -} +//package cc.carm.lib.configuration.value.standard; +// +//import cc.carm.lib.configuration.builder.list.ConfigListBuilder; +//import cc.carm.lib.configuration.function.ConfigDataFunction; +//import cc.carm.lib.configuration.value.ValueManifest; +//import cc.carm.lib.configuration.value.impl.CachedConfigValue; +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +// +//import java.util.*; +//import java.util.function.Consumer; +//import java.util.function.Function; +// +//public class ConfiguredList extends CachedConfigValue> implements List { +// +// public static @NotNull ConfigListBuilder builderOf(@NotNull Class valueClass) { +// return builder().asList(valueClass); +// } +// +// public static @NotNull ConfiguredList of(@NotNull Class valueClass, @NotNull Collection defaults) { +// return builderOf(valueClass).fromObject().defaults(defaults).build(); +// } +// +// @SafeVarargs +// public static @NotNull ConfiguredList of(@NotNull Class valueClass, @NotNull V... defaults) { +// return builderOf(valueClass).fromObject().defaults(defaults).build(); +// } +// +// @SafeVarargs +// @SuppressWarnings("unchecked") +// public static @NotNull ConfiguredList of(@NotNull V defaultValue, @NotNull V... moreDefaults) { +// Collection values = new ArrayList<>(); +// values.add(defaultValue); +// values.addAll(Arrays.asList(moreDefaults)); +// return of((Class) defaultValue.getClass(), values); +// } +// +// protected final @NotNull Class valueClass; +// +// protected final @NotNull ConfigDataFunction parser; +// protected final @NotNull ConfigDataFunction serializer; +// +// public ConfiguredList(@NotNull ValueManifest> manifest, @NotNull Class valueClass, +// @NotNull ConfigDataFunction parser, +// @NotNull ConfigDataFunction serializer) { +// super(manifest); +// this.valueClass = valueClass; +// this.parser = parser; +// this.serializer = serializer; +// } +// +// @Override +// public @NotNull List get() { +// if (!isExpired()) return getCachedOrDefault(new ArrayList<>()); +// // Data that is outdated and needs to be parsed again. +// List list = new ArrayList<>(); +// List data = getConfiguration().contains(getConfigPath()) ? +// getConfiguration().getList(getConfigPath()) : null; +// if (data == null) return getDefaultFirst(list); +// for (Object dataVal : data) { +// if (dataVal == null) continue; +// try { +// list.add(parser.parse(dataVal)); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// return updateCache(list); +// } +// +// @Override +// public V get(int index) { +// return get().get(index); +// } +// +// public @NotNull List copy() { +// return new ArrayList<>(get()); +// } +// +// public @NotNull T handle(Function, T> function) { +// List list = get(); +// T result = function.apply(list); +// set(list); +// return result; +// } +// +// public @NotNull List modify(Consumer> consumer) { +// List list = get(); +// consumer.accept(list); +// set(list); +// return list; +// } +// +// @Override +// public void set(@Nullable List value) { +// updateCache(value); +// if (value == null) setValue(null); +// else { +// List data = new ArrayList<>(); +// for (V val : value) { +// if (val == null) continue; +// try { +// data.add(serializer.parse(val)); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// } +// setValue(data); +// } +// } +// +// @Override +// public V set(int index, V element) { +// return handle(list -> list.set(index, element)); +// } +// +// @Override +// public int size() { +// return get().size(); +// } +// +// @Override +// public boolean isEmpty() { +// return get().isEmpty(); +// } +// +// @Override +// public boolean contains(Object o) { +// return get().contains(o); +// } +// +// @NotNull +// @Override +// public Iterator iterator() { +// return get().iterator(); +// } +// +// @NotNull +// @Override +// public Object @NotNull [] toArray() { +// return get().toArray(); +// } +// +// @NotNull +// @Override +// public T @NotNull [] toArray(@NotNull T[] a) { +// return get().toArray(a); +// } +// +// @Override +// public boolean containsAll(@NotNull Collection c) { +// return new HashSet<>(get()).containsAll(c); +// } +// +// @Override +// public boolean add(V v) { +// handle(list -> list.add(v)); +// return true; +// } +// +// @Override +// public void add(int index, V element) { +// modify(list -> list.add(index, element)); +// } +// +// @Override +// public boolean addAll(@NotNull Collection c) { +// return handle(list -> list.addAll(c)); +// } +// +// @Override +// public boolean addAll(int index, @NotNull Collection c) { +// return handle(list -> list.addAll(index, c)); +// } +// +// @Override +// public boolean remove(Object o) { +// return handle(list -> list.remove(o)); +// } +// +// @Override +// public V remove(int index) { +// return handle(list -> list.remove(index)); +// } +// +// @Override +// public boolean removeAll(@NotNull Collection c) { +// return handle(list -> list.removeAll(c)); +// } +// +// @Override +// public boolean retainAll(@NotNull Collection c) { +// return handle(list -> list.retainAll(c)); +// } +// +// @Override +// public void clear() { +// modify(List::clear); +// } +// +// @Override +// public int indexOf(Object o) { +// return get().indexOf(o); +// } +// +// @Override +// public int lastIndexOf(Object o) { +// return get().lastIndexOf(o); +// } +// +// @NotNull +// @Override +// public ListIterator listIterator() { +// return get().listIterator(); +// } +// +// @NotNull +// @Override +// public ListIterator listIterator(int index) { +// return get().listIterator(index); +// } +// +// @NotNull +// @Override +// public List subList(int fromIndex, int toIndex) { +// return get().subList(fromIndex, toIndex); +// } +// +//} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java index 5e4c086..1513734 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java @@ -1,28 +1,27 @@ -package cc.carm.lib.configuration.value.standard; - -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import cc.carm.lib.configuration.value.ValueManifest; -import cc.carm.lib.configuration.value.impl.ConfigValueMap; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.function.Supplier; - -public class ConfiguredMap extends ConfigValueMap { - - public ConfiguredMap(@NotNull ValueManifest> manifest, - @NotNull Supplier> mapObjSupplier, - @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, - @NotNull Class valueClass, @NotNull ConfigDataFunction valueParser, - @NotNull ConfigDataFunction keySerializer, - @NotNull ConfigDataFunction valueSerializer) { - super(manifest, Object.class, mapObjSupplier, keyClass, keyParser, valueClass, valueParser, keySerializer, valueSerializer); - } - - @Override - public Object getSource(ConfigurationWrapper section, String dataKey) { - return section.get(dataKey); - } - -} +//package cc.carm.lib.configuration.value.standard; +// +//import cc.carm.lib.configuration.function.ConfigDataFunction; +//import cc.carm.lib.configuration.value.ValueManifest; +//import cc.carm.lib.configuration.value.impl.ConfigValueMap; +//import org.jetbrains.annotations.NotNull; +// +//import java.util.Map; +//import java.util.function.Supplier; +// +//public class ConfiguredMap extends ConfigValueMap { +// +// public ConfiguredMap(@NotNull ValueManifest> manifest, +// @NotNull Supplier> mapObjSupplier, +// @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, +// @NotNull Class valueClass, @NotNull ConfigDataFunction valueParser, +// @NotNull ConfigDataFunction keySerializer, +// @NotNull ConfigDataFunction valueSerializer) { +// super(manifest, Object.class, mapObjSupplier, keyClass, keyParser, valueClass, valueParser, keySerializer, valueSerializer); +// } +// +// @Override +// public Object getSource(ConfigurationWrapper section, String dataKey) { +// return section.get(dataKey); +// } +// +//} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java index 718de8d..2630953 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java @@ -1,97 +1,96 @@ -package cc.carm.lib.configuration.value.standard; - -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.ConfigurationWrapper; -import cc.carm.lib.configuration.value.ValueManifest; -import cc.carm.lib.configuration.value.impl.CachedConfigValue; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Map; - -public class ConfiguredSection extends CachedConfigValue { - - public static @NotNull SectionValueBuilder builderOf(@NotNull Class valueClass) { - return builder().asValue(valueClass).fromSection(); - } - - protected final @NotNull Class valueClass; - - protected final @NotNull ConfigValueParser, V> parser; - protected final @NotNull ConfigDataFunction> serializer; - - public ConfiguredSection(@NotNull ValueManifest manifest, @NotNull Class valueClass, - @NotNull ConfigValueParser, V> parser, - @NotNull ConfigDataFunction> serializer) { - super(manifest); - this.valueClass = valueClass; - this.parser = parser; - this.serializer = serializer; - } - - /** - * @return Value's type class - */ - public @NotNull Class getValueClass() { - return valueClass; - } - - /** - * @return Value's parser, cast value from section. - */ - public @NotNull ConfigValueParser, V> getParser() { - return parser; - } - - /** - * @return Value's serializer, serialize value to section. - */ - public @NotNull ConfigDataFunction> 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); - if (value == null) setValue(null); - else { - try { - setValue(serializer.parse(value)); - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - -} +//package cc.carm.lib.configuration.value.standard; +// +//import cc.carm.lib.configuration.builder.value.SectionValueBuilder; +//import cc.carm.lib.configuration.function.ConfigDataFunction; +//import cc.carm.lib.configuration.function.ConfigValueParser; +//import cc.carm.lib.configuration.value.ValueManifest; +//import cc.carm.lib.configuration.value.impl.CachedConfigValue; +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +// +//import java.util.Map; +// +//public class ConfiguredSection extends CachedConfigValue { +// +// public static @NotNull SectionValueBuilder builderOf(@NotNull Class valueClass) { +// return builder().asValue(valueClass).fromSection(); +// } +// +// protected final @NotNull Class valueClass; +// +// protected final @NotNull ConfigValueParser, V> parser; +// protected final @NotNull ConfigDataFunction> serializer; +// +// public ConfiguredSection(@NotNull ValueManifest manifest, @NotNull Class valueClass, +// @NotNull ConfigValueParser, V> parser, +// @NotNull ConfigDataFunction> serializer) { +// super(manifest); +// this.valueClass = valueClass; +// this.parser = parser; +// this.serializer = serializer; +// } +// +// /** +// * @return Value's type class +// */ +// public @NotNull Class getValueClass() { +// return valueClass; +// } +// +// /** +// * @return Value's parser, cast value from section. +// */ +// public @NotNull ConfigValueParser, V> getParser() { +// return parser; +// } +// +// /** +// * @return Value's serializer, serialize value to section. +// */ +// public @NotNull ConfigDataFunction> 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); +// if (value == null) setValue(null); +// else { +// try { +// setValue(serializer.parse(value)); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// +// +//} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java index 4d3a35c..82434df 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java @@ -1,32 +1,31 @@ -package cc.carm.lib.configuration.value.standard; - -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; -import cc.carm.lib.configuration.value.ValueManifest; -import cc.carm.lib.configuration.value.impl.ConfigValueMap; -import org.jetbrains.annotations.NotNull; - -import java.util.Map; -import java.util.function.Supplier; - -public class ConfiguredSectionMap extends ConfigValueMap> { - - public ConfiguredSectionMap(@NotNull ValueManifest> manifest, - @NotNull Supplier> mapObjSupplier, - @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, - @NotNull Class valueClass, @NotNull ConfigDataFunction, V> valueParser, - @NotNull ConfigDataFunction keySerializer, - @NotNull ConfigDataFunction> valueSerializer) { - super( - manifest, ConfigurationWrapper.class, mapObjSupplier, - keyClass, keyParser, valueClass, valueParser, - keySerializer, valueSerializer.andThen(s -> (Object) s) - ); - } - - @Override - public ConfigurationWrapper getSource(ConfigurationWrapper section, String dataKey) { - return section.getConfigurationSection(dataKey); - } - -} +//package cc.carm.lib.configuration.value.standard; +// +//import cc.carm.lib.configuration.function.ConfigDataFunction; +//import cc.carm.lib.configuration.value.ValueManifest; +//import cc.carm.lib.configuration.value.impl.ConfigValueMap; +//import org.jetbrains.annotations.NotNull; +// +//import java.util.Map; +//import java.util.function.Supplier; +// +//public class ConfiguredSectionMap extends ConfigValueMap> { +// +// public ConfiguredSectionMap(@NotNull ValueManifest> manifest, +// @NotNull Supplier> mapObjSupplier, +// @NotNull Class keyClass, @NotNull ConfigDataFunction keyParser, +// @NotNull Class valueClass, @NotNull ConfigDataFunction, V> valueParser, +// @NotNull ConfigDataFunction keySerializer, +// @NotNull ConfigDataFunction> valueSerializer) { +// super( +// manifest, ConfigurationWrapper.class, mapObjSupplier, +// keyClass, keyParser, valueClass, valueParser, +// keySerializer, valueSerializer.andThen(s -> (Object) s) +// ); +// } +// +// @Override +// public ConfigurationWrapper getSource(ConfigurationWrapper section, String dataKey) { +// return section.getConfigurationSection(dataKey); +// } +// +//} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java index 6b962f4..5117d26 100644 --- a/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java +++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java @@ -1,31 +1,29 @@ package cc.carm.lib.configuration.value.standard; -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.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigValueParser; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.impl.CachedConfigValue; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public class ConfiguredValue extends CachedConfigValue { - public static ConfigValueBuilder builderOf(Class valueClass) { - return builder().asValue(valueClass); - } - - @SuppressWarnings("unchecked") - public static ConfiguredValue of(@NotNull V defaultValue) { - return of((Class) defaultValue.getClass(), defaultValue); - } - - public static ConfiguredValue of(Class valueClass) { - return of(valueClass, null); - } - - public static ConfiguredValue of(Class valueClass, @Nullable V defaultValue) { - return builderOf(valueClass).fromObject().defaults(defaultValue).build(); - } +// public static ConfigValueBuilder builderOf(Class valueClass) { +// return builder().asValue(valueClass); +// } +// +// @SuppressWarnings("unchecked") +// public static ConfiguredValue of(@NotNull V defaultValue) { +// return of((Class) defaultValue.getClass(), defaultValue); +// } +// +// public static ConfiguredValue of(Class valueClass) { +// return of(valueClass, null); +// } +// +// public static ConfiguredValue of(Class valueClass, @Nullable V defaultValue) { +// return builderOf(valueClass).fromObject().defaults(defaultValue).build(); +// } protected final @NotNull Class valueClass; @@ -68,14 +66,15 @@ public class ConfiguredValue extends CachedConfigValue { // Data that is outdated and needs to be parsed again. Object value = getValue(); - if (value == null) return getDefaultValue(); // 获取的值不存在,直接使用默认值。 + if (value == null) return defaults(); + try { // If there are no errors, update the cache and return. - return updateCache(this.parser.parse(value, this.defaultValue)); + return updateCache(this.parser.parse(provider(), value, defaults())); } catch (Exception e) { // There was a parsing error, prompted and returned the default value. e.printStackTrace(); - return getDefaultValue(); + return defaults(); } } diff --git a/core/src/main/old/ValueManifestv.java b/core/src/main/old/ValueManifestv.java new file mode 100644 index 0000000..eb282ce --- /dev/null +++ b/core/src/main/old/ValueManifestv.java @@ -0,0 +1,123 @@ +package cc.carm.lib.configuration.value; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.List; +import java.util.Optional; + +/** + * ConfigValue Manifests. + * The basic information that describes a configuration value. + * + * @param Value type + * @author CarmJos + */ +public class ValueManifest { + + public static ValueManifest of(@Nullable ConfigurationProvider provider, @Nullable String configPath, + @Nullable List headerComments, @Nullable String inlineComments) { + return new ValueManifest<>(provider, configPath, headerComments, inlineComments, null); + } + + public static ValueManifest of(@Nullable ConfigurationProvider provider, @Nullable String configPath, + @Nullable List headerComments, @Nullable String inlineComments, + @Nullable V defaultValue) { + return new ValueManifest<>(provider, configPath, headerComments, inlineComments, defaultValue); + } + + protected @Nullable ConfigurationProvider provider; + protected @Nullable String configPath; + + protected @Nullable List headerComments; + protected @Nullable String inlineComment; + + protected @Nullable T defaultValue; + + /** + * @param provider Provider of config files {@link ConfigurationProvider} + * @param configPath Config path of this value + * @param headerComments Header comment contents + * @param inlineComment Inline comment content + * @param defaultValue The default value + */ + public ValueManifest(@Nullable ConfigurationProvider provider, @Nullable String configPath, + @Nullable List headerComments, @Nullable String inlineComment, + @Nullable T defaultValue) { + this.provider = provider; + this.configPath = configPath; + this.headerComments = headerComments; + this.inlineComment = inlineComment; + this.defaultValue = defaultValue; + } + + /** + * The initialize method for {@link ConfigInitializer}, which is used to initialize the value. + * + * @param provider Provider of config files {@link ConfigurationProvider} + * @param configPath Config path of this value + * @param headerComments Header comment contents + * @param inlineComment Inline comment content + */ + protected void initialize(@NotNull ConfigurationProvider provider, @NotNull String configPath, + @Nullable List headerComments, @Nullable String inlineComment) { + if (this.provider == null) this.provider = provider; + if (this.configPath == null) this.configPath = configPath; + if (this.headerComments == null) this.headerComments = headerComments; + if (this.inlineComment == null) this.inlineComment = inlineComment; + + if (getHeaderComments() != null) { + this.provider.setHeaderComment(getConfigPath(), getHeaderComments()); + } + if (getInlineComment() != null) { + this.provider.setInlineComment(getConfigPath(), getInlineComment()); + } + } + + public @Nullable T getDefaultValue() { + return this.defaultValue; + } + + public void setDefaultValue(@Nullable T defaultValue) { + this.defaultValue = defaultValue; + } + + public @NotNull ConfigurationProvider getProvider() { + return Optional.ofNullable(this.provider) + .orElseThrow(() -> new IllegalStateException("Value(" + configPath + ") does not have a provider.")); + } + + public final @NotNull ConfigurationWrapper getConfiguration() { + try { + return getProvider().getConfiguration(); + } catch (Exception ex) { + throw new IllegalStateException("Value(" + configPath + ") has not been initialized", ex); + } + } + + public @NotNull String getConfigPath() { + return Optional.ofNullable(this.configPath) + .orElseThrow(() -> new IllegalStateException("No section path provided.")); + } + + protected Object getValue() { + String path = getConfigPath(); // 当未指定路径时,优先抛出异常 + return getConfiguration().get(path); + } + + protected void setValue(@Nullable Object value) { + getConfiguration().set(getConfigPath(), value); + } + + public @Nullable String getInlineComment() { + return inlineComment; + } + + @Unmodifiable + public @Nullable List getHeaderComments() { + return headerComments; + } + + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java b/core/src/main/old/builder/AbstractConfigBuilder.java similarity index 94% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java rename to core/src/main/old/builder/AbstractConfigBuilder.java index dc3dd81..25429ba 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java +++ b/core/src/main/old/builder/AbstractConfigBuilder.java @@ -1,6 +1,5 @@ -package cc.carm.lib.configuration.core.builder; +package cc.carm.lib.configuration.builder; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.ValueManifest; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java b/core/src/main/old/builder/CommonConfigBuilder.java similarity index 67% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java rename to core/src/main/old/builder/CommonConfigBuilder.java index 941fdcd..b9e26f3 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/CommonConfigBuilder.java +++ b/core/src/main/old/builder/CommonConfigBuilder.java @@ -1,6 +1,4 @@ -package cc.carm.lib.configuration.core.builder; - -import cc.carm.lib.configuration.core.source.ConfigurationProvider; +package cc.carm.lib.configuration.builder; public abstract class CommonConfigBuilder> extends AbstractConfigBuilder> { diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/ConfigBuilder.java b/core/src/main/old/builder/ConfigBuilder.java similarity index 82% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/ConfigBuilder.java rename to core/src/main/old/builder/ConfigBuilder.java index 68262df..2dd7dc0 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/ConfigBuilder.java +++ b/core/src/main/old/builder/ConfigBuilder.java @@ -1,9 +1,9 @@ -package cc.carm.lib.configuration.core.builder; +package cc.carm.lib.configuration.builder; -import cc.carm.lib.configuration.core.builder.list.ConfigListBuilder; -import cc.carm.lib.configuration.core.builder.map.ConfigMapBuilder; -import cc.carm.lib.configuration.core.builder.map.ConfigMapCreator; -import cc.carm.lib.configuration.core.builder.value.ConfigValueBuilder; +import cc.carm.lib.configuration.builder.map.ConfigMapBuilder; +import cc.carm.lib.configuration.builder.map.ConfigMapCreator; +import cc.carm.lib.configuration.builder.list.ConfigListBuilder; +import cc.carm.lib.configuration.builder.value.ConfigValueBuilder; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/ConfigListBuilder.java b/core/src/main/old/builder/list/ConfigListBuilder.java similarity index 94% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/list/ConfigListBuilder.java rename to core/src/main/old/builder/list/ConfigListBuilder.java index 94e5a44..67b5210 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/ConfigListBuilder.java +++ b/core/src/main/old/builder/list/ConfigListBuilder.java @@ -1,6 +1,6 @@ -package cc.carm.lib.configuration.core.builder.list; +package cc.carm.lib.configuration.builder.list; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigDataFunction; import org.jetbrains.annotations.NotNull; import java.util.Map; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java b/core/src/main/old/builder/list/SourceListBuilder.java similarity index 93% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java rename to core/src/main/old/builder/list/SourceListBuilder.java index e7e4367..4173a66 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java +++ b/core/src/main/old/builder/list/SourceListBuilder.java @@ -1,7 +1,7 @@ -package cc.carm.lib.configuration.core.builder.list; +package cc.carm.lib.configuration.builder.list; -import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.builder.CommonConfigBuilder; +import cc.carm.lib.configuration.function.ConfigDataFunction; import cc.carm.lib.configuration.value.standard.ConfiguredList; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapBuilder.java b/core/src/main/old/builder/map/ConfigMapBuilder.java similarity index 95% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapBuilder.java rename to core/src/main/old/builder/map/ConfigMapBuilder.java index ecfa675..635dd5d 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapBuilder.java +++ b/core/src/main/old/builder/map/ConfigMapBuilder.java @@ -1,6 +1,6 @@ -package cc.carm.lib.configuration.core.builder.map; +package cc.carm.lib.configuration.builder.map; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigDataFunction; import org.jetbrains.annotations.NotNull; import java.util.Map; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapCreator.java b/core/src/main/old/builder/map/ConfigMapCreator.java similarity index 95% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapCreator.java rename to core/src/main/old/builder/map/ConfigMapCreator.java index 4b92a5b..24a8312 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/ConfigMapCreator.java +++ b/core/src/main/old/builder/map/ConfigMapCreator.java @@ -1,4 +1,4 @@ -package cc.carm.lib.configuration.core.builder.map; +package cc.carm.lib.configuration.builder.map; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java b/core/src/main/old/builder/map/SectionMapBuilder.java similarity index 93% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java rename to core/src/main/old/builder/map/SectionMapBuilder.java index df57cf3..c5a6267 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java +++ b/core/src/main/old/builder/map/SectionMapBuilder.java @@ -1,8 +1,7 @@ -package cc.carm.lib.configuration.core.builder.map; +package cc.carm.lib.configuration.builder.map; -import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.builder.CommonConfigBuilder; +import cc.carm.lib.configuration.function.ConfigDataFunction; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.standard.ConfiguredSectionMap; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java b/core/src/main/old/builder/map/SourceMapBuilder.java similarity index 95% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java rename to core/src/main/old/builder/map/SourceMapBuilder.java index 034f597..4699edd 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java +++ b/core/src/main/old/builder/map/SourceMapBuilder.java @@ -1,7 +1,7 @@ -package cc.carm.lib.configuration.core.builder.map; +package cc.carm.lib.configuration.builder.map; -import cc.carm.lib.configuration.core.builder.CommonConfigBuilder; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; +import cc.carm.lib.configuration.builder.CommonConfigBuilder; +import cc.carm.lib.configuration.function.ConfigDataFunction; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.standard.ConfiguredMap; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/ConfigValueBuilder.java b/core/src/main/old/builder/value/ConfigValueBuilder.java similarity index 90% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/value/ConfigValueBuilder.java rename to core/src/main/old/builder/value/ConfigValueBuilder.java index 58f9f35..b4db9ce 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/ConfigValueBuilder.java +++ b/core/src/main/old/builder/value/ConfigValueBuilder.java @@ -1,8 +1,7 @@ -package cc.carm.lib.configuration.core.builder.value; +package cc.carm.lib.configuration.builder.value; -import cc.carm.lib.configuration.core.function.ConfigDataFunction; -import cc.carm.lib.configuration.core.function.ConfigValueParser; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; +import cc.carm.lib.configuration.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigValueParser; import org.jetbrains.annotations.NotNull; import java.util.Map; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java b/core/src/main/old/builder/value/SectionValueBuilder.java similarity index 83% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java rename to core/src/main/old/builder/value/SectionValueBuilder.java index 928860b..dbdf6de 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java +++ b/core/src/main/old/builder/value/SectionValueBuilder.java @@ -1,9 +1,8 @@ -package cc.carm.lib.configuration.core.builder.value; +package cc.carm.lib.configuration.builder.value; -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; +import cc.carm.lib.configuration.builder.CommonConfigBuilder; +import cc.carm.lib.configuration.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigValueParser; import cc.carm.lib.configuration.value.standard.ConfiguredSection; import org.jetbrains.annotations.NotNull; diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java b/core/src/main/old/builder/value/SourceValueBuilder.java similarity index 90% rename from core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java rename to core/src/main/old/builder/value/SourceValueBuilder.java index 57541fa..22c2c9a 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java +++ b/core/src/main/old/builder/value/SourceValueBuilder.java @@ -1,8 +1,8 @@ -package cc.carm.lib.configuration.core.builder.value; +package cc.carm.lib.configuration.builder.value; -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.builder.CommonConfigBuilder; +import cc.carm.lib.configuration.function.ConfigDataFunction; +import cc.carm.lib.configuration.function.ConfigValueParser; import cc.carm.lib.configuration.value.standard.ConfiguredValue; import org.jetbrains.annotations.NotNull; diff --git a/core/src/test/java/AdaptTest.java b/core/src/test/java/AdaptTest.java index b0e8d0d..e4cc97c 100644 --- a/core/src/test/java/AdaptTest.java +++ b/core/src/test/java/AdaptTest.java @@ -2,6 +2,9 @@ import cc.carm.lib.configuration.adapter.ValueAdapterRegistry; import cc.carm.lib.configuration.adapter.strandard.EnumAdapter; import cc.carm.lib.configuration.adapter.strandard.PrimitiveAdapters; import cc.carm.lib.configuration.source.ConfigurationProvider; +import cc.carm.lib.configuration.loader.ConfigurationLoader; +import cc.carm.lib.easyoptions.OptionHolder; +import cc.carm.test.config.TestSource; import org.junit.Test; import java.time.Duration; @@ -12,7 +15,7 @@ public class AdaptTest { @Test public void test() throws Exception { - ValueAdapterRegistry registry = new ValueAdapterRegistry<>(); + ValueAdapterRegistry registry = new ValueAdapterRegistry(); registry.register(Long.class, PrimitiveAdapters.ofLong()); registry.register(long.class, PrimitiveAdapters.ofLong()); registry.register(Integer.class, PrimitiveAdapters.ofInteger()); @@ -30,7 +33,7 @@ public class AdaptTest { registry.register(Boolean.class, PrimitiveAdapters.ofBoolean()); registry.register(boolean.class, PrimitiveAdapters.ofBoolean()); registry.register(String.class, PrimitiveAdapters.ofString()); - registry.register(new EnumAdapter<>()); + registry.register(new EnumAdapter()); registry.register(Long.class, Duration.class, Duration::ofSeconds, Duration::getSeconds); registry.register( @@ -39,7 +42,7 @@ public class AdaptTest { data -> Duration.between(LocalTime.now(), data) ); - ConfigurationProvider provider = new ConfigurationProvider(); + ConfigurationProvider provider = new ConfigurationProvider<>(new TestSource(), new ConfigurationLoader(), registry, new OptionHolder()); LocalTime v = registry.deserialize(provider, LocalTime.class, "600"); Object d = registry.serialize(provider, v); diff --git a/core/src/test/java/NameTest.java b/core/src/test/java/NameTest.java index 7a45698..d1d09a9 100644 --- a/core/src/test/java/NameTest.java +++ b/core/src/test/java/NameTest.java @@ -1,3 +1,4 @@ +import cc.carm.lib.configuration.loader.PathGenerator; import org.junit.Test; public class NameTest { @@ -6,10 +7,10 @@ public class NameTest { @Test public void onTest() { - System.out.println(ConfigInitializer.getPathFromName("LoveGames")); // -> love-games - System.out.println(ConfigInitializer.getPathFromName("EASY_GAME")); // -> easy-game - System.out.println(ConfigInitializer.getPathFromName("F")); //-? f - System.out.println(ConfigInitializer.getPathFromName("Test123123")); // -? test123123123 + System.out.println(PathGenerator.covertPathName("LoveGames")); // -> love-games + System.out.println(PathGenerator.covertPathName("EASY_GAME")); // -> easy-game + System.out.println(PathGenerator.covertPathName("F")); //-? f + System.out.println(PathGenerator.covertPathName("Test123123")); // -? test123123123 } diff --git a/core/src/test/java/cc/carm/test/config/LoaderTest.java b/core/src/test/java/cc/carm/test/config/LoaderTest.java new file mode 100644 index 0000000..aa3de0a --- /dev/null +++ b/core/src/test/java/cc/carm/test/config/LoaderTest.java @@ -0,0 +1,42 @@ +package cc.carm.test.config; + +import cc.carm.lib.configuration.adapter.ValueAdapterRegistry; +import cc.carm.lib.configuration.annotation.ConfigPath; +import cc.carm.lib.configuration.Configuration; +import cc.carm.lib.configuration.source.ConfigurationProvider; +import cc.carm.lib.configuration.loader.ConfigurationLoader; +import cc.carm.lib.easyoptions.OptionHolder; +import org.junit.Test; + +public class LoaderTest { + + @Test + public void test() throws Exception { + ConfigurationProvider provider = new ConfigurationProvider<>(new TestSource(), new ConfigurationLoader(), new ValueAdapterRegistry(), new OptionHolder()); + + ConfigurationLoader loader = new ConfigurationLoader(); + loader.load(provider, ROOT.class); + } + + interface ROOT extends Configuration { + + interface SUB extends Configuration { + + + } + + + @ConfigPath(root = true) + interface EXTERNAL extends Configuration { + + + } + + @ConfigPath("NO") + interface YES extends Configuration { + + + } + + } +} \ No newline at end of file diff --git a/core/src/test/java/cc/carm/test/config/TestSource.java b/core/src/test/java/cc/carm/test/config/TestSource.java new file mode 100644 index 0000000..30247a3 --- /dev/null +++ b/core/src/test/java/cc/carm/test/config/TestSource.java @@ -0,0 +1,82 @@ +package cc.carm.test.config; + +import cc.carm.lib.configuration.source.ConfigurationSection; +import cc.carm.lib.configuration.source.ConfigurationSource; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class TestSource extends ConfigurationSource> { + + public TestSource() { + super(System.currentTimeMillis()); + } + + @Override + protected TestSource getThis() { + return this; + } + + @Override + public void save() throws Exception { + + } + + @Override + protected void onReload() throws Exception { + + } + + @Override + public @NotNull Map original() { + return null; + } + + @Override + public @NotNull Set getKeys(boolean deep) { + return null; + } + + @Override + public @NotNull Map getValues(boolean deep) { + return null; + } + + @Override + public @Nullable Object get(@NotNull String path) { + return null; + } + + @Override + public void set(@NotNull String path, @Nullable Object value) { + + } + + @Override + public boolean contains(@NotNull String path) { + return false; + } + + @Override + public boolean isList(@NotNull String path) { + return false; + } + + @Override + public @Nullable List getList(@NotNull String path) { + return null; + } + + @Override + public boolean isSection(@NotNull String path) { + return false; + } + + @Override + public @Nullable ConfigurationSection getSection(@NotNull String path) { + return null; + } +} diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java index 5e662ea..f9ebe6d 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/DatabaseConfiguration.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.demo; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.value.ConfigValue; diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java index 10ade90..b6c18df 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.demo.tests; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration; import cc.carm.lib.configuration.demo.tests.conf.TestConfiguration; import cc.carm.lib.configuration.demo.tests.model.TestModel; diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java index 6b3875e..76d30bd 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/DemoConfiguration.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.demo.tests.conf; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.annotation.InlineComment; diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java index c242e4a..2f6c021 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestConfiguration.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.demo.tests.conf; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.annotation.InlineComment; diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java index ba61899..2d4a548 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/TestInnerConfiguration.java @@ -1,6 +1,6 @@ package cc.carm.lib.configuration.demo.tests.conf; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.value.ConfigValue; import cc.carm.lib.configuration.value.standard.ConfiguredValue; diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java index 9e53d95..9121742 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/model/TestModel.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.demo.tests.model; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/features/commentable/pom.xml b/features/commentable/pom.xml new file mode 100644 index 0000000..5aee317 --- /dev/null +++ b/features/commentable/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-commentable + 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/commentable/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java b/features/commentable/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java similarity index 100% rename from commentable/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java rename to features/commentable/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java diff --git a/commentable/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java b/features/commentable/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java similarity index 100% rename from commentable/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java rename to features/commentable/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java diff --git a/features/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java b/features/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java new file mode 100644 index 0000000..be7d8f9 --- /dev/null +++ b/features/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableMetaTypes.java @@ -0,0 +1,22 @@ +package cc.carm.lib.configuration.commentable; + +import cc.carm.lib.configuration.annotation.HeaderComment; +import cc.carm.lib.configuration.annotation.InlineComment; +import cc.carm.lib.configuration.value.meta.ValueMetaType; + +import java.util.Collections; +import java.util.List; + +public interface CommentableMetaTypes { + + /** + * Configuration's {@link HeaderComment} + */ + ValueMetaType> HEADER_COMMENTS = ValueMetaType.of(Collections.emptyList()); + + /** + * Configuration's {@link InlineComment} + */ + ValueMetaType INLINE_COMMENT_VALUE = ValueMetaType.of(); + +} diff --git a/commentable/src/main/java/cc/carm/lib/configuration/commentable/ConfigurationComments.java b/features/commentable/src/main/java/cc/carm/lib/configuration/commentable/ConfigurationComments.java similarity index 100% rename from commentable/src/main/java/cc/carm/lib/configuration/commentable/ConfigurationComments.java rename to features/commentable/src/main/java/cc/carm/lib/configuration/commentable/ConfigurationComments.java diff --git a/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableOptions.java b/features/commentable/src/main/java/cc/carm/lib/configuration/option/CommentableOptions.java similarity index 88% rename from commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableOptions.java rename to features/commentable/src/main/java/cc/carm/lib/configuration/option/CommentableOptions.java index 7fcfc0d..3bc585b 100644 --- a/commentable/src/main/java/cc/carm/lib/configuration/commentable/CommentableOptions.java +++ b/features/commentable/src/main/java/cc/carm/lib/configuration/option/CommentableOptions.java @@ -1,9 +1,7 @@ -package cc.carm.lib.configuration.commentable; +package cc.carm.lib.configuration.option; import cc.carm.lib.easyoptions.OptionType; -import static cc.carm.lib.easyoptions.OptionType.of; - public interface CommentableOptions { /** diff --git a/commentable/pom.xml b/features/file/pom.xml similarity index 54% rename from commentable/pom.xml rename to features/file/pom.xml index d58cdcb..861bcb1 100644 --- a/commentable/pom.xml +++ b/features/file/pom.xml @@ -7,6 +7,7 @@ cc.carm.lib easyconfiguration-parent 3.9.1 + ../../pom.xml ${project.jdk.version} @@ -15,8 +16,8 @@ UTF-8 - easyconfiguration-commentable - + easyconfiguration-feature-file + jar @@ -26,4 +27,24 @@ + + + + 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/file/src/main/java/cc/carm/lib/configuration/option/FileConfigOptions.java b/features/file/src/main/java/cc/carm/lib/configuration/option/FileConfigOptions.java new file mode 100644 index 0000000..4868651 --- /dev/null +++ b/features/file/src/main/java/cc/carm/lib/configuration/option/FileConfigOptions.java @@ -0,0 +1,15 @@ +package cc.carm.lib.configuration.option; + +import cc.carm.lib.easyoptions.OptionType; + +import static cc.carm.lib.easyoptions.OptionType.of; + +public class FileConfigOptions { + + /** + * Whether to copy files from resource if exists. + */ + OptionType COPY_DEFAULTS = of(true); + + +} diff --git a/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigProvider.java b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigProvider.java new file mode 100644 index 0000000..41bdea1 --- /dev/null +++ b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigProvider.java @@ -0,0 +1,87 @@ +//package cc.carm.lib.configuration.core.source.impl; +// +//import org.jetbrains.annotations.NotNull; +//import org.jetbrains.annotations.Nullable; +// +//import java.io.File; +//import java.io.IOException; +//import java.io.InputStream; +//import java.io.OutputStream; +//import java.net.URL; +//import java.net.URLConnection; +//import java.nio.file.Files; +//import java.util.Objects; +// +//public abstract class FileConfigProvider> extends ConfigurationProvider { +// +// protected final @NotNull File file; +// +// protected FileConfigProvider(@NotNull File file) { +// this.file = file; +// } +// +// public @NotNull File getFile() { +// return file; +// } +// +// public void initializeFile(@Nullable String sourcePath) throws IOException { +// 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 (!this.file.createNewFile()) { +// throw new IOException("Failed to create file " + file.getAbsolutePath()); +// } +// +// if (sourcePath != null) { +// try { +// saveResource(sourcePath, true); +// } catch (IllegalArgumentException ignored) { +// } +// } +// } +// +// public void saveResource(@NotNull String resourcePath, boolean replace) +// throws IOException, IllegalArgumentException { +// Objects.requireNonNull(resourcePath, "ResourcePath cannot be null"); +// if (resourcePath.isEmpty()) throw new IllegalArgumentException("ResourcePath cannot be empty"); +// +// resourcePath = resourcePath.replace('\\', '/'); +// +// URL url = this.getClass().getClassLoader().getResource(resourcePath); +// if (url == null) throw new IllegalArgumentException("The resource '" + resourcePath + "' not exists"); +// +// File outDir = file.getParentFile(); +// +// if (!outDir.exists() && !outDir.mkdirs()) throw new IOException("Failed to create directory " + outDir); +// if (!file.exists() || replace) { +// try (OutputStream out = Files.newOutputStream(file.toPath())) { +// URLConnection connection = url.openConnection(); +// connection.setUseCaches(false); +// try (InputStream in = connection.getInputStream()) { +// byte[] buf = new byte[1024]; +// int len; +// while ((len = in.read(buf)) > 0) { +// out.write(buf, 0, len); +// } +// } +// } +// } +// } +// +// @Nullable +// public InputStream getResource(@NotNull String filename) { +// try { +// URL url = this.getClass().getClassLoader().getResource(filename); +// if (url == null) return null; +// URLConnection connection = url.openConnection(); +// connection.setUseCaches(false); +// return connection.getInputStream(); +// } catch (IOException ex) { +// return null; +// } +// } +//} diff --git a/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java new file mode 100644 index 0000000..c189461 --- /dev/null +++ b/features/file/src/main/java/cc/carm/lib/configuration/source/FileConfigSource.java @@ -0,0 +1,6 @@ +package cc.carm.lib.configuration.source; + +public class FileConfigSource { + + +} diff --git a/pom.xml b/pom.xml index 55f7c72..f2d2d0f 100644 --- a/pom.xml +++ b/pom.xml @@ -18,12 +18,14 @@ 3.9.1 core - demo - impl/yaml - impl/json - impl/sql - impl/hocon - commentable + features/commentable + features/file + + + + + + EasyConfiguration diff --git a/impl/json/README.md b/providers/gson/README.md similarity index 100% rename from impl/json/README.md rename to providers/gson/README.md diff --git a/impl/json/pom.xml b/providers/gson/pom.xml similarity index 97% rename from impl/json/pom.xml rename to providers/gson/pom.xml index 44155a5..df5abd9 100644 --- a/impl/json/pom.xml +++ b/providers/gson/pom.xml @@ -15,7 +15,7 @@ UTF-8 UTF-8 - easyconfiguration-json + easyconfiguration-gson jar diff --git a/impl/json/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/providers/gson/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java similarity index 100% rename from impl/json/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java rename to providers/gson/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java diff --git a/impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java similarity index 97% rename from impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java rename to providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java index bbf7c80..74865ee 100644 --- a/impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java +++ b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigProvider.java @@ -1,7 +1,6 @@ package cc.carm.lib.configuration.json; import cc.carm.lib.configuration.source.comment.ConfigurationComments; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.core.source.impl.FileConfigProvider; import com.google.gson.Gson; import com.google.gson.GsonBuilder; diff --git a/impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java similarity index 98% rename from impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java rename to providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java index c175c2d..5cb0f88 100644 --- a/impl/json/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java +++ b/providers/gson/src/main/java/cc/carm/lib/configuration/json/JSONConfigWrapper.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.json; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/impl/json/src/test/java/config/JSONConfigTest.java b/providers/gson/src/test/java/config/JSONConfigTest.java similarity index 100% rename from impl/json/src/test/java/config/JSONConfigTest.java rename to providers/gson/src/test/java/config/JSONConfigTest.java diff --git a/impl/hocon/README.md b/providers/hocon/README.md similarity index 100% rename from impl/hocon/README.md rename to providers/hocon/README.md diff --git a/impl/hocon/pom.xml b/providers/hocon/pom.xml similarity index 100% rename from impl/hocon/pom.xml rename to providers/hocon/pom.xml diff --git a/impl/hocon/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/providers/hocon/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java similarity index 100% rename from impl/hocon/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java rename to providers/hocon/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java diff --git a/impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java b/providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java similarity index 98% rename from impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java rename to providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java index 5465e23..600974e 100644 --- a/impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java +++ b/providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONConfigWrapper.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.hocon; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import cc.carm.lib.configuration.hocon.util.HOCONUtils; import com.typesafe.config.*; import org.jetbrains.annotations.NotNull; diff --git a/impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONFileConfigProvider.java b/providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONFileConfigProvider.java similarity index 100% rename from impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONFileConfigProvider.java rename to providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/HOCONFileConfigProvider.java diff --git a/impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/exception/HOCONGetValueException.java b/providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/exception/HOCONGetValueException.java similarity index 100% rename from impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/exception/HOCONGetValueException.java rename to providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/exception/HOCONGetValueException.java diff --git a/impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/util/HOCONUtils.java b/providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/util/HOCONUtils.java similarity index 100% rename from impl/hocon/src/main/java/cc/carm/lib/configuration/hocon/util/HOCONUtils.java rename to providers/hocon/src/main/java/cc/carm/lib/configuration/hocon/util/HOCONUtils.java diff --git a/impl/hocon/src/test/java/online/flowerinsnow/test/easyconfiguration/HOCONTest.java b/providers/hocon/src/test/java/online/flowerinsnow/test/easyconfiguration/HOCONTest.java similarity index 100% rename from impl/hocon/src/test/java/online/flowerinsnow/test/easyconfiguration/HOCONTest.java rename to providers/hocon/src/test/java/online/flowerinsnow/test/easyconfiguration/HOCONTest.java diff --git a/impl/sql/README.md b/providers/sql/README.md similarity index 100% rename from impl/sql/README.md rename to providers/sql/README.md diff --git a/impl/sql/pom.xml b/providers/sql/pom.xml similarity index 100% rename from impl/sql/pom.xml rename to providers/sql/pom.xml diff --git a/impl/sql/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/providers/sql/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java similarity index 100% rename from impl/sql/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java rename to providers/sql/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java diff --git a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java similarity index 98% rename from impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java rename to providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java index e896060..e2f4ea3 100644 --- a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java +++ b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigProvider.java @@ -1,7 +1,6 @@ package cc.carm.lib.configuration.sql; import cc.carm.lib.configuration.source.comment.ConfigurationComments; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.easysql.api.SQLManager; import cc.carm.lib.easysql.api.SQLQuery; import cc.carm.lib.easysql.api.SQLTable; diff --git a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java similarity index 98% rename from impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java rename to providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java index a817b68..060268d 100644 --- a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java +++ b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLConfigWrapper.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.sql; -import cc.carm.lib.configuration.core.source.ConfigurationWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueResolver.java b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueResolver.java similarity index 100% rename from impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueResolver.java rename to providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueResolver.java diff --git a/impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueTypes.java b/providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueTypes.java similarity index 100% rename from impl/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueTypes.java rename to providers/sql/src/main/java/cc/carm/lib/configuration/sql/SQLValueTypes.java diff --git a/impl/sql/src/test/java/config/SQLConfigTest.java b/providers/sql/src/test/java/config/SQLConfigTest.java similarity index 100% rename from impl/sql/src/test/java/config/SQLConfigTest.java rename to providers/sql/src/test/java/config/SQLConfigTest.java diff --git a/impl/sql/src/test/resources/log4j2.xml b/providers/sql/src/test/resources/log4j2.xml similarity index 100% rename from impl/sql/src/test/resources/log4j2.xml rename to providers/sql/src/test/resources/log4j2.xml diff --git a/impl/yaml/README.md b/providers/yaml/README.md similarity index 100% rename from impl/yaml/README.md rename to providers/yaml/README.md diff --git a/impl/yaml/pom.xml b/providers/yaml/pom.xml similarity index 100% rename from impl/yaml/pom.xml rename to providers/yaml/pom.xml diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/EasyConfiguration.java diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLConfigProvider.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLConfigProvider.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLConfigProvider.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLConfigProvider.java diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java similarity index 97% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java index 2610273..e2c8ca8 100644 --- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java +++ b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLSectionWrapper.java @@ -1,6 +1,5 @@ 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; diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java similarity index 93% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java index 5e16ff3..fec8efd 100644 --- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java +++ b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java @@ -1,6 +1,5 @@ package cc.carm.lib.configuration.yaml; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.impl.CachedConfigValue; import cc.carm.lib.configuration.yaml.builder.YAMLConfigBuilder; diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/AbstractYAMLBuilder.java diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YAMLConfigBuilder.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YAMLConfigBuilder.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YAMLConfigBuilder.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/YAMLConfigBuilder.java diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/builder/serializable/SerializableBuilder.java diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java b/providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java similarity index 100% rename from impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java rename to providers/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java diff --git a/impl/yaml/src/test/java/config/DemoConfigTest.java b/providers/yaml/src/test/java/config/DemoConfigTest.java similarity index 100% rename from impl/yaml/src/test/java/config/DemoConfigTest.java rename to providers/yaml/src/test/java/config/DemoConfigTest.java diff --git a/impl/yaml/src/test/java/config/model/AnyModel.java b/providers/yaml/src/test/java/config/model/AnyModel.java similarity index 100% rename from impl/yaml/src/test/java/config/model/AnyModel.java rename to providers/yaml/src/test/java/config/model/AnyModel.java diff --git a/impl/yaml/src/test/java/config/model/SomeModel.java b/providers/yaml/src/test/java/config/model/SomeModel.java similarity index 100% rename from impl/yaml/src/test/java/config/model/SomeModel.java rename to providers/yaml/src/test/java/config/model/SomeModel.java diff --git a/impl/yaml/src/test/java/config/source/ModelConfiguration.java b/providers/yaml/src/test/java/config/source/ModelConfiguration.java similarity index 97% rename from impl/yaml/src/test/java/config/source/ModelConfiguration.java rename to providers/yaml/src/test/java/config/source/ModelConfiguration.java index 021c6a3..14dfdf9 100644 --- a/impl/yaml/src/test/java/config/source/ModelConfiguration.java +++ b/providers/yaml/src/test/java/config/source/ModelConfiguration.java @@ -1,6 +1,6 @@ package config.source; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.value.ConfigValue; diff --git a/impl/yaml/src/test/java/sample/Sample.java b/providers/yaml/src/test/java/sample/Sample.java similarity index 89% rename from impl/yaml/src/test/java/sample/Sample.java rename to providers/yaml/src/test/java/sample/Sample.java index caaa989..83a9b7c 100644 --- a/impl/yaml/src/test/java/sample/Sample.java +++ b/providers/yaml/src/test/java/sample/Sample.java @@ -1,7 +1,6 @@ package sample; import cc.carm.lib.configuration.EasyConfiguration; -import cc.carm.lib.configuration.core.source.ConfigurationProvider; public class Sample { diff --git a/impl/yaml/src/test/java/sample/SampleConfig.java b/providers/yaml/src/test/java/sample/SampleConfig.java similarity index 95% rename from impl/yaml/src/test/java/sample/SampleConfig.java rename to providers/yaml/src/test/java/sample/SampleConfig.java index 7b71a42..d8b53d1 100644 --- a/impl/yaml/src/test/java/sample/SampleConfig.java +++ b/providers/yaml/src/test/java/sample/SampleConfig.java @@ -1,6 +1,6 @@ package sample; -import cc.carm.lib.configuration.core.Configuration; +import cc.carm.lib.configuration.source.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.annotation.HeaderComment; import cc.carm.lib.configuration.annotation.InlineComment; diff --git a/impl/yaml/src/test/resources/test/test2/config.yml b/providers/yaml/src/test/resources/test/test2/config.yml similarity index 100% rename from impl/yaml/src/test/resources/test/test2/config.yml rename to providers/yaml/src/test/resources/test/test2/config.yml