diff --git a/core/pom.xml b/core/pom.xml index 14a1add..dda1d65 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 4.0.0 diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/collection/SectionCollectionBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SectionCollectionBuilder.java new file mode 100644 index 0000000..dc029d5 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SectionCollectionBuilder.java @@ -0,0 +1,55 @@ +package cc.carm.lib.configuration.builder.collection; + +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder; +import cc.carm.lib.configuration.function.ValueHandler; +import cc.carm.lib.configuration.source.section.ConfigureSection; +import cc.carm.lib.configuration.value.impl.CollectionConfigValue; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public abstract class SectionCollectionBuilder< + V, C extends Collection, + RESULT extends CollectionConfigValue, + SELF extends SectionCollectionBuilder + > extends AbstractSectionBuilder { + + protected @NotNull Supplier constructor; + + public SectionCollectionBuilder(@NotNull Supplier constructor, + @NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler> serializer) { + super(new ValueType() { + }, paramType, parser, serializer); + this.constructor = constructor; + } + + @SafeVarargs + public final @NotNull SELF defaults(@NotNull V... values) { + return defaults(c -> c.addAll(Arrays.asList(values))); + } + + public final @NotNull SELF defaults(@NotNull Consumer constructor) { + return defaults(() -> { + C collection = this.constructor.get(); + constructor.accept(collection); + return collection; + }); + } + + public SELF constructor(@NotNull Supplier constructor) { + this.constructor = constructor; + return self(); + } + + public SELF construct(@NotNull C collection) { + return constructor(() -> collection); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/collection/SimpleCollectionCreator.java b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SimpleCollectionCreator.java new file mode 100644 index 0000000..cab84c1 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SimpleCollectionCreator.java @@ -0,0 +1,138 @@ +package cc.carm.lib.configuration.builder.collection; + +import cc.carm.lib.configuration.adapter.ValueAdapter; +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.function.ValueHandler; +import cc.carm.lib.configuration.source.section.ConfigureSection; +import cc.carm.lib.configuration.value.ValueManifest; +import cc.carm.lib.configuration.value.impl.CollectionConfigValue; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Map; +import java.util.function.Supplier; + +public class SimpleCollectionCreator, RESULT extends CollectionConfigValue> { + + public static , RESULT extends CollectionConfigValue> + @NotNull SimpleCollectionCreator create( + @NotNull ValueType type, + @NotNull Supplier defaultConstructor, + @NotNull CollectionValueFactory factory) { + return new SimpleCollectionCreator<>(type, defaultConstructor, factory); + } + + protected final @NotNull Supplier defaultConstructor; + protected final @NotNull ValueType type; + + protected final @NotNull CollectionValueFactory factory; + + public SimpleCollectionCreator(@NotNull ValueType type, + @NotNull Supplier defaultConstructor, + @NotNull CollectionValueFactory factory) { + this.defaultConstructor = defaultConstructor; + this.type = type; + this.factory = factory; + } + + public @NotNull Source from(@NotNull Class sourceType) { + return from(ValueType.of(sourceType)); + } + + public @NotNull Source from(@NotNull ValueType sourceType) { + return new Source( + defaultConstructor, sourceType, type, + ValueHandler.required(type), + ValueHandler.required(sourceType), + factory + ); + } + + public @NotNull SimpleCollectionCreator.Source fromObject() { + return new Source( + defaultConstructor, ValueType.OBJECT, type, + ValueHandler.deserialize(type), ValueHandler.toObject(), + factory + ); + } + + public @NotNull SimpleCollectionCreator.Source fromString() { + return new Source( + defaultConstructor, ValueType.STRING, type, + ValueHandler.required(type), ValueHandler.stringValue(), + factory + ); + } + + public @NotNull SimpleCollectionCreator.Section fromSection() { + return new Section( + defaultConstructor, type, + ValueHandler.required(type), ValueHandler.required(), + factory + ); + } + + @FunctionalInterface + public interface CollectionValueFactory { + @NotNull RESULT build( + @NotNull ValueManifest manifest, + @NotNull Supplier constructor, + @NotNull ValueAdapter paramAdapter + ); + } + + public static class Source, RESULT extends CollectionConfigValue> + extends SourceCollectionBuilder> { + + protected final @NotNull CollectionValueFactory factory; + + public Source( + @NotNull Supplier constructor, + @NotNull ValueType sourceType, + @NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler serializer, + @NotNull CollectionValueFactory factory) { + super(constructor, sourceType, paramType, parser, serializer); + this.factory = factory; + } + + @Override + protected @NotNull SimpleCollectionCreator.Source self() { + return this; + } + + @Override + public @NotNull RESULT build() { + return factory.build(buildManifest(), constructor, buildAdapter()); + } + + } + + public static class Section, RESULT extends CollectionConfigValue> + extends SectionCollectionBuilder> { + protected final @NotNull CollectionValueFactory factory; + + public Section( + @NotNull Supplier constructor, + @NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler> serializer, + @NotNull CollectionValueFactory factory) { + super(constructor, paramType, parser, serializer); + this.factory = factory; + } + + @Override + protected @NotNull SimpleCollectionCreator.Section self() { + return this; + } + + @Override + public @NotNull RESULT build() { + return factory.build(buildManifest(), constructor, buildAdapter()); + } + } + + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/collection/SourceCollectionBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SourceCollectionBuilder.java new file mode 100644 index 0000000..90ec87c --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/collection/SourceCollectionBuilder.java @@ -0,0 +1,53 @@ +package cc.carm.lib.configuration.builder.collection; + +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.impl.AbstractSourceBuilder; +import cc.carm.lib.configuration.function.ValueHandler; +import cc.carm.lib.configuration.value.impl.CollectionConfigValue; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Collection; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public abstract class SourceCollectionBuilder< + SOURCE, V, C extends Collection, + RESULT extends CollectionConfigValue, + SELF extends SourceCollectionBuilder + > + extends AbstractSourceBuilder { + + protected @NotNull Supplier constructor; + + public SourceCollectionBuilder(@NotNull Supplier constructor, + @NotNull ValueType sourceType, @NotNull ValueType paramType, + @NotNull ValueHandler parser, @NotNull ValueHandler serializer) { + super(new ValueType() { + }, sourceType, paramType, parser, serializer); + this.constructor = constructor; + } + + @SafeVarargs + public final @NotNull SELF defaults(@NotNull V... values) { + return defaults(c -> c.addAll(Arrays.asList(values))); + } + + public final @NotNull SELF defaults(@NotNull Consumer constructor) { + return defaults(() -> { + C collection = this.constructor.get(); + constructor.accept(collection); + return collection; + }); + } + + public SELF constructor(@NotNull Supplier constructor) { + this.constructor = constructor; + return self(); + } + + public SELF construct(@NotNull C collection) { + return constructor(() -> collection); + } + +} 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 deleted file mode 100644 index d19e6f9..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListBuilder.java +++ /dev/null @@ -1,51 +0,0 @@ -package cc.carm.lib.configuration.builder.list; - -import cc.carm.lib.configuration.adapter.ValueType; -import cc.carm.lib.configuration.function.ValueHandler; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; - -public class ConfigListBuilder { - - protected final @NotNull ValueType type; - - public ConfigListBuilder(@NotNull ValueType type) { - this.type = type; - } - - public @NotNull SourceListBuilder from(@NotNull Class sourceType) { - return from(ValueType.of(sourceType)); - } - - public @NotNull SourceListBuilder from(@NotNull ValueType sourceType) { - return new SourceListBuilder<>( - ArrayList::new, sourceType, type, - ValueHandler.required(type), - ValueHandler.required(sourceType) - ); - } - - 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, - ValueHandler.required(type), ValueHandler.stringValue() - ); - } - - public @NotNull SectionListBuilder fromSection() { - return new SectionListBuilder<>( - ArrayList::new, type, - ValueHandler.required(type), ValueHandler.required() - ); - } - - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListCreator.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListCreator.java new file mode 100644 index 0000000..753c7d7 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/builder/list/ConfigListCreator.java @@ -0,0 +1,17 @@ +package cc.carm.lib.configuration.builder.list; + +import cc.carm.lib.configuration.adapter.ValueType; +import cc.carm.lib.configuration.builder.collection.SimpleCollectionCreator; +import cc.carm.lib.configuration.value.standard.ConfiguredList; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class ConfigListCreator extends SimpleCollectionCreator, ConfiguredList> { + + public ConfigListCreator(@NotNull ValueType type) { + super(type, ArrayList::new, ConfiguredList::new); + } + +} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java deleted file mode 100644 index 77b665d..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/SectionListBuilder.java +++ /dev/null @@ -1,63 +0,0 @@ -package cc.carm.lib.configuration.builder.list; - -import cc.carm.lib.configuration.adapter.ValueType; -import cc.carm.lib.configuration.builder.impl.AbstractSectionBuilder; -import cc.carm.lib.configuration.function.ValueHandler; -import cc.carm.lib.configuration.source.section.ConfigureSection; -import cc.carm.lib.configuration.value.standard.ConfiguredList; -import org.jetbrains.annotations.NotNull; - -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class SectionListBuilder - extends AbstractSectionBuilder, V, ConfiguredList, SectionListBuilder> { - - protected @NotNull Supplier> constructor; - - public SectionListBuilder(@NotNull Supplier> constructor, - @NotNull ValueType paramType, - @NotNull ValueHandler parser, - @NotNull ValueHandler> serializer) { - super(new ValueType>() { - }, paramType, parser, serializer); - this.constructor = constructor; - } - - @SafeVarargs - public final @NotNull SectionListBuilder defaults(@NotNull V... values) { - return defaults(new ArrayList<>(Arrays.asList(values))); - } - - public final @NotNull SectionListBuilder defaults(@NotNull Collection values) { - return defaults(new ArrayList<>(values)); - } - - public final @NotNull SectionListBuilder defaults(@NotNull Consumer> constructor) { - return defaults(() -> { - List list = new ArrayList<>(); - constructor.accept(list); - return list; - }); - } - - public SectionListBuilder constructor(@NotNull Supplier> constructor) { - this.constructor = constructor; - return this; - } - - public > SectionListBuilder construct(@NotNull LIST list) { - return constructor(() -> list); - } - - @Override - protected @NotNull SectionListBuilder self() { - return this; - } - - @Override - public @NotNull ConfiguredList build() { - return new ConfiguredList<>(buildManifest(), constructor, buildAdapter()); - } -} diff --git a/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java b/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java deleted file mode 100644 index 34a0b8b..0000000 --- a/core/src/main/java/cc/carm/lib/configuration/builder/list/SourceListBuilder.java +++ /dev/null @@ -1,65 +0,0 @@ -package cc.carm.lib.configuration.builder.list; - -import cc.carm.lib.configuration.adapter.ValueType; -import cc.carm.lib.configuration.builder.impl.AbstractSourceBuilder; -import cc.carm.lib.configuration.function.ValueHandler; -import cc.carm.lib.configuration.value.standard.ConfiguredList; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Supplier; - -public class SourceListBuilder - extends AbstractSourceBuilder, SOURCE, V, ConfiguredList, SourceListBuilder> { - - protected @NotNull Supplier> constructor; - - public SourceListBuilder(@NotNull Supplier> constructor, - @NotNull ValueType sourceType, @NotNull ValueType paramType, - @NotNull ValueHandler parser, @NotNull ValueHandler serializer) { - super(new ValueType>() { - }, sourceType, paramType, parser, serializer); - this.constructor = constructor; - } - - @SafeVarargs - public final @NotNull SourceListBuilder defaults(@NotNull V... values) { - return defaults(new ArrayList<>(Arrays.asList(values))); - } - - public final @NotNull SourceListBuilder defaults(@NotNull Collection values) { - return defaults(new ArrayList<>(values)); - } - - public final @NotNull SourceListBuilder defaults(@NotNull Consumer> constructor) { - return defaults(() -> { - List list = new ArrayList<>(); - constructor.accept(list); - return list; - }); - } - - public SourceListBuilder constructor(@NotNull Supplier> constructor) { - this.constructor = constructor; - return this; - } - - public > SourceListBuilder construct(@NotNull LIST list) { - return constructor(() -> list); - } - - @Override - protected @NotNull SourceListBuilder self() { - return this; - } - - @Override - public @NotNull ConfiguredList build() { - return new ConfiguredList<>(buildManifest(), this.constructor, buildAdapter()); - } - -} diff --git a/core/src/main/java/cc/carm/lib/configuration/value/impl/CollectionConfigValue.java b/core/src/main/java/cc/carm/lib/configuration/value/impl/CollectionConfigValue.java new file mode 100644 index 0000000..fe778f3 --- /dev/null +++ b/core/src/main/java/cc/carm/lib/configuration/value/impl/CollectionConfigValue.java @@ -0,0 +1,210 @@ +package cc.carm.lib.configuration.value.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.value.ValueManifest; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * Base implementation of a collection config value, like {@link List} or {@link Set}. + * + * @param Value type + * @param Collection type + * @param Self reference type (used for internal call or recursive generics) + */ +public abstract class CollectionConfigValue< + V, C extends Collection, + SELF extends CollectionConfigValue + > extends CachedConfigValue implements Collection { + + protected final @NotNull Supplier constructor; + protected final @NotNull ValueAdapter paramAdapter; + + public CollectionConfigValue(@NotNull ValueManifest manifest, + @NotNull Supplier constructor, + @NotNull ValueAdapter paramAdapter) { + super(manifest); + this.constructor = constructor; + this.paramAdapter = paramAdapter; + } + + /** + * @return Adapter of this value. + */ + public @NotNull ValueAdapter adapter() { + return this.paramAdapter; + } + + public @NotNull ValueType paramType() { + return adapter().type(); + } + + /** + * @return Value's parser, parse base object to value. + */ + public @Nullable ValueParser parser() { + return parserFor(adapter()); + } + + /** + * @return Value's serializer, parse value to base object. + */ + public @Nullable ValueSerializer serializer() { + return serializerFor(adapter()); + } + + private @NotNull C createCollection() { + return constructor.get(); + } + + @Override + public @NotNull C get() { + if (!cacheExpired()) return getCachedOrDefault(createCollection()); + // Data that is outdated and needs to be parsed again. + C set = createCollection(); + try { + List data = config().contains(path()) ? config().getList(path()) : null; + if (data == null) return getDefaultFirst(set); + + ValueParser parser = parser(); + if (parser == null) return getDefaultFirst(set); + + int i = 0; + for (Object dataVal : data) { + if (dataVal == null) continue; + try { + set.add(withValidated(parser.parse(holder(), paramType(), dataVal))); + } catch (Exception e) { + throwing(path + "[" + i + "]", e); + } + } + } catch (Exception ex) { + throwing(ex); + } + return updateCache(set); + } + + @Override + public void set(@Nullable C collection) { + updateCache(collection); + if (collection == null) { + setData(null); + return; + } + + ValueSerializer serializer = serializer(); + if (serializer == null) return; + + List data = new ArrayList<>(); + for (V val : collection) { + if (val == null) continue; + try { + data.add(serializer.serialize(holder(), paramType(), withValidated(val))); + } catch (Exception ex) { + throwing(ex); + } + } + setData(data); + } + + public @NotNull C copy() { + C other = createCollection(); + other.addAll(resolve()); + return other; + } + + public abstract @NotNull SELF self(); + + public @NotNull T handle(Function function) { + C list = resolve(); + T result = function.apply(list); + set(list); + return result; + } + + public @NotNull SELF modify(Consumer consumer) { + C list = resolve(); + consumer.accept(list); + set(list); + return self(); + } + + @Override + public int size() { + return resolve().size(); + } + + @Override + public boolean isEmpty() { + return resolve().isEmpty(); + } + + @Override + public boolean contains(Object o) { + return resolve().contains(o); + } + + @NotNull + @Override + public Iterator iterator() { + return resolve().iterator(); + } + + @NotNull + @Override + public Object @NotNull [] toArray() { + return resolve().toArray(); + } + + @NotNull + @Override + public T @NotNull [] toArray(@NotNull T[] a) { + return resolve().toArray(a); + } + + @Override + public boolean containsAll(@NotNull Collection c) { + return new HashSet<>(resolve()).containsAll(c); + } + + @Override + public boolean add(V v) { + handle(list -> list.add(v)); + return true; + } + + + @Override + public boolean addAll(@NotNull Collection c) { + return handle(list -> list.addAll(c)); + } + + @Override + public boolean remove(Object o) { + return handle(list -> list.remove(o)); + } + + @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(Collection::clear); + } + +} 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 a013b0a..aa75ce3 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,37 +1,33 @@ package cc.carm.lib.configuration.value.standard; 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.list.ConfigListBuilder; -import cc.carm.lib.configuration.builder.list.SourceListBuilder; +import cc.carm.lib.configuration.builder.collection.SimpleCollectionCreator; +import cc.carm.lib.configuration.builder.list.ConfigListCreator; import cc.carm.lib.configuration.value.ValueManifest; -import cc.carm.lib.configuration.value.impl.CachedConfigValue; +import cc.carm.lib.configuration.value.impl.CollectionConfigValue; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; -public class ConfiguredList extends CachedConfigValue, V> implements List { +public class ConfiguredList extends CollectionConfigValue, ConfiguredList> implements List { - public static @NotNull ConfigListBuilder builderOf(@NotNull Class type) { + public static @NotNull ConfigListCreator builderOf(@NotNull Class type) { return builderOf(ValueType.of(type)); } - public static @NotNull ConfigListBuilder builderOf(@NotNull ValueType type) { - return new ConfigListBuilder<>(type); + public static @NotNull ConfigListCreator builderOf(@NotNull ValueType type) { + return new ConfigListCreator<>(type); } - public static @NotNull SourceListBuilder with(@NotNull Class registeredType) { + public static + @NotNull SimpleCollectionCreator.Source, ConfiguredList> with(@NotNull Class registeredType) { return with(ValueType.of(registeredType)); } - public static @NotNull SourceListBuilder with(@NotNull ValueType registeredType) { - return new ConfigListBuilder<>(registeredType).fromObject(); + public static @NotNull SimpleCollectionCreator.Source, ConfiguredList> with(@NotNull ValueType registeredType) { + return builderOf(registeredType).fromObject(); } @SafeVarargs @@ -42,94 +38,10 @@ public class ConfiguredList extends CachedConfigValue, V> implements return with(ValueType.of(value)).defaults(list).build(); } - protected final @NotNull Supplier> constructor; - protected final @NotNull ValueAdapter paramAdapter; - public ConfiguredList(@NotNull ValueManifest, V> manifest, @NotNull Supplier> constructor, @NotNull ValueAdapter paramAdapter) { - super(manifest); - this.constructor = constructor; - this.paramAdapter = paramAdapter; - } - - /** - * @return Adapter of this value. - */ - public @NotNull ValueAdapter adapter() { - return this.paramAdapter; - } - - public @NotNull ValueType paramType() { - return adapter().type(); - } - - /** - * @return Value's parser, parse base object to value. - */ - public @Nullable ValueParser parser() { - return parserFor(adapter()); - } - - /** - * @return Value's serializer, parse value to base object. - */ - public @Nullable ValueSerializer serializer() { - return serializerFor(adapter()); - } - - private @NotNull List createList() { - return constructor.get(); - } - - @Override - public @NotNull List get() { - if (!cacheExpired()) return getCachedOrDefault(createList()); - // Data that is outdated and needs to be parsed again. - List list = createList(); - try { - List data = config().contains(path()) ? config().getList(path()) : null; - if (data == null) return getDefaultFirst(list); - - ValueParser parser = parser(); - if (parser == null) return getDefaultFirst(list); - - int i = 0; - for (Object dataVal : data) { - if (dataVal == null) continue; - try { - list.add(withValidated(parser.parse(holder(), paramType(), dataVal))); - } catch (Exception e) { - throwing(path + "[" + i + "]", e); - } - } - } catch (Exception ex) { - throwing(ex); - } - return updateCache(list); - } - - @Override - public void set(@Nullable List list) { - updateCache(list); - if (list == null) { - setData(null); - return; - } - - ValueSerializer serializer = serializer(); - if (serializer == null) return; - - List data = new ArrayList<>(); - for (V val : list) { - if (val == null) continue; - try { - data.add(serializer.serialize(holder(), paramType(), withValidated(val))); - } catch (Exception ex) { - throwing(ex); - } - } - setData(data); + super(manifest, constructor, paramAdapter); } @Override @@ -137,21 +49,8 @@ public class ConfiguredList extends CachedConfigValue, V> implements return resolve().get(index); } - public @NotNull List copy() { - return new ArrayList<>(resolve()); - } - - public @NotNull T handle(Function, T> function) { - List list = resolve(); - T result = function.apply(list); - set(list); - return result; - } - - public @NotNull ConfiguredList modify(Consumer> consumer) { - List list = resolve(); - consumer.accept(list); - set(list); + @Override + public @NotNull ConfiguredList self() { return this; } @@ -160,89 +59,22 @@ public class ConfiguredList extends CachedConfigValue, V> implements return handle(list -> list.set(index, element)); } - @Override - public int size() { - return resolve().size(); - } - - @Override - public boolean isEmpty() { - return resolve().isEmpty(); - } - - @Override - public boolean contains(Object o) { - return resolve().contains(o); - } - - @NotNull - @Override - public Iterator iterator() { - return resolve().iterator(); - } - - @NotNull - @Override - public Object @NotNull [] toArray() { - return resolve().toArray(); - } - - @NotNull - @Override - public T @NotNull [] toArray(@NotNull T[] a) { - return resolve().toArray(a); - } - - @Override - public boolean containsAll(@NotNull Collection c) { - return new HashSet<>(resolve()).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) { @@ -272,4 +104,5 @@ public class ConfiguredList extends CachedConfigValue, V> implements return resolve().subList(fromIndex, toIndex); } + } diff --git a/demo/pom.xml b/demo/pom.xml index ec7b369..9027641 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 4.0.0 diff --git a/features/collections/pom.xml b/features/collections/pom.xml new file mode 100644 index 0000000..3ca6f3f --- /dev/null +++ b/features/collections/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + cc.carm.lib + configured-parent + 4.2.0 + ../../pom.xml + + + ${project.jdk.version} + ${project.jdk.version} + UTF-8 + UTF-8 + + + configured-feature-collections + jar + + Configured - Collections Feature + https://github.com/CarmJos/configured + Provides more collection type support for the Configured framework. + + + + + ${project.groupId} + configured-core + ${project.version} + + + + ${project.groupId} + configured-gson + ${project.version} + test + + + + + + + + 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 + + + + + diff --git a/features/collections/src/main/java/cc/carm/lib/configuration/builder/set/ConfigSetBuilder.java b/features/collections/src/main/java/cc/carm/lib/configuration/builder/set/ConfigSetBuilder.java new file mode 100644 index 0000000..72ab188 --- /dev/null +++ b/features/collections/src/main/java/cc/carm/lib/configuration/builder/set/ConfigSetBuilder.java @@ -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 { + + protected final @NotNull ValueType type; + + public ConfigSetBuilder(@NotNull ValueType type) { + this.type = type; + } + + public @NotNull SourceBuilder from(@NotNull Class sourceType) { + return from(ValueType.of(sourceType)); + } + + public @NotNull SourceBuilder from(@NotNull ValueType sourceType) { + return new SourceBuilder<>( + sourceType, type, + ValueHandler.required(type), + ValueHandler.required(sourceType) + ); + } + + public @NotNull ConfigSetBuilder.SourceBuilder fromObject() { + return new SourceBuilder<>( + ValueType.OBJECT, type, + ValueHandler.deserialize(type), ValueHandler.toObject() + ); + } + + public @NotNull ConfigSetBuilder.SourceBuilder fromString() { + return new SourceBuilder<>( + ValueType.STRING, type, + ValueHandler.required(type), ValueHandler.stringValue() + ); + } + + public @NotNull ConfigSetBuilder.SectionBuilder fromSection() { + return new SectionBuilder<>(type, ValueHandler.required(type), ValueHandler.required()); + } + + + public static class SourceBuilder extends SourceCollectionBuilder, ConfiguredSet, SourceBuilder> { + + public SourceBuilder(@NotNull ValueType sourceType, + @NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler serializer) { + super(LinkedHashSet::new, sourceType, paramType, parser, serializer); + } + + @Override + protected @NotNull ConfigSetBuilder.SourceBuilder self() { + return this; + } + + @Override + public @NotNull ConfiguredSet build() { + return new ConfiguredSet<>(buildManifest(), constructor, buildAdapter()); + } + + } + + public static class SectionBuilder extends SectionCollectionBuilder, ConfiguredSet, SectionBuilder> { + + public SectionBuilder(@NotNull ValueType paramType, + @NotNull ValueHandler parser, + @NotNull ValueHandler> serializer) { + super(LinkedHashSet::new, paramType, parser, serializer); + } + + @Override + protected @NotNull ConfigSetBuilder.SectionBuilder self() { + return this; + } + + @Override + public @NotNull ConfiguredSet build() { + return new ConfiguredSet<>(buildManifest(), constructor, buildAdapter()); + } + + } + + +} diff --git a/features/collections/src/main/java/cc/carm/lib/configuration/value/collections/ConfiguredSet.java b/features/collections/src/main/java/cc/carm/lib/configuration/value/collections/ConfiguredSet.java new file mode 100644 index 0000000..e19365c --- /dev/null +++ b/features/collections/src/main/java/cc/carm/lib/configuration/value/collections/ConfiguredSet.java @@ -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 extends CollectionConfigValue, ConfiguredSet> implements Set { + + public static @NotNull ConfigSetBuilder builderOf(@NotNull Class type) { + return builderOf(ValueType.of(type)); + } + + public static @NotNull ConfigSetBuilder builderOf(@NotNull ValueType type) { + return new ConfigSetBuilder<>(type); + } + + public static @NotNull ConfigSetBuilder.SourceBuilder with(@NotNull Class registeredType) { + return with(ValueType.of(registeredType)); + } + + public static @NotNull ConfigSetBuilder.SourceBuilder with(@NotNull ValueType registeredType) { + return builderOf(registeredType).fromObject(); + } + + @SafeVarargs + public static @NotNull ConfiguredSet of(@NotNull T value, @NotNull T... values) { + Set list = new LinkedHashSet<>(); + list.add(value); + Collections.addAll(list, values); + return with(ValueType.of(value)).defaults(list).build(); + } + + public ConfiguredSet(@NotNull ValueManifest, V> manifest, + @NotNull Supplier> constructor, + @NotNull ValueAdapter paramAdapter) { + super(manifest, constructor, paramAdapter); + } + + @Override + public @NotNull ConfiguredSet self() { + return this; + } + +} diff --git a/features/commentable/pom.xml b/features/commentable/pom.xml index 34f1f74..26073bb 100644 --- a/features/commentable/pom.xml +++ b/features/commentable/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/file/pom.xml b/features/file/pom.xml index 3480fd5..4f0326b 100644 --- a/features/file/pom.xml +++ b/features/file/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/kotlin/pom.xml b/features/kotlin/pom.xml index c46ab5a..1821e17 100644 --- a/features/kotlin/pom.xml +++ b/features/kotlin/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt index bcddeaf..73fd6ef 100644 --- a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt +++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt @@ -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 listFrom( - clazz: KClass, block: (SourceListBuilder.() -> Unit) + clazz: KClass, block: (SimpleCollectionCreator.Source, ConfiguredList>.() -> Unit) ): ConfiguredList { return listFrom(clazz.java, block) } inline fun listFrom( - clazz: Class, block: (SourceListBuilder.() -> Unit) + clazz: Class, block: (SimpleCollectionCreator.Source, ConfiguredList>.() -> Unit) ): ConfiguredList { return listFrom(ValueType.of(clazz), block) } inline fun listFrom( - valueType: ValueType, block: (SourceListBuilder.() -> Unit) + valueType: ValueType, block: (SimpleCollectionCreator.Source, ConfiguredList>.() -> Unit) ): ConfiguredList { val configBuilder = ConfiguredList.builderOf(V::class.java) - val sourceValueBuilder: SourceListBuilder = if (valueType.rawType == String::class.java) { - @Suppress("UNCHECKED_CAST") - configBuilder.fromString() as SourceListBuilder - } else configBuilder.from(valueType) + val sourceValueBuilder: SimpleCollectionCreator.Source, ConfiguredList> = + if (valueType.rawType == String::class.java) { + @Suppress("UNCHECKED_CAST") + configBuilder.fromString() as SimpleCollectionCreator.Source, ConfiguredList> + } else configBuilder.from(valueType) return sourceValueBuilder.also(block).build() -} \ No newline at end of file +} diff --git a/features/record/pom.xml b/features/record/pom.xml index 660429d..9fd6a38 100644 --- a/features/record/pom.xml +++ b/features/record/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/section/pom.xml b/features/section/pom.xml index a484781..edd628a 100644 --- a/features/section/pom.xml +++ b/features/section/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/text/pom.xml b/features/text/pom.xml index 0916d1f..faaf5de 100644 --- a/features/text/pom.xml +++ b/features/text/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/validators/pom.xml b/features/validators/pom.xml index 5d5d647..a6ec66c 100644 --- a/features/validators/pom.xml +++ b/features/validators/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/features/versioned/pom.xml b/features/versioned/pom.xml index 30a1906..f8af61f 100644 --- a/features/versioned/pom.xml +++ b/features/versioned/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/pom.xml b/pom.xml index 65332af..17c0176 100644 --- a/pom.xml +++ b/pom.xml @@ -16,11 +16,12 @@ cc.carm.lib configured-parent pom - 4.1.8 + 4.2.0 core features/section features/file + features/collections features/commentable features/versioned features/validators diff --git a/providers/gson/pom.xml b/providers/gson/pom.xml index d02e607..3fdbdbd 100644 --- a/providers/gson/pom.xml +++ b/providers/gson/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 ../../pom.xml 4.0.0 diff --git a/providers/hocon/pom.xml b/providers/hocon/pom.xml index 76016af..3aea094 100644 --- a/providers/hocon/pom.xml +++ b/providers/hocon/pom.xml @@ -6,7 +6,7 @@ cc.carm.lib configured-parent - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/providers/mongodb/pom.xml b/providers/mongodb/pom.xml index 6dba51f..02b7543 100644 --- a/providers/mongodb/pom.xml +++ b/providers/mongodb/pom.xml @@ -5,7 +5,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 ../../pom.xml 4.0.0 diff --git a/providers/sql/pom.xml b/providers/sql/pom.xml index 94eac1a..24497df 100644 --- a/providers/sql/pom.xml +++ b/providers/sql/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/providers/temp/pom.xml b/providers/temp/pom.xml index 279ff3b..83a06c8 100644 --- a/providers/temp/pom.xml +++ b/providers/temp/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 ../../pom.xml diff --git a/providers/yaml/pom.xml b/providers/yaml/pom.xml index 4aafadf..aea919a 100644 --- a/providers/yaml/pom.xml +++ b/providers/yaml/pom.xml @@ -6,7 +6,7 @@ configured-parent cc.carm.lib - 4.1.8 + 4.2.0 ../../pom.xml