1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2026-06-04 10:38:19 +08:00

refactor(collection): Refactor builders of collection types (including List and Set).

This commit is contained in:
2025-09-27 02:09:42 +08:00
parent c86985017f
commit b17c157e18
30 changed files with 728 additions and 387 deletions
+64
View File
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
<maven.compiler.source>${project.jdk.version}</maven.compiler.source>
<maven.compiler.target>${project.jdk.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<artifactId>configured-feature-collections</artifactId>
<packaging>jar</packaging>
<name>Configured - Collections Feature</name>
<url>https://github.com/CarmJos/configured</url>
<description>Provides more collection type support for the Configured framework.</description>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>configured-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>configured-gson</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,96 @@
package cc.carm.lib.configuration.builder.set;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.collection.SectionCollectionBuilder;
import cc.carm.lib.configuration.builder.collection.SourceCollectionBuilder;
import cc.carm.lib.configuration.function.ValueHandler;
import cc.carm.lib.configuration.source.section.ConfigureSection;
import cc.carm.lib.configuration.value.collections.ConfiguredSet;
import org.jetbrains.annotations.NotNull;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
public class ConfigSetBuilder<V> {
protected final @NotNull ValueType<V> type;
public ConfigSetBuilder(@NotNull ValueType<V> type) {
this.type = type;
}
public <S> @NotNull SourceBuilder<S, V> from(@NotNull Class<S> sourceType) {
return from(ValueType.of(sourceType));
}
public <S> @NotNull SourceBuilder<S, V> from(@NotNull ValueType<S> sourceType) {
return new SourceBuilder<>(
sourceType, type,
ValueHandler.required(type),
ValueHandler.required(sourceType)
);
}
public @NotNull ConfigSetBuilder.SourceBuilder<Object, V> fromObject() {
return new SourceBuilder<>(
ValueType.OBJECT, type,
ValueHandler.deserialize(type), ValueHandler.toObject()
);
}
public @NotNull ConfigSetBuilder.SourceBuilder<String, V> fromString() {
return new SourceBuilder<>(
ValueType.STRING, type,
ValueHandler.required(type), ValueHandler.stringValue()
);
}
public @NotNull ConfigSetBuilder.SectionBuilder<V> fromSection() {
return new SectionBuilder<>(type, ValueHandler.required(type), ValueHandler.required());
}
public static class SourceBuilder<SOURCE, V> extends SourceCollectionBuilder<SOURCE, V, Set<V>, ConfiguredSet<V>, SourceBuilder<SOURCE, V>> {
public SourceBuilder(@NotNull ValueType<SOURCE> sourceType,
@NotNull ValueType<V> paramType,
@NotNull ValueHandler<SOURCE, V> parser,
@NotNull ValueHandler<V, SOURCE> serializer) {
super(LinkedHashSet::new, sourceType, paramType, parser, serializer);
}
@Override
protected @NotNull ConfigSetBuilder.SourceBuilder<SOURCE, V> self() {
return this;
}
@Override
public @NotNull ConfiguredSet<V> build() {
return new ConfiguredSet<>(buildManifest(), constructor, buildAdapter());
}
}
public static class SectionBuilder<V> extends SectionCollectionBuilder<V, Set<V>, ConfiguredSet<V>, SectionBuilder<V>> {
public SectionBuilder(@NotNull ValueType<V> paramType,
@NotNull ValueHandler<ConfigureSection, V> parser,
@NotNull ValueHandler<V, ? extends Map<String, Object>> serializer) {
super(LinkedHashSet::new, paramType, parser, serializer);
}
@Override
protected @NotNull ConfigSetBuilder.SectionBuilder<V> self() {
return this;
}
@Override
public @NotNull ConfiguredSet<V> build() {
return new ConfiguredSet<>(buildManifest(), constructor, buildAdapter());
}
}
}
@@ -0,0 +1,52 @@
package cc.carm.lib.configuration.value.collections;
import cc.carm.lib.configuration.adapter.ValueAdapter;
import cc.carm.lib.configuration.adapter.ValueType;
import cc.carm.lib.configuration.builder.set.ConfigSetBuilder;
import cc.carm.lib.configuration.value.ValueManifest;
import cc.carm.lib.configuration.value.impl.CollectionConfigValue;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.Supplier;
public class ConfiguredSet<V> extends CollectionConfigValue<V, Set<V>, ConfiguredSet<V>> implements Set<V> {
public static <T> @NotNull ConfigSetBuilder<T> builderOf(@NotNull Class<T> type) {
return builderOf(ValueType.of(type));
}
public static <T> @NotNull ConfigSetBuilder<T> builderOf(@NotNull ValueType<T> type) {
return new ConfigSetBuilder<>(type);
}
public static <T> @NotNull ConfigSetBuilder.SourceBuilder<Object, T> with(@NotNull Class<T> registeredType) {
return with(ValueType.of(registeredType));
}
public static <T> @NotNull ConfigSetBuilder.SourceBuilder<Object, T> with(@NotNull ValueType<T> registeredType) {
return builderOf(registeredType).fromObject();
}
@SafeVarargs
public static <T> @NotNull ConfiguredSet<T> of(@NotNull T value, @NotNull T... values) {
Set<T> list = new LinkedHashSet<>();
list.add(value);
Collections.addAll(list, values);
return with(ValueType.of(value)).defaults(list).build();
}
public ConfiguredSet(@NotNull ValueManifest<Set<V>, V> manifest,
@NotNull Supplier<? extends Set<V>> constructor,
@NotNull ValueAdapter<V> paramAdapter) {
super(manifest, constructor, paramAdapter);
}
@Override
public @NotNull ConfiguredSet<V> self() {
return this;
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
@@ -1,29 +1,30 @@
package cc.carm.lib.configuration.kotlin.value
import cc.carm.lib.configuration.adapter.ValueType
import cc.carm.lib.configuration.builder.list.SourceListBuilder
import cc.carm.lib.configuration.builder.collection.SimpleCollectionCreator
import cc.carm.lib.configuration.value.standard.ConfiguredList
import kotlin.reflect.KClass
inline fun <S : Any, reified V> listFrom(
clazz: KClass<S>, block: (SourceListBuilder<S, V>.() -> Unit)
clazz: KClass<S>, block: (SimpleCollectionCreator.Source<S, V, List<V>, ConfiguredList<V>>.() -> Unit)
): ConfiguredList<V> {
return listFrom(clazz.java, block)
}
inline fun <S : Any, reified V> listFrom(
clazz: Class<S>, block: (SourceListBuilder<S, V>.() -> Unit)
clazz: Class<S>, block: (SimpleCollectionCreator.Source<S, V, List<V>, ConfiguredList<V>>.() -> Unit)
): ConfiguredList<V> {
return listFrom(ValueType.of(clazz), block)
}
inline fun <S : Any, reified V> listFrom(
valueType: ValueType<S>, block: (SourceListBuilder<S, V>.() -> Unit)
valueType: ValueType<S>, block: (SimpleCollectionCreator.Source<S, V, List<V>, ConfiguredList<V>>.() -> Unit)
): ConfiguredList<V> {
val configBuilder = ConfiguredList.builderOf(V::class.java)
val sourceValueBuilder: SourceListBuilder<S, V> = if (valueType.rawType == String::class.java) {
@Suppress("UNCHECKED_CAST")
configBuilder.fromString() as SourceListBuilder<S, V>
} else configBuilder.from(valueType)
val sourceValueBuilder: SimpleCollectionCreator.Source<S, V, List<V>, ConfiguredList<V>> =
if (valueType.rawType == String::class.java) {
@Suppress("UNCHECKED_CAST")
configBuilder.fromString() as SimpleCollectionCreator.Source<S, V, List<V>, ConfiguredList<V>>
} else configBuilder.from(valueType)
return sourceValueBuilder.also(block).build()
}
}
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>
+1 -1
View File
@@ -6,7 +6,7 @@
<parent>
<groupId>cc.carm.lib</groupId>
<artifactId>configured-parent</artifactId>
<version>4.1.8</version>
<version>4.2.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<properties>