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
new file mode 100644
index 0000000..738dc27
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapter.java
@@ -0,0 +1,45 @@
+package cc.carm.lib.configuration.adapter;
+
+import cc.carm.lib.configuration.source.ConfigurationProvider;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class ValueAdapter
{
+
+ protected final Class baseType;
+ protected final Class valueType;
+
+ protected ValueAdapter(Class baseType, Class valueType) {
+ this.baseType = baseType;
+ this.valueType = valueType;
+ }
+
+ public Class getBaseType() {
+ return baseType;
+ }
+
+ public Class getValueType() {
+ return valueType;
+ }
+
+ public abstract B serialize(@NotNull P provider, @NotNull V value) throws Exception;
+
+ public abstract V deserialize(@NotNull P provider, @NotNull B data) throws Exception;
+
+ public boolean isAdaptedFrom(Class> clazz) {
+ return clazz.isAssignableFrom(valueType);
+ }
+
+ public boolean isAdaptedFrom(Object object) {
+ return isAdaptedFrom(object.getClass());
+ }
+
+ protected final V deserializeObject(P provider, Object data) throws Exception {
+ return deserialize(provider, this.baseType.cast(data));
+ }
+
+ protected final B serializeObject(P provider, Object value) throws Exception {
+ return serialize(provider, this.valueType.cast(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
new file mode 100644
index 0000000..77eb729
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueAdapterRegistry.java
@@ -0,0 +1,79 @@
+package cc.carm.lib.configuration.adapter;
+
+import cc.carm.lib.configuration.adapter.primitive.PrimitiveAdapter;
+import cc.carm.lib.configuration.core.function.ConfigDataFunction;
+import cc.carm.lib.configuration.source.ConfigurationProvider;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ValueAdapterRegistry {
+
+ protected final @NotNull P provider;
+ protected final Map, ValueAdapter> adapters = new HashMap<>();
+
+ public ValueAdapterRegistry(@NotNull P provider) {
+ this.provider = provider;
+ }
+
+ public void register(@NotNull ValueAdapter
adapter) {
+ adapters.put(adapter.valueType, adapter);
+ }
+
+ public void register(Class baseClass, Class valueClass,
+ ConfigDataFunction parser,
+ ConfigDataFunction serializer) {
+ register(new ValueAdapter(baseClass, valueClass) {
+ @Override
+ public B serialize(@NotNull P provider, @NotNull V value) throws Exception {
+ return serializer.parse(value);
+ }
+
+ @Override
+ public V deserialize(@NotNull P provider, @NotNull B data) throws Exception {
+ return parser.parse(data);
+ }
+ });
+ }
+
+ public void unregister(@NotNull Class> typeClass) {
+ adapters.remove(typeClass);
+ }
+
+ public T deserialize(Class type, Object value) throws Exception {
+ if (value == null) return null;
+ if (type == Object.class) return type.cast(value);
+
+ ValueAdapter adapter = adapters.get(type);
+ if (adapter == null) throw new RuntimeException("No adapter for type " + type.getName());
+
+ // CHECK IF VALUE IS ADAPTED FROM GIVEN VALUE'S TYPE
+ if (adapter.isAdaptedFrom(value)) return type.cast(adapter.deserializeObject(provider, value));
+
+ // OTHERWISE, WE NEED TO DESERIALIZE ONE BY ONE
+ Object baseValue = deserialize(adapter.getBaseType(), value);
+ if (baseValue == null) return null; // Null check
+
+ return type.cast(adapter.deserializeObject(provider, baseValue));
+ }
+
+ public Object serialize(T value) throws Exception {
+ if (value == null) return null;
+
+ Class> valueClass = value.getClass();
+ ValueAdapter adapter = adapters.get(valueClass);
+ if (adapter == null) return value; // No adapters, try to return the original value
+
+ if (adapter instanceof PrimitiveAdapter) {
+ // If the value is adapted from a primitive type,
+ // we should serialize it into object, then return.
+ return adapter.serializeObject(provider, value);
+ }
+
+ // Otherwise, we need to serialize one by one.
+ return serialize(adapter.serializeObject(provider, value));
+ }
+
+
+}
diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/NumberAdapter.java b/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/NumberAdapter.java
new file mode 100644
index 0000000..fd535c0
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/NumberAdapter.java
@@ -0,0 +1,24 @@
+package cc.carm.lib.configuration.adapter.primitive;
+
+import cc.carm.lib.configuration.core.function.ConfigDataFunction;
+import cc.carm.lib.configuration.source.ConfigurationProvider;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class NumberAdapter
extends PrimitiveAdapter
{
+
+ public static
NumberAdapter
of(Class numberClass,
+ ConfigDataFunction function) {
+ return new NumberAdapter(numberClass) {
+ @Override
+ public T deserialize(@NotNull P provider, @NotNull Object data) throws Exception {
+ return function.parse(data);
+ }
+ };
+ }
+
+ protected NumberAdapter(Class valueType) {
+ super(valueType);
+ }
+
+
+}
diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/PrimitiveAdapter.java b/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/PrimitiveAdapter.java
new file mode 100644
index 0000000..1b80ea3
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/adapter/primitive/PrimitiveAdapter.java
@@ -0,0 +1,18 @@
+package cc.carm.lib.configuration.adapter.primitive;
+
+import cc.carm.lib.configuration.adapter.ValueAdapter;
+import cc.carm.lib.configuration.source.ConfigurationProvider;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class PrimitiveAdapter extends ValueAdapter
{
+
+ protected PrimitiveAdapter(Class valueType) {
+ super(Object.class, valueType);
+ }
+
+ @Override
+ public Object serialize(@NotNull P provider, @NotNull T value) throws Exception {
+ return value;
+ }
+
+}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java
similarity index 95%
rename from core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java
rename to core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java
index 25fee49..01061e3 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/annotation/ConfigPath.java
+++ b/core/src/main/java/cc/carm/lib/configuration/annotation/ConfigPath.java
@@ -1,4 +1,4 @@
-package cc.carm.lib.configuration.core.annotation;
+package cc.carm.lib.configuration.annotation;
import cc.carm.lib.configuration.core.ConfigInitializer;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/annotation/HeaderComment.java b/core/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java
similarity index 94%
rename from core/src/main/java/cc/carm/lib/configuration/core/annotation/HeaderComment.java
rename to core/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java
index 2089a46..284b290 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/annotation/HeaderComment.java
+++ b/core/src/main/java/cc/carm/lib/configuration/annotation/HeaderComment.java
@@ -1,4 +1,4 @@
-package cc.carm.lib.configuration.core.annotation;
+package cc.carm.lib.configuration.annotation;
import org.jetbrains.annotations.NotNull;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/annotation/InlineComment.java b/core/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java
similarity index 94%
rename from core/src/main/java/cc/carm/lib/configuration/core/annotation/InlineComment.java
rename to core/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java
index 1d3a750..d042da4 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/annotation/InlineComment.java
+++ b/core/src/main/java/cc/carm/lib/configuration/annotation/InlineComment.java
@@ -1,4 +1,4 @@
-package cc.carm.lib.configuration.core.annotation;
+package cc.carm.lib.configuration.annotation;
import org.jetbrains.annotations.NotNull;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java
index 1ea3f22..286b35e 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java
@@ -1,10 +1,10 @@
package cc.carm.lib.configuration.core;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.annotation.InlineComment;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.annotation.InlineComment;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
-import cc.carm.lib.configuration.core.value.ConfigValue;
+import cc.carm.lib.configuration.value.ConfigValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/ConfigurationRoot.java b/core/src/main/java/cc/carm/lib/configuration/core/ConfigurationRoot.java
deleted file mode 100644
index 8197290..0000000
--- a/core/src/main/java/cc/carm/lib/configuration/core/ConfigurationRoot.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package cc.carm.lib.configuration.core;
-
-/**
- * The root node of the configuration file class,
- * which is used to label and record the configuration information.
- */
-public abstract class ConfigurationRoot implements Configuration {
-}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
index eef1122..dc3dd81 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/AbstractConfigBuilder.java
@@ -1,8 +1,8 @@
package cc.carm.lib.configuration.core.builder;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.ValueManifest;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.ValueManifest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
index 81ce353..e7e4367 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/list/SourceListBuilder.java
@@ -2,7 +2,7 @@ package cc.carm.lib.configuration.core.builder.list;
import cc.carm.lib.configuration.core.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.core.function.ConfigDataFunction;
-import cc.carm.lib.configuration.core.value.type.ConfiguredList;
+import cc.carm.lib.configuration.value.standard.ConfiguredList;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java
index e94fdbe..df57cf3 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SectionMapBuilder.java
@@ -3,8 +3,8 @@ package cc.carm.lib.configuration.core.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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.type.ConfiguredSectionMap;
+import cc.carm.lib.configuration.value.ValueManifest;
+import cc.carm.lib.configuration.value.standard.ConfiguredSectionMap;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashMap;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
index 90d6636..034f597 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/map/SourceMapBuilder.java
@@ -2,8 +2,8 @@ package cc.carm.lib.configuration.core.builder.map;
import cc.carm.lib.configuration.core.builder.CommonConfigBuilder;
import cc.carm.lib.configuration.core.function.ConfigDataFunction;
-import cc.carm.lib.configuration.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.type.ConfiguredMap;
+import cc.carm.lib.configuration.value.ValueManifest;
+import cc.carm.lib.configuration.value.standard.ConfiguredMap;
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/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
index ea29928..928860b 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SectionValueBuilder.java
@@ -4,7 +4,7 @@ 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.core.value.type.ConfiguredSection;
+import cc.carm.lib.configuration.value.standard.ConfiguredSection;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
index 203042a..57541fa 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/builder/value/SourceValueBuilder.java
@@ -3,7 +3,7 @@ package cc.carm.lib.configuration.core.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.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import org.jetbrains.annotations.NotNull;
public class SourceValueBuilder extends CommonConfigBuilder> {
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/parser/ValueParser.java b/core/src/main/java/cc/carm/lib/configuration/core/parser/ValueParser.java
deleted file mode 100644
index c65d828..0000000
--- a/core/src/main/java/cc/carm/lib/configuration/core/parser/ValueParser.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package cc.carm.lib.configuration.core.parser;
-
-public class ValueParser {
-}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
index b628326..0252983 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
+++ b/core/src/main/java/cc/carm/lib/configuration/core/source/ConfigurationProvider.java
@@ -2,9 +2,8 @@ package cc.carm.lib.configuration.core.source;
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.Configuration;
-import cc.carm.lib.configuration.core.Configuration;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
+import 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;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/util/MapFactory.java b/core/src/main/java/cc/carm/lib/configuration/core/util/MapFactory.java
deleted file mode 100644
index 7fe98cc..0000000
--- a/core/src/main/java/cc/carm/lib/configuration/core/util/MapFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package cc.carm.lib.configuration.core.util;
-
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class MapFactory, K, V> {
-
- private final S map;
-
- protected MapFactory(S map) {
- this.map = map;
- }
-
- public MapFactory put(K key, V value) {
- this.map.put(key, value);
- return this;
- }
-
- public MapFactory remove(K key) {
- this.map.remove(key);
- return this;
- }
-
- public MapFactory clear() {
- this.map.clear();
- return this;
- }
-
- public S build() {
- return get();
- }
-
- public S get() {
- return map;
- }
-
- public static MapFactory, K, V> hashMap() {
- return new MapFactory<>(new HashMap<>());
- }
-
- public static MapFactory, K, V> hashMap(K firstKey, V firstValue) {
- return MapFactory.hashMap().put(firstKey, firstValue);
- }
-
- public static MapFactory, K, V> linkedMap() {
- return of(new LinkedHashMap<>());
- }
-
- public static MapFactory, K, V> linkedMap(K firstKey, V firstValue) {
- return MapFactory.linkedMap().put(firstKey, firstValue);
- }
-
- public static , V> MapFactory, K, V> treeMap() {
- return of(new TreeMap<>());
- }
-
- public static , V> MapFactory, K, V> treeMap(K firstKey, V firstValue) {
- return MapFactory.treeMap().put(firstKey, firstValue);
- }
-
- public static , K, V> MapFactory of(M map) {
- return new MapFactory<>(map);
- }
-
-}
diff --git a/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java
new file mode 100644
index 0000000..597bbcc
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationBuilder.java
@@ -0,0 +1,15 @@
+package cc.carm.lib.configuration.source;
+
+import cc.carm.lib.configuration.adapter.ValueAdapterRegistry;
+import org.jetbrains.annotations.NotNull;
+
+public abstract class ConfigurationBuilder {
+
+ protected ConfigurationLoader loader;
+ protected ValueAdapterRegistry
processors;
+
+
+
+ public abstract @NotNull ConfigurationProvider build();
+
+}
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
new file mode 100644
index 0000000..79f0a5e
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationLoader.java
@@ -0,0 +1,4 @@
+package cc.carm.lib.configuration.source;
+
+public interface ConfigurationLoader {
+}
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
new file mode 100644
index 0000000..89354f3
--- /dev/null
+++ b/core/src/main/java/cc/carm/lib/configuration/source/ConfigurationProvider.java
@@ -0,0 +1,6 @@
+package cc.carm.lib.configuration.source;
+
+public class ConfigurationProvider {
+
+
+}
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java
similarity index 98%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java
rename to core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java
index f8028ca..8b6ecd7 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/ConfigValue.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/ConfigValue.java
@@ -1,4 +1,4 @@
-package cc.carm.lib.configuration.core.value;
+package cc.carm.lib.configuration.value;
import cc.carm.lib.configuration.core.builder.ConfigBuilder;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/ValueManifest.java b/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java
similarity index 99%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/ValueManifest.java
rename to core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java
index cde0cc2..9dd4888 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/ValueManifest.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/ValueManifest.java
@@ -1,4 +1,4 @@
-package cc.carm.lib.configuration.core.value;
+package cc.carm.lib.configuration.value;
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java
similarity index 88%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java
rename to core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java
index c5fcf0d..92cd162 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/CachedConfigValue.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/impl/CachedConfigValue.java
@@ -1,7 +1,7 @@
-package cc.carm.lib.configuration.core.value.impl;
+package cc.carm.lib.configuration.value.impl;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.ValueManifest;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.ValueManifest;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/ConfigValueMap.java b/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java
similarity index 98%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/impl/ConfigValueMap.java
rename to core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java
index b68304e..f45b057 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/impl/ConfigValueMap.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/impl/ConfigValueMap.java
@@ -1,9 +1,9 @@
-package cc.carm.lib.configuration.core.value.impl;
+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.core.value.ValueManifest;
+import cc.carm.lib.configuration.value.ValueManifest;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java
similarity index 97%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java
rename to core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java
index 567be17..555d4b2 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredList.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredList.java
@@ -1,9 +1,9 @@
-package cc.carm.lib.configuration.core.value.type;
+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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
+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;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java
similarity index 86%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java
rename to core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java
index 75fe74b..5e4c086 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredMap.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredMap.java
@@ -1,9 +1,9 @@
-package cc.carm.lib.configuration.core.value.type;
+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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.ConfigValueMap;
+import cc.carm.lib.configuration.value.ValueManifest;
+import cc.carm.lib.configuration.value.impl.ConfigValueMap;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java
similarity index 94%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java
rename to core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java
index 76d807e..718de8d 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSection.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSection.java
@@ -1,11 +1,11 @@
-package cc.carm.lib.configuration.core.value.type;
+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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
+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;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSectionMap.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java
similarity index 88%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSectionMap.java
rename to core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java
index 9d120e6..4d3a35c 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredSectionMap.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredSectionMap.java
@@ -1,9 +1,9 @@
-package cc.carm.lib.configuration.core.value.type;
+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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.ConfigValueMap;
+import cc.carm.lib.configuration.value.ValueManifest;
+import cc.carm.lib.configuration.value.impl.ConfigValueMap;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
diff --git a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java
similarity index 94%
rename from core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java
rename to core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java
index 6a95b39..6b962f4 100644
--- a/core/src/main/java/cc/carm/lib/configuration/core/value/type/ConfiguredValue.java
+++ b/core/src/main/java/cc/carm/lib/configuration/value/standard/ConfiguredValue.java
@@ -1,10 +1,10 @@
-package cc.carm.lib.configuration.core.value.type;
+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.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
+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;
diff --git a/core/src/test/java/AdaptTest.java b/core/src/test/java/AdaptTest.java
new file mode 100644
index 0000000..6600144
--- /dev/null
+++ b/core/src/test/java/AdaptTest.java
@@ -0,0 +1,31 @@
+import cc.carm.lib.configuration.adapter.ValueAdapterRegistry;
+import cc.carm.lib.configuration.adapter.primitive.NumberAdapter;
+import cc.carm.lib.configuration.source.ConfigurationProvider;
+import org.junit.Test;
+
+import java.time.Duration;
+import java.time.LocalTime;
+
+public class AdaptTest {
+
+ @Test
+ public void test() throws Exception {
+
+ ValueAdapterRegistry> registry = new ValueAdapterRegistry<>(new ConfigurationProvider());
+ registry.register(NumberAdapter.of(Long.class, data -> Long.parseLong(data.toString())));
+ registry.register(NumberAdapter.of(long.class, data -> Long.parseLong(data.toString())));
+ registry.register(Long.class, Duration.class, Duration::ofSeconds, Duration::getSeconds);
+ registry.register(
+ Duration.class, LocalTime.class,
+ duration -> LocalTime.now().plus(duration),
+ data -> Duration.between(data, LocalTime.now())
+ );
+
+ LocalTime v = registry.deserialize(LocalTime.class, "600");
+ Object d = registry.serialize(v);
+
+ System.out.println(v);
+ System.out.println(d);
+ }
+
+}
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 0d93407..5e662ea 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,13 +1,13 @@
package cc.carm.lib.configuration.demo;
-import cc.carm.lib.configuration.core.ConfigurationRoot;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.core.Configuration;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
@HeaderComment({"", "数据库配置", " 用于提供数据库连接,进行数据库操作。"})
-public class DatabaseConfiguration extends ConfigurationRoot {
+public class DatabaseConfiguration implements Configuration {
@ConfigPath("driver")
@HeaderComment({
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 d288459..feef0a4 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
@@ -2,15 +2,14 @@ package cc.carm.lib.configuration.demo.tests.conf;
import cc.carm.lib.configuration.core.ConfigInitializer;
import cc.carm.lib.configuration.core.Configuration;
-import cc.carm.lib.configuration.core.ConfigurationRoot;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.annotation.InlineComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.type.ConfiguredList;
-import cc.carm.lib.configuration.core.value.type.ConfiguredMap;
-import cc.carm.lib.configuration.core.value.type.ConfiguredSection;
-import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.annotation.InlineComment;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredList;
+import cc.carm.lib.configuration.value.standard.ConfiguredMap;
+import cc.carm.lib.configuration.value.standard.ConfiguredSection;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import cc.carm.lib.configuration.demo.tests.model.TestModel;
import java.time.temporal.ChronoUnit;
@@ -56,7 +55,7 @@ public interface DemoConfiguration extends Configuration {
* 支持内部类的直接注册。
* 注意,需要使用 {@link ConfigInitializer#initialize(Class, boolean, boolean)} 方法,并设定第三个参数为 true。
*/
- class Sub extends ConfigurationRoot {
+ class Sub implements Configuration {
@ConfigPath(value = "uuid-value", root = true)
@InlineComment("This is an inline comment")
@@ -65,7 +64,7 @@ public interface DemoConfiguration extends Configuration {
.parseValue((data, defaultValue) -> UUID.fromString(data))
.build();
- public static class That extends ConfigurationRoot {
+ public static class That implements Configuration {
public static final ConfiguredList OPERATORS = ConfiguredList
.builderOf(UUID.class).fromString()
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 e9a3257..c242e4a 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,17 +1,17 @@
package cc.carm.lib.configuration.demo.tests.conf;
-import cc.carm.lib.configuration.core.ConfigurationRoot;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.annotation.InlineComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.type.ConfiguredSection;
-import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.core.Configuration;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.annotation.InlineComment;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredSection;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import cc.carm.lib.configuration.demo.tests.model.TestModel;
import java.util.UUID;
-public class TestConfiguration extends ConfigurationRoot {
+public class TestConfiguration implements Configuration {
public final TestInnerConfiguration INNER = new TestInnerConfiguration();
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 8385a6a..ba61899 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,12 +1,12 @@
package cc.carm.lib.configuration.demo.tests.conf;
-import cc.carm.lib.configuration.core.ConfigurationRoot;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.core.Configuration;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
@HeaderComment("Inner Test")
-public class TestInnerConfiguration extends ConfigurationRoot {
+public class TestInnerConfiguration implements Configuration {
public final ConfigValue INNER_VALUE = ConfiguredValue.of(Double.class, 1.0D);
diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java
index 25179cd..5e16ff3 100644
--- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java
+++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/YAMLValue.java
@@ -1,8 +1,8 @@
package cc.carm.lib.configuration.yaml;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
-import cc.carm.lib.configuration.core.value.ValueManifest;
-import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
+import cc.carm.lib.configuration.value.ValueManifest;
+import cc.carm.lib.configuration.value.impl.CachedConfigValue;
import cc.carm.lib.configuration.yaml.builder.YAMLConfigBuilder;
import org.jetbrains.annotations.NotNull;
diff --git a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java
index 59f5536..454824b 100644
--- a/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java
+++ b/impl/yaml/src/main/java/cc/carm/lib/configuration/yaml/value/ConfiguredSerializable.java
@@ -1,6 +1,6 @@
package cc.carm.lib.configuration.yaml.value;
-import cc.carm.lib.configuration.core.value.ValueManifest;
+import cc.carm.lib.configuration.value.ValueManifest;
import cc.carm.lib.configuration.yaml.YAMLValue;
import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable;
import org.jetbrains.annotations.NotNull;
diff --git a/impl/yaml/src/test/java/config/source/ModelConfiguration.java b/impl/yaml/src/test/java/config/source/ModelConfiguration.java
index 61eab06..021c6a3 100644
--- a/impl/yaml/src/test/java/config/source/ModelConfiguration.java
+++ b/impl/yaml/src/test/java/config/source/ModelConfiguration.java
@@ -1,12 +1,12 @@
package config.source;
-import cc.carm.lib.configuration.core.ConfigurationRoot;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.value.ConfigValue;
-import cc.carm.lib.configuration.core.value.type.ConfiguredList;
-import cc.carm.lib.configuration.core.value.type.ConfiguredMap;
-import cc.carm.lib.configuration.core.value.type.ConfiguredSectionMap;
+import cc.carm.lib.configuration.core.Configuration;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.value.ConfigValue;
+import cc.carm.lib.configuration.value.standard.ConfiguredList;
+import cc.carm.lib.configuration.value.standard.ConfiguredMap;
+import cc.carm.lib.configuration.value.standard.ConfiguredSectionMap;
import cc.carm.lib.configuration.demo.tests.model.AbstractModel;
import cc.carm.lib.configuration.yaml.value.ConfiguredSerializable;
import config.model.AnyModel;
@@ -14,7 +14,7 @@ import config.model.SomeModel;
@HeaderComment("以下内容用于测试序列化")
@ConfigPath("model-test")
-public class ModelConfiguration extends ConfigurationRoot {
+public class ModelConfiguration implements Configuration {
public static final ConfigValue extends AbstractModel> SOME_MODEL = ConfiguredSerializable.of(
SomeModel.class, SomeModel.random()
diff --git a/impl/yaml/src/test/java/sample/SampleConfig.java b/impl/yaml/src/test/java/sample/SampleConfig.java
index 6e32128..7b71a42 100644
--- a/impl/yaml/src/test/java/sample/SampleConfig.java
+++ b/impl/yaml/src/test/java/sample/SampleConfig.java
@@ -1,11 +1,11 @@
package sample;
import cc.carm.lib.configuration.core.Configuration;
-import cc.carm.lib.configuration.core.annotation.ConfigPath;
-import cc.carm.lib.configuration.core.annotation.HeaderComment;
-import cc.carm.lib.configuration.core.annotation.InlineComment;
-import cc.carm.lib.configuration.core.value.type.ConfiguredList;
-import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
+import cc.carm.lib.configuration.annotation.ConfigPath;
+import cc.carm.lib.configuration.annotation.HeaderComment;
+import cc.carm.lib.configuration.annotation.InlineComment;
+import cc.carm.lib.configuration.value.standard.ConfiguredList;
+import cc.carm.lib.configuration.value.standard.ConfiguredValue;
import java.util.UUID;