diff --git a/.wiki b/.wiki index 66ace40..7314c21 160000 --- a/.wiki +++ b/.wiki @@ -1 +1 @@ -Subproject commit 66ace40bbc1cba3d5e4069487888469f89478190 +Subproject commit 7314c2134fa2bd4fce1e04b4bbe61840e9c62fa0 diff --git a/core/pom.xml b/core/pom.xml index 7f8e1cc..14a1add 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 4.0.0 diff --git a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java index 98bf9c5..f64c9df 100644 --- a/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java +++ b/core/src/main/java/cc/carm/lib/configuration/adapter/ValueType.java @@ -20,6 +20,7 @@ import java.util.Objects; */ public abstract class ValueType { + public static final ValueType OBJECT = ofPrimitiveType(Object.class); public static final ValueType STRING = ofPrimitiveType(String.class); public static final ValueType INTEGER = ofPrimitiveType(Integer.class); public static final ValueType INTEGER_TYPE = ofPrimitiveType(int.class); diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java index d1b83f2..e89fa3c 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/impl/AbstractSourceBuilder.java @@ -1,6 +1,8 @@ package cc.carm.lib.configuration.builder.impl; import cc.carm.lib.configuration.adapter.ValueAdapter; +import cc.carm.lib.configuration.adapter.ValueParser; +import cc.carm.lib.configuration.adapter.ValueSerializer; import cc.carm.lib.configuration.adapter.ValueType; import cc.carm.lib.configuration.builder.CommonConfigBuilder; import cc.carm.lib.configuration.function.DataFunction; @@ -15,8 +17,11 @@ public abstract class AbstractSourceBuilder< protected final @NotNull ValueType sourceType; protected final @NotNull ValueType paramType; - protected @NotNull ValueHandler valueParser; - protected @NotNull ValueHandler valueSerializer; + + @SuppressWarnings("NotNullFieldNotInitialized") // Already initialized in constructor + protected @NotNull ValueParser valueParser; + @SuppressWarnings("NotNullFieldNotInitialized") // Already initialized in constructor + protected @NotNull ValueSerializer valueSerializer; protected AbstractSourceBuilder(@NotNull ValueType type, @NotNull ValueType sourceType, @NotNull ValueType paramType, @@ -25,8 +30,8 @@ public abstract class AbstractSourceBuilder< super(type); this.sourceType = sourceType; this.paramType = paramType; - this.valueParser = parser; - this.valueSerializer = serializer; + parse(parser); + serialize(serializer); } public @NotNull SELF parse(@NotNull DataFunction parser) { @@ -34,29 +39,35 @@ public abstract class AbstractSourceBuilder< } public @NotNull SELF parse(@NotNull ValueHandler parser) { + return parser((holder, type, data) -> { + SOURCE source = holder.deserialize(this.sourceType, data); + return parser.handle(holder, source); + }); + } + + public @NotNull SELF parser(@NotNull ValueParser parser) { this.valueParser = parser; return self(); } public @NotNull SELF serialize(@NotNull ValueHandler serializer) { - this.valueSerializer = serializer; - return self(); + return serializer((holder, type, data) -> { + SOURCE source = serializer.handle(holder, data); + return holder.serialize(source); + }); } public @NotNull SELF serialize(@NotNull DataFunction serializer) { return serialize((p, value) -> serializer.handle(value)); } + public @NotNull SELF serializer(@NotNull ValueSerializer serializer) { + this.valueSerializer = serializer; + return self(); + } + protected ValueAdapter buildAdapter() { - return new ValueAdapter<>(this.paramType) - .parser((holder, type, data) -> { - SOURCE source = holder.deserialize(this.sourceType, data); - return this.valueParser.handle(holder, source); - }) - .serializer((holder, type, data) -> { - SOURCE source = this.valueSerializer.handle(holder, data); - return holder.serialize(source); - }); + return new ValueAdapter<>(this.paramType, this.valueSerializer, this.valueParser); } diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java index 5448fde..d19e6f9 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java @@ -26,6 +26,13 @@ public class ConfigListBuilder { ); } + public @NotNull SourceListBuilder fromObject() { + return new SourceListBuilder<>( + ArrayList::new, ValueType.OBJECT, type, + ValueHandler.deserialize(type), ValueHandler.toObject() + ); + } + public @NotNull SourceListBuilder fromString() { return new SourceListBuilder<>( ArrayList::new, ValueType.STRING, type, diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java index 1adb864..51b08db 100644 --- a/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java +++ b/core/src/main/java/cc/carm/lib/configuration/builder/map/ConfigMapBuilder.java @@ -49,6 +49,15 @@ public class ConfigMapBuilder, K, V> { ); } + + public @NotNull SourceMapBuilder fromObject() { + return from( + ValueType.OBJECT, + ValueHandler.deserialize(keyType), ValueHandler.stringValue(), + ValueHandler.deserialize(valueType), ValueHandler.toObject() + ); + } + public @NotNull SourceMapBuilder fromString() { return from( ValueType.STRING, 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 c28dcf0..a013b0a 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 @@ -26,12 +26,12 @@ public class ConfiguredList extends CachedConfigValue, V> implements return new ConfigListBuilder<>(type); } - public static @NotNull SourceListBuilder with(@NotNull Class registeredType) { + public static @NotNull SourceListBuilder with(@NotNull Class registeredType) { return with(ValueType.of(registeredType)); } - public static @NotNull SourceListBuilder with(@NotNull ValueType registeredType) { - return new ConfigListBuilder<>(registeredType).from(registeredType); + public static @NotNull SourceListBuilder with(@NotNull ValueType registeredType) { + return new ConfigListBuilder<>(registeredType).fromObject(); } @SafeVarargs @@ -272,4 +272,4 @@ public class ConfiguredList extends CachedConfigValue, V> implements return resolve().subList(fromIndex, toIndex); } -} \ No newline at end of file +} 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 e3abd62..dc5ec0a 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 @@ -5,6 +5,7 @@ import cc.carm.lib.configuration.adapter.ValueParser; import cc.carm.lib.configuration.adapter.ValueSerializer; import cc.carm.lib.configuration.adapter.ValueType; import cc.carm.lib.configuration.builder.map.ConfigMapCreator; +import cc.carm.lib.configuration.builder.map.SourceMapBuilder; import cc.carm.lib.configuration.source.section.ConfigureSection; import cc.carm.lib.configuration.value.ValueManifest; import cc.carm.lib.configuration.value.impl.CachedConfigValue; @@ -31,6 +32,16 @@ public class ConfiguredMap extends CachedConfigValue, V> impleme return new ConfigMapCreator<>(ValueType.of(keyType), ValueType.of(valueType)); } + public static @NotNull + SourceMapBuilder, Object, K, V> with(@NotNull Class keyType, @NotNull Class valueType) { + return with(ValueType.of(keyType), ValueType.of(valueType)); + } + + public static @NotNull + SourceMapBuilder, Object, K, V> with(@NotNull ValueType keyType, @NotNull ValueType valueType) { + return new ConfigMapCreator<>(keyType, valueType).asLinkedMap().fromObject(); + } + public static ConfiguredMap of(@NotNull Supplier> constructor, @NotNull ValueAdapter keyAdapter, @NotNull ValueAdapter valueAdapter) { return new ConfiguredMap<>(new ValueManifest<>(new ValueType>() { diff --git a/demo/pom.xml b/demo/pom.xml index 8f8ab0a..ec7b369 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 4.0.0 diff --git a/features/commentable/pom.xml b/features/commentable/pom.xml index 1f82971..34f1f74 100644 --- a/features/commentable/pom.xml +++ b/features/commentable/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/file/pom.xml b/features/file/pom.xml index 5f09849..3480fd5 100644 --- a/features/file/pom.xml +++ b/features/file/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/kotlin/pom.xml b/features/kotlin/pom.xml index fad424f..c46ab5a 100644 --- a/features/kotlin/pom.xml +++ b/features/kotlin/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/record/pom.xml b/features/record/pom.xml index 210658f..660429d 100644 --- a/features/record/pom.xml +++ b/features/record/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/record/src/test/java/RecordTest.java b/features/record/src/test/java/RecordTest.java index 74c15f6..c178e85 100644 --- a/features/record/src/test/java/RecordTest.java +++ b/features/record/src/test/java/RecordTest.java @@ -2,6 +2,8 @@ import cc.carm.lib.configuration.Configuration; import cc.carm.lib.configuration.annotation.ConfigPath; import cc.carm.lib.configuration.source.ConfigurationHolder; import cc.carm.lib.configuration.source.temp.TempConfigFactory; +import cc.carm.lib.configuration.value.standard.ConfiguredList; +import cc.carm.lib.configuration.value.standard.ConfiguredMap; import cc.carm.lib.configuration.value.standard.ConfiguredValue; import cc.carm.lib.configured.adapter.record.RecordAdapter; import org.jetbrains.annotations.Nullable; @@ -32,6 +34,18 @@ public class RecordTest { ) )); + ConfiguredMap DEVICES = ConfiguredMap.builderOf(Device.class) + .asHashMap().fromObject() + .defaults(m -> { + Device d = randomDevice(); + m.put(d.id, d); + }) + .build(); + + ConfiguredList DEVICE_LIST = ConfiguredList.with(Device.class) + .defaults(Arrays.asList(randomDevice(), randomDevice())) + .build(); + } @ConfigPath(root = true) @@ -58,6 +72,15 @@ public class RecordTest { printMap(holder.config().asMap(), 0); + ConfigA.DEVICES.forEach((k, v) -> { + System.out.println("Device Key: " + k + ", ID: " + v.id + ", Name: " + v.name); + }); + + ConfigA.DEVICE_LIST.forEach((v) -> { + System.out.println("Device ID: " + v.id + ", Name: " + v.name); + }); + + // try { // List parsed = holder.deserialize(ValueType.ofList(User.class), holder.config().getList("val.users")); // System.out.println("Parsed Users: " + parsed); @@ -101,6 +124,23 @@ public class RecordTest { record Chip(String id, @Nullable String serialNumber) { } + public static Device randomDevice() { + return new Device( + "device-" + UUID.randomUUID(), + "Device " + (int) (Math.random() * 100), + UUID.randomUUID(), + new Chip("chip-" + UUID.randomUUID(), "SN" + (int) (Math.random() * 10000)), + Arrays.asList( + new User("User" + (int) (Math.random() * 100), (int) (Math.random() * 50 + 10)), + new User("User" + (int) (Math.random() * 100), (int) (Math.random() * 50 + 10)) + ), + Map.of( + "Cloud", new Connection("cloud.example.com", 443), + "Local", new Connection("192.168.1." + (int) (Math.random() * 255), 8080) + ) + ); + } + static void printMap(Map map, int indent) { String indentStr = " ".repeat(indent); diff --git a/features/section/pom.xml b/features/section/pom.xml index 308f006..a484781 100644 --- a/features/section/pom.xml +++ b/features/section/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/text/pom.xml b/features/text/pom.xml index eaff4d8..0916d1f 100644 --- a/features/text/pom.xml +++ b/features/text/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/validators/pom.xml b/features/validators/pom.xml index 1c26999..5d5d647 100644 --- a/features/validators/pom.xml +++ b/features/validators/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/features/versioned/pom.xml b/features/versioned/pom.xml index c2d97e1..30a1906 100644 --- a/features/versioned/pom.xml +++ b/features/versioned/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/pom.xml b/pom.xml index 778a200..65332af 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ cc.carm.lib configured-parent pom - 4.1.7 + 4.1.8 core features/section diff --git a/providers/gson/pom.xml b/providers/gson/pom.xml index f4f8282..d02e607 100644 --- a/providers/gson/pom.xml +++ b/providers/gson/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 ../../pom.xml 4.0.0 diff --git a/providers/hocon/pom.xml b/providers/hocon/pom.xml index efd16b3..76016af 100644 --- a/providers/hocon/pom.xml +++ b/providers/hocon/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/providers/mongodb/pom.xml b/providers/mongodb/pom.xml index be59e4c..6dba51f 100644 --- a/providers/mongodb/pom.xml +++ b/providers/mongodb/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 ../../pom.xml 4.0.0 diff --git a/providers/sql/pom.xml b/providers/sql/pom.xml index 12a6205..94eac1a 100644 --- a/providers/sql/pom.xml +++ b/providers/sql/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/providers/temp/pom.xml b/providers/temp/pom.xml index df33a5f..279ff3b 100644 --- a/providers/temp/pom.xml +++ b/providers/temp/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 ../../pom.xml diff --git a/providers/yaml/pom.xml b/providers/yaml/pom.xml index e772f8c..4aafadf 100644 --- a/providers/yaml/pom.xml +++ b/providers/yaml/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.7 + 4.1.8 ../../pom.xml