mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-04 10:38:19 +08:00
feat(sql): Try to implement sql source
This commit is contained in:
@@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@@ -30,6 +29,7 @@ public abstract class ValueType<T> {
|
||||
public static final ValueType<Character> CHAR = ofPrimitiveType(Character.class);
|
||||
public static final ValueType<Character> CHAR_TYPE = ofPrimitiveType(char.class);
|
||||
|
||||
|
||||
public static final ValueType<?>[] PRIMITIVE_TYPES = {
|
||||
STRING, INTEGER, LONG, DOUBLE, FLOAT, BOOLEAN, BYTE, SHORT, CHAR,
|
||||
INTEGER_TYPE, LONG_TYPE, DOUBLE_TYPE, FLOAT_TYPE, BOOLEAN_TYPE, BYTE_TYPE, SHORT_TYPE, CHAR_TYPE
|
||||
@@ -157,7 +157,7 @@ public abstract class ValueType<T> {
|
||||
ParameterizedType pt = (ParameterizedType) type;
|
||||
Type raw = pt.getRawType();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(raw.getTypeName());
|
||||
sb.append(raw.getClass().getName());
|
||||
sb.append('<');
|
||||
Type[] args = pt.getActualTypeArguments();
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
@@ -166,6 +166,7 @@ public abstract class ValueType<T> {
|
||||
}
|
||||
sb.append(args[i].getTypeName());
|
||||
}
|
||||
sb.append('>');
|
||||
return sb.toString();
|
||||
}
|
||||
return type.getTypeName();
|
||||
|
||||
@@ -6,9 +6,11 @@ import cc.carm.lib.configuration.adapter.ValueType;
|
||||
import cc.carm.lib.configuration.source.loader.ConfigurationInitializer;
|
||||
import cc.carm.lib.configuration.source.meta.ConfigurationMetaHolder;
|
||||
import cc.carm.lib.configuration.source.meta.ConfigurationMetadata;
|
||||
import cc.carm.lib.configuration.source.meta.StandardMeta;
|
||||
import cc.carm.lib.configuration.source.option.ConfigurationOption;
|
||||
import cc.carm.lib.configuration.source.option.ConfigurationOptionHolder;
|
||||
import cc.carm.lib.configuration.source.section.ConfigureSource;
|
||||
import cc.carm.lib.configuration.value.ConfigValue;
|
||||
import cc.carm.lib.configuration.value.ValueManifest;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -18,6 +20,8 @@ import org.jetbrains.annotations.UnmodifiableView;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
public abstract class ConfigurationHolder<SOURCE extends ConfigureSource<?, ?, SOURCE>> {
|
||||
|
||||
@@ -51,7 +55,7 @@ public abstract class ConfigurationHolder<SOURCE extends ConfigureSource<?, ?, S
|
||||
return options;
|
||||
}
|
||||
|
||||
public <O> O option(@NotNull ConfigurationOption<O> option) {
|
||||
public <O> @NotNull O option(@NotNull ConfigurationOption<O> option) {
|
||||
return options().get(option);
|
||||
}
|
||||
|
||||
@@ -66,14 +70,26 @@ public abstract class ConfigurationHolder<SOURCE extends ConfigureSource<?, ?, S
|
||||
@NotNull
|
||||
@UnmodifiableView
|
||||
public <M> Map<String, M> extractMetadata(@NotNull ConfigurationMetadata<M> type) {
|
||||
return extractMetadata(type, Objects::nonNull);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@UnmodifiableView
|
||||
public <M> Map<String, M> extractMetadata(@NotNull ConfigurationMetadata<M> type, @NotNull Predicate<M> filter) {
|
||||
Map<String, M> metas = new LinkedHashMap<>();
|
||||
for (Map.Entry<String, ConfigurationMetaHolder> entry : this.metadata.entrySet()) {
|
||||
M data = entry.getValue().get(type);
|
||||
if (data != null) metas.put(entry.getKey(), data);
|
||||
if (filter.test(data)) metas.put(entry.getKey(), data);
|
||||
}
|
||||
return Collections.unmodifiableMap(metas);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@UnmodifiableView
|
||||
public Map<String, ConfigValue<?>> registeredValues() {
|
||||
return extractMetadata(StandardMeta.VALUE);
|
||||
}
|
||||
|
||||
public ValueAdapterRegistry adapters() {
|
||||
return this.adapters;
|
||||
}
|
||||
|
||||
+13
-12
@@ -5,26 +5,27 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@FunctionalInterface
|
||||
public interface ConfigInitializeHandler<T> {
|
||||
public interface ConfigInitializeHandler<T, V> {
|
||||
|
||||
static <T> ConfigInitializeHandler<T> start() {
|
||||
return (provider, path, value) -> {
|
||||
static <T, V> ConfigInitializeHandler<T, V> start() {
|
||||
return (provider, path, value, instace) -> {
|
||||
};
|
||||
}
|
||||
|
||||
void whenInitialize(@NotNull ConfigurationHolder<?> holder, @Nullable String path, @NotNull T value) throws Exception;
|
||||
void whenInitialize(@NotNull ConfigurationHolder<?> holder, @Nullable String path,
|
||||
@NotNull T value, @Nullable V instance) throws Exception;
|
||||
|
||||
default ConfigInitializeHandler<T> andThen(ConfigInitializeHandler<T> after) {
|
||||
return (provider, path, value) -> {
|
||||
whenInitialize(provider, path, value);
|
||||
after.whenInitialize(provider, path, value);
|
||||
default ConfigInitializeHandler<T, V> andThen(ConfigInitializeHandler<T, V> after) {
|
||||
return (provider, path, value, instance) -> {
|
||||
whenInitialize(provider, path, value, instance);
|
||||
after.whenInitialize(provider, path, value, instance);
|
||||
};
|
||||
}
|
||||
|
||||
default ConfigInitializeHandler<T> compose(ConfigInitializeHandler<T> before) {
|
||||
return (provider, path, value) -> {
|
||||
before.whenInitialize(provider, path, value);
|
||||
whenInitialize(provider, path, value);
|
||||
default ConfigInitializeHandler<T, V> compose(ConfigInitializeHandler<T, V> before) {
|
||||
return (provider, path, value, instance) -> {
|
||||
before.whenInitialize(provider, path, value, instance);
|
||||
whenInitialize(provider, path, value, instance);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+24
-24
@@ -21,18 +21,18 @@ import java.util.function.Function;
|
||||
public class ConfigurationInitializer {
|
||||
|
||||
protected @NotNull PathGenerator pathGenerator;
|
||||
protected @NotNull ConfigInitializeHandler<Field> fieldInitializer;
|
||||
protected @NotNull ConfigInitializeHandler<Class<? extends Configuration>> classInitializer;
|
||||
protected @NotNull ConfigInitializeHandler<Field, ConfigValue<?>> valueInitializer;
|
||||
protected @NotNull ConfigInitializeHandler<Class<? extends Configuration>, Object> classInitializer;
|
||||
|
||||
public ConfigurationInitializer() {
|
||||
this(PathGenerator.of(), ConfigInitializeHandler.start(), ConfigInitializeHandler.start());
|
||||
}
|
||||
|
||||
public ConfigurationInitializer(@NotNull PathGenerator pathGenerator,
|
||||
@NotNull ConfigInitializeHandler<Field> fieldInitializer,
|
||||
@NotNull ConfigInitializeHandler<Class<? extends Configuration>> classInitializer) {
|
||||
@NotNull ConfigInitializeHandler<Field, ConfigValue<?>> valueInitializer,
|
||||
@NotNull ConfigInitializeHandler<Class<? extends Configuration>, Object> classInitializer) {
|
||||
this.pathGenerator = pathGenerator;
|
||||
this.fieldInitializer = fieldInitializer;
|
||||
this.valueInitializer = valueInitializer;
|
||||
this.classInitializer = classInitializer;
|
||||
}
|
||||
|
||||
@@ -44,34 +44,34 @@ public class ConfigurationInitializer {
|
||||
return pathGenerator;
|
||||
}
|
||||
|
||||
public ConfigInitializeHandler<Field> fieldInitializer() {
|
||||
return fieldInitializer;
|
||||
public ConfigInitializeHandler<Field, ConfigValue<?>> fieldInitializer() {
|
||||
return valueInitializer;
|
||||
}
|
||||
|
||||
public void fieldInitializer(@NotNull ConfigInitializeHandler<Field> fieldInitializer) {
|
||||
this.fieldInitializer = fieldInitializer;
|
||||
public void fieldInitializer(@NotNull ConfigInitializeHandler<Field, ConfigValue<?>> fieldInitializer) {
|
||||
this.valueInitializer = fieldInitializer;
|
||||
}
|
||||
|
||||
public ConfigInitializeHandler<Class<? extends Configuration>> classInitializer() {
|
||||
public ConfigInitializeHandler<Class<? extends Configuration>, Object> classInitializer() {
|
||||
return classInitializer;
|
||||
}
|
||||
|
||||
public void classInitializer(@NotNull ConfigInitializeHandler<Class<? extends Configuration>> classInitializer) {
|
||||
public void classInitializer(@NotNull ConfigInitializeHandler<Class<? extends Configuration>, Object> classInitializer) {
|
||||
this.classInitializer = classInitializer;
|
||||
}
|
||||
|
||||
public void appendFieldInitializer(@NotNull ConfigInitializeHandler<Field> fieldInitializer) {
|
||||
this.fieldInitializer = this.fieldInitializer.andThen(fieldInitializer);
|
||||
public void appendFieldInitializer(@NotNull ConfigInitializeHandler<Field, ConfigValue<?>> fieldInitializer) {
|
||||
this.valueInitializer = this.valueInitializer.andThen(fieldInitializer);
|
||||
}
|
||||
|
||||
public void appendClassInitializer(@NotNull ConfigInitializeHandler<Class<? extends Configuration>> classInitializer) {
|
||||
public void appendClassInitializer(@NotNull ConfigInitializeHandler<Class<? extends Configuration>, Object> classInitializer) {
|
||||
this.classInitializer = this.classInitializer.andThen(classInitializer);
|
||||
}
|
||||
|
||||
public <T, A extends Annotation> void registerClassAnnotation(@NotNull Class<A> annotation,
|
||||
@NotNull ConfigurationMetadata<T> metadata,
|
||||
@NotNull Function<A, T> extractor) {
|
||||
appendClassInitializer((holder, path, clazz) -> {
|
||||
appendClassInitializer((holder, path, clazz, instance) -> {
|
||||
A data = clazz.getAnnotation(annotation);
|
||||
if (data == null) return;
|
||||
holder.metadata(path).setIfAbsent(metadata, extractor.apply(data));
|
||||
@@ -81,7 +81,7 @@ public class ConfigurationInitializer {
|
||||
public <T, A extends Annotation> void registerFieldAnnotation(@NotNull Class<A> annotation,
|
||||
@NotNull ConfigurationMetadata<T> metadata,
|
||||
@NotNull Function<A, T> extractor) {
|
||||
appendFieldInitializer((holder, path, field) -> {
|
||||
appendFieldInitializer((holder, path, field, instance) -> {
|
||||
A data = field.getAnnotation(annotation);
|
||||
if (data == null) return;
|
||||
holder.metadata(path).setIfAbsent(metadata, extractor.apply(data));
|
||||
@@ -123,7 +123,7 @@ public class ConfigurationInitializer {
|
||||
@Nullable String parentPath, @Nullable Field configField) {
|
||||
String path = getClassPath(holder, parentPath, root.getClass(), configField);
|
||||
try {
|
||||
this.classInitializer.whenInitialize(holder, path, root.getClass());
|
||||
this.classInitializer.whenInitialize(holder, path, root.getClass(), root);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -140,7 +140,7 @@ public class ConfigurationInitializer {
|
||||
String path = getClassPath(holder, parentPath, clazz, configField);
|
||||
|
||||
try {
|
||||
this.classInitializer.whenInitialize(holder, path, (Class<? extends Configuration>) clazz);
|
||||
this.classInitializer.whenInitialize(holder, path, (Class<? extends Configuration>) clazz, configField);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -169,15 +169,15 @@ public class ConfigurationInitializer {
|
||||
String path = getFieldPath(holder, parent, field);
|
||||
if (path == null) return;
|
||||
value.initialize(holder, path);
|
||||
holder.metadata(path).set(StandardMeta.UNIT, true); // Mark the minimal config value unit.
|
||||
try {
|
||||
this.fieldInitializer.whenInitialize(holder, path, field);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
holder.metadata(path).set(StandardMeta.VALUE, value); // Mark the minimal config value unit.
|
||||
if (holder.option(StandardOptions.SET_DEFAULTS)) {
|
||||
value.setDefault(); // Set default value.
|
||||
}
|
||||
try {
|
||||
this.valueInitializer.whenInitialize(holder, path, field, value);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (holder.option(StandardOptions.PRELOAD)) {
|
||||
value.get(); // Preload the value by calling #get method.
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package cc.carm.lib.configuration.source.meta;
|
||||
|
||||
import cc.carm.lib.configuration.value.ConfigValue;
|
||||
|
||||
public interface StandardMeta {
|
||||
|
||||
/**
|
||||
* To mark the {@link cc.carm.lib.configuration.value.ConfigValue} as a minimal unit path.
|
||||
* To mark the {@link ConfigValue} instance of specific path.
|
||||
*/
|
||||
ConfigurationMetadata<Boolean> UNIT = ConfigurationMetadata.of(false);
|
||||
ConfigurationMetadata<ConfigValue<?>> VALUE = ConfigurationMetadata.of();
|
||||
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ public class ValueManifest<T> {
|
||||
|
||||
protected @NotNull Supplier<@Nullable T> defaultSupplier;
|
||||
|
||||
|
||||
public ValueManifest(@NotNull ValueType<T> type) {
|
||||
this(type, () -> null, EMPTY_INITIALIZER, null, null);
|
||||
}
|
||||
@@ -93,12 +92,12 @@ public class ValueManifest<T> {
|
||||
|
||||
public @NotNull String path() {
|
||||
if (path != null) return path;
|
||||
else throw new IllegalStateException("No section path provided.");
|
||||
else throw new IllegalStateException("No section path provided for Value(" + type() + ").");
|
||||
}
|
||||
|
||||
public @NotNull ConfigurationHolder<?> holder() {
|
||||
if (this.holder != null) return this.holder;
|
||||
throw new IllegalStateException("Value does not have a provider.");
|
||||
throw new IllegalStateException("Value(" + type() + ") does not have a provider.");
|
||||
}
|
||||
|
||||
public @NotNull ConfigureSource<?, ?, ?> config() {
|
||||
@@ -118,7 +117,7 @@ public class ValueManifest<T> {
|
||||
}
|
||||
|
||||
|
||||
private static final @NotNull BiConsumer<@NotNull ConfigurationHolder<?>, @NotNull String> EMPTY_INITIALIZER = (provider, path) -> {
|
||||
private static final @NotNull BiConsumer<@NotNull ConfigurationHolder<?>, @NotNull String> EMPTY_INITIALIZER = (provider, valuePath) -> {
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user