1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2024-09-19 20:25:51 +00:00

feat(value): 为ConfiguredList 与 ConfiguredMap 实现相关基础方法

This commit is contained in:
Carm Jos 2023-02-19 17:17:33 +08:00
parent b756074ddc
commit c49d904665
10 changed files with 243 additions and 20 deletions

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId>
<version>3.3.3</version>
<version>3.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>

View File

@ -1,6 +1,5 @@
package cc.carm.lib.configuration.core.value.type;
import cc.carm.lib.configuration.core.annotation.HeaderComment;
import cc.carm.lib.configuration.core.builder.list.ConfigListBuilder;
import cc.carm.lib.configuration.core.function.ConfigDataFunction;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
@ -8,16 +7,16 @@ import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
public class ConfiguredList<V> extends CachedConfigValue<List<V>> {
public class ConfiguredList<V> extends CachedConfigValue<List<V>> implements List<V> {
public static <V> @NotNull ConfigListBuilder<V> builder(@NotNull Class<V> valueClass) {
return builder().asList(valueClass);
}
@HeaderComment
protected final @NotNull Class<V> valueClass;
protected final @NotNull ConfigDataFunction<Object, V> parser;
@ -73,5 +72,140 @@ public class ConfiguredList<V> extends CachedConfigValue<List<V>> {
}
}
public <T> @NotNull T modifyValue(Function<List<V>, T> function) {
List<V> list = get();
T result = function.apply(list);
set(list);
return result;
}
public @NotNull List<V> modifyList(Consumer<List<V>> consumer) {
List<V> list = get();
consumer.accept(list);
set(list);
return list;
}
@Override
public int size() {
return get().size();
}
@Override
public boolean isEmpty() {
return get().isEmpty();
}
@Override
public boolean contains(Object o) {
return get().contains(o);
}
@NotNull
@Override
public Iterator<V> iterator() {
return get().iterator();
}
@NotNull
@Override
public Object @NotNull [] toArray() {
return get().toArray();
}
@NotNull
@Override
public <T> T @NotNull [] toArray(@NotNull T[] a) {
return get().toArray(a);
}
@Override
public boolean add(V v) {
modifyValue(list -> list.add(v));
return true;
}
@Override
public boolean remove(Object o) {
return modifyValue(list -> list.remove(o));
}
@Override
public boolean containsAll(@NotNull Collection<?> c) {
return new HashSet<>(get()).containsAll(c);
}
@Override
public boolean addAll(@NotNull Collection<? extends V> c) {
return modifyValue(list -> list.addAll(c));
}
@Override
public boolean addAll(int index, @NotNull Collection<? extends V> c) {
return modifyValue(list -> list.addAll(index, c));
}
@Override
public boolean removeAll(@NotNull Collection<?> c) {
return modifyValue(list -> list.removeAll(c));
}
@Override
public boolean retainAll(@NotNull Collection<?> c) {
return modifyValue(list -> list.retainAll(c));
}
@Override
public void clear() {
modifyList(List::clear);
}
@Override
public V get(int index) {
return get().get(index);
}
@Override
public V set(int index, V element) {
return modifyValue(list -> list.set(index, element));
}
@Override
public void add(int index, V element) {
modifyList(list -> list.add(index, element));
}
@Override
public V remove(int index) {
return modifyValue(list -> list.remove(index));
}
@Override
public int indexOf(Object o) {
return get().indexOf(o);
}
@Override
public int lastIndexOf(Object o) {
return get().lastIndexOf(o);
}
@NotNull
@Override
public ListIterator<V> listIterator() {
return get().listIterator();
}
@NotNull
@Override
public ListIterator<V> listIterator(int index) {
return get().listIterator(index);
}
@NotNull
@Override
public List<V> subList(int fromIndex, int toIndex) {
return get().subList(fromIndex, toIndex);
}
}

View File

@ -7,14 +7,14 @@ import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
public class ConfiguredMap<K, V> extends CachedConfigValue<Map<K, V>> {
public class ConfiguredMap<K, V> extends CachedConfigValue<Map<K, V>> implements Map<K, V> {
public static <K, V> @NotNull ConfigMapBuilder<LinkedHashMap<K, V>, K, V> builder(@NotNull Class<K> keyClass,
@NotNull Class<V> valueClass) {
@ -103,7 +103,7 @@ public class ConfiguredMap<K, V> extends CachedConfigValue<Map<K, V>> {
}
@Override
public void set(Map<K, V> value) {
public void set(@Nullable Map<K, V> value) {
updateCache(value);
if (value == null) setValue(null);
else {
@ -122,5 +122,83 @@ public class ConfiguredMap<K, V> extends CachedConfigValue<Map<K, V>> {
}
}
public <T> @NotNull T modifyValue(Function<Map<K, V>, T> function) {
Map<K, V> m = get();
T result = function.apply(m);
set(m);
return result;
}
public @NotNull Map<K, V> modifyMap(Consumer<Map<K, V>> consumer) {
Map<K, V> m = get();
consumer.accept(m);
set(m);
return m;
}
@Override
public int size() {
return get().size();
}
@Override
public boolean isEmpty() {
return get().isEmpty();
}
@Override
public boolean containsKey(Object key) {
return get().containsKey(key);
}
@Override
public boolean containsValue(Object value) {
return get().containsValue(value);
}
@Override
public V get(Object key) {
return get().get(key);
}
@Nullable
@Override
public V put(K key, V value) {
return modifyValue(m -> m.put(key, value));
}
@Override
public V remove(Object key) {
return modifyValue(m -> m.remove(key));
}
@Override
public void putAll(@NotNull Map<? extends K, ? extends V> m) {
modifyMap(map -> map.putAll(m));
}
@Override
public void clear() {
modifyMap(Map::clear);
}
@NotNull
@Override
public Set<K> keySet() {
return get().keySet();
}
@NotNull
@Override
public Collection<V> values() {
return get().values();
}
@NotNull
@Override
@Unmodifiable
public Set<Entry<K, V>> entrySet() {
return get().entrySet();
}
}

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId>
<version>3.3.3</version>
<version>3.4.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<properties>

View File

@ -1,9 +1,10 @@
package cc.carm.lib.configuration.demo.tests;
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
import cc.carm.lib.configuration.demo.tests.model.TestModel;
import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration;
import cc.carm.lib.configuration.demo.tests.conf.TestConfiguration;
import cc.carm.lib.configuration.demo.tests.model.TestModel;
import org.jetbrains.annotations.TestOnly;
import java.util.LinkedHashMap;
import java.util.List;
@ -13,6 +14,7 @@ import java.util.stream.IntStream;
public class ConfigurationTest {
@TestOnly
public static void testDemo(ConfigurationProvider<?> provider) {
provider.initialize(DemoConfiguration.class);
@ -30,9 +32,18 @@ public class ConfigurationTest {
System.out.println("after: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get());
System.out.println("> Test List:");
DemoConfiguration.Sub.That.OPERATORS.getNotNull().forEach(System.out::println);
System.out.println(" Before:");
DemoConfiguration.Sub.That.OPERATORS.forEach(System.out::println);
List<UUID> operators = IntStream.range(0, 5).mapToObj(i -> UUID.randomUUID()).collect(Collectors.toList());
DemoConfiguration.Sub.That.OPERATORS.set(operators);
System.out.println(" After:");
DemoConfiguration.Sub.That.OPERATORS.forEach(System.out::println);
System.out.println("> Clear List:");
System.out.println(" Before: size :" + DemoConfiguration.Sub.That.OPERATORS.size());
DemoConfiguration.Sub.That.OPERATORS.modifyList(List::clear);
System.out.println(" After size :" + DemoConfiguration.Sub.That.OPERATORS.size());
System.out.println("> Test Section:");
System.out.println(DemoConfiguration.MODEL_TEST.get());

View File

@ -69,7 +69,7 @@ public class DemoConfiguration extends ConfigurationRoot {
public static class That extends ConfigurationRoot {
public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList
public static final ConfiguredList<UUID> OPERATORS = ConfiguredList
.builder(UUID.class).fromString()
.parseValue(s -> Objects.requireNonNull(UUID.fromString(s)))
.build();

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId>
<version>3.3.3</version>
<version>3.4.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId>
<version>3.3.3</version>
<version>3.4.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -5,7 +5,7 @@
<parent>
<artifactId>easyconfiguration-parent</artifactId>
<groupId>cc.carm.lib</groupId>
<version>3.3.3</version>
<version>3.4.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>

View File

@ -15,7 +15,7 @@
<groupId>cc.carm.lib</groupId>
<artifactId>easyconfiguration-parent</artifactId>
<packaging>pom</packaging>
<version>3.3.3</version>
<version>3.4.0</version>
<modules>
<module>core</module>
<module>demo</module>