mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-05 02:58:20 +08:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c2a08c6c72 | |||
| dd7a6c819f | |||
| e9c010981e | |||
| 78d52e1aae | |||
| 42ccc23347 |
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>1.2.0</version>
|
<version>2.1.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
<?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">
|
||||||
|
<parent>
|
||||||
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
|
<groupId>cc.carm.lib</groupId>
|
||||||
|
<version>2.1.0</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>${java.version}</maven.compiler.source>
|
||||||
|
<maven.compiler.target>${java.version}</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
<artifactId>easyconfiguration-json</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>${project.parent.groupId}</groupId>
|
||||||
|
<artifactId>easyconfiguration-core</artifactId>
|
||||||
|
<version>${project.parent.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<version>2.9.0</version>
|
||||||
|
<scope>compile</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,33 @@
|
|||||||
|
package cc.carm.lib.configuration;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.json.JSONConfigProvider;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class EasyConfiguration {
|
||||||
|
|
||||||
|
public static JSONConfigProvider from(File file, String source) {
|
||||||
|
JSONConfigProvider provider = new JSONConfigProvider(file);
|
||||||
|
try {
|
||||||
|
provider.initializeFile(source);
|
||||||
|
provider.initializeConfig();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return provider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONConfigProvider from(File file) {
|
||||||
|
return from(file, file.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONConfigProvider from(String fileName) {
|
||||||
|
return from(fileName, fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JSONConfigProvider from(String fileName, String source) {
|
||||||
|
return from(new File(fileName), source);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package cc.carm.lib.configuration.json;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.ConfigInitializer;
|
||||||
|
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
|
||||||
|
import cc.carm.lib.configuration.core.source.impl.FileConfigProvider;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonSerializer;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some code comes from BungeeCord's implementation of the JsonConfiguration.
|
||||||
|
*
|
||||||
|
* @author md_5, CarmJos
|
||||||
|
*/
|
||||||
|
public class JSONConfigProvider extends FileConfigProvider<JSONConfigWrapper> {
|
||||||
|
|
||||||
|
protected final Gson gson = new GsonBuilder()
|
||||||
|
.serializeNulls().disableHtmlEscaping().setPrettyPrinting()
|
||||||
|
.registerTypeAdapter(
|
||||||
|
JSONConfigWrapper.class,
|
||||||
|
(JsonSerializer<JSONConfigWrapper>) (src, typeOfSrc, context) -> context.serialize(src.data)
|
||||||
|
).create();
|
||||||
|
|
||||||
|
protected JSONConfigWrapper configuration;
|
||||||
|
protected ConfigInitializer<JSONConfigProvider> initializer;
|
||||||
|
|
||||||
|
public JSONConfigProvider(@NotNull File file) {
|
||||||
|
super(file);
|
||||||
|
this.initializer = new ConfigInitializer<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initializeConfig() {
|
||||||
|
LinkedHashMap<?, ?> map = null;
|
||||||
|
|
||||||
|
try (FileInputStream is = new FileInputStream(file)) {
|
||||||
|
map = gson.fromJson(new InputStreamReader(is, StandardCharsets.UTF_8), LinkedHashMap.class);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map == null) map = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
this.configuration = new JSONConfigWrapper(map);
|
||||||
|
this.initializer = new ConfigInitializer<>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull JSONConfigWrapper getConfiguration() {
|
||||||
|
return this.configuration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reload() {
|
||||||
|
initializeConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() throws Exception {
|
||||||
|
try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)) {
|
||||||
|
gson.toJson(configuration.data, writer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setComments(@NotNull String path, @NotNull String... comments) {
|
||||||
|
// JSON doesn't support comments.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String[] getComments(@NotNull String path) {
|
||||||
|
return new String[0]; // JSON doesn't support comments.
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ConfigInitializer<? extends ConfigurationProvider<JSONConfigWrapper>> getInitializer() {
|
||||||
|
return this.initializer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
package cc.carm.lib.configuration.json;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some code comes from BungeeCord's implementation of the JsonConfiguration.
|
||||||
|
*
|
||||||
|
* @author md_5, CarmJos
|
||||||
|
*/
|
||||||
|
public class JSONConfigWrapper implements ConfigurationWrapper {
|
||||||
|
|
||||||
|
private static final char SEPARATOR = '.';
|
||||||
|
protected final Map<String, Object> data;
|
||||||
|
|
||||||
|
JSONConfigWrapper(Map<?, ?> map) {
|
||||||
|
this.data = new LinkedHashMap<>();
|
||||||
|
|
||||||
|
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
||||||
|
String key = (entry.getKey() == null) ? "null" : entry.getKey().toString();
|
||||||
|
|
||||||
|
if (entry.getValue() instanceof Map) {
|
||||||
|
this.data.put(key, new JSONConfigWrapper((Map<?, ?>) entry.getValue()));
|
||||||
|
} else {
|
||||||
|
this.data.put(key, entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Set<String> getKeys(boolean deep) {
|
||||||
|
return new LinkedHashSet<>(this.data.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Map<String, Object> getValues(boolean deep) {
|
||||||
|
return new LinkedHashMap<>(this.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(@NotNull String path, @Nullable Object value) {
|
||||||
|
if (value instanceof Map) {
|
||||||
|
value = new JSONConfigWrapper((Map<?, ?>) value);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONConfigWrapper section = getSectionFor(path);
|
||||||
|
if (section == this) {
|
||||||
|
if (value == null) {
|
||||||
|
this.data.remove(path);
|
||||||
|
} else {
|
||||||
|
this.data.put(path, value);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
section.set(getChild(path), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean contains(@NotNull String path) {
|
||||||
|
return get(path) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Object get(@NotNull String path) {
|
||||||
|
JSONConfigWrapper section = getSectionFor(path);
|
||||||
|
return section == this ? data.get(path) : section.get(getChild(path));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isList(@NotNull String path) {
|
||||||
|
return get(path) instanceof List<?>;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<?> getList(@NotNull String path) {
|
||||||
|
Object val = get(path);
|
||||||
|
return (val instanceof List<?>) ? (List<?>) val : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isConfigurationSection(@NotNull String path) {
|
||||||
|
return get(path) instanceof JSONConfigWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable ConfigurationWrapper getConfigurationSection(@NotNull String path) {
|
||||||
|
Object val = get(path);
|
||||||
|
return (val instanceof JSONConfigWrapper) ? (JSONConfigWrapper) val : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JSONConfigWrapper getSectionFor(String path) {
|
||||||
|
int index = path.indexOf(SEPARATOR);
|
||||||
|
if (index == -1) return this;
|
||||||
|
|
||||||
|
String root = path.substring(0, index);
|
||||||
|
Object section = this.data.get(root);
|
||||||
|
if (section == null) {
|
||||||
|
section = new JSONConfigWrapper(new LinkedHashMap<>());
|
||||||
|
this.data.put(root, section);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (JSONConfigWrapper) section;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getChild(String path) {
|
||||||
|
int index = path.indexOf(SEPARATOR);
|
||||||
|
return (index == -1) ? path : path.substring(index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
package cc.carm.lib.configuration.json;
|
||||||
|
|
||||||
|
public abstract class JSONValue {
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package config;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.EasyConfiguration;
|
||||||
|
import cc.carm.lib.configuration.json.JSONConfigProvider;
|
||||||
|
import config.model.TestModel;
|
||||||
|
import config.source.DemoConfiguration;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class JSONConfigTest {
|
||||||
|
|
||||||
|
protected final JSONConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml");
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onTest() {
|
||||||
|
|
||||||
|
provider.initialize(DemoConfiguration.class);
|
||||||
|
|
||||||
|
testDemo();
|
||||||
|
|
||||||
|
try {
|
||||||
|
provider.save();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void testDemo() {
|
||||||
|
System.out.println("----------------------------------------------------");
|
||||||
|
|
||||||
|
System.out.println("> Test Value:");
|
||||||
|
System.out.println("before: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get());
|
||||||
|
DemoConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID());
|
||||||
|
System.out.println("after: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get());
|
||||||
|
|
||||||
|
System.out.println("> Test List:");
|
||||||
|
DemoConfiguration.Sub.That.OPERATORS.getNotNull().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("> Test Section:");
|
||||||
|
System.out.println(DemoConfiguration.MODEL_TEST.get());
|
||||||
|
DemoConfiguration.MODEL_TEST.set(TestModel.random());
|
||||||
|
|
||||||
|
System.out.println("> Test Maps:");
|
||||||
|
DemoConfiguration.USERS.getNotNull().forEach((k, v) -> System.out.println(k + ": " + v));
|
||||||
|
LinkedHashMap<Integer, UUID> data = new LinkedHashMap<>();
|
||||||
|
for (int i = 1; i <= 5; i++) {
|
||||||
|
data.put(i, UUID.randomUUID());
|
||||||
|
}
|
||||||
|
DemoConfiguration.USERS.set(data);
|
||||||
|
System.out.println("----------------------------------------------------");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package config.model;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public abstract class AbstractModel {
|
||||||
|
|
||||||
|
protected final @NotNull String name;
|
||||||
|
|
||||||
|
public AbstractModel(@NotNull String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package config.model;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.TestOnly;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SomeModel extends AbstractModel {
|
||||||
|
|
||||||
|
int num;
|
||||||
|
|
||||||
|
public SomeModel(@NotNull String name, int num) {
|
||||||
|
super(name);
|
||||||
|
this.num = num;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "SomeModel{" +
|
||||||
|
"name='" + name + '\'' +
|
||||||
|
", num=" + num +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull Map<String, Object> serialize() {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("name", name);
|
||||||
|
map.put("num", num);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestOnly
|
||||||
|
public static SomeModel deserialize(Map<String, ?> args) {
|
||||||
|
return new SomeModel((String) args.get("name"), (Integer) args.get("num"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package config.model;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class TestModel extends AbstractModel {
|
||||||
|
|
||||||
|
public UUID uuid;
|
||||||
|
|
||||||
|
public TestModel(String name, UUID uuid) {
|
||||||
|
super(name);
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUuid(UUID uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UUID getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull Map<String, Object> serialize() {
|
||||||
|
Map<String, Object> map = new HashMap<>();
|
||||||
|
map.put("name", name);
|
||||||
|
Map<String, Object> map2 = new HashMap<>();
|
||||||
|
map2.put("uuid", uuid.toString());
|
||||||
|
map.put("info", map2);
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TestModel deserialize(ConfigurationWrapper section) {
|
||||||
|
String name = section.getString("name");
|
||||||
|
if (name == null) throw new NullPointerException("name is null");
|
||||||
|
String uuidString = section.getString("info.uuid");
|
||||||
|
if (uuidString == null) throw new NullPointerException("uuid is null");
|
||||||
|
return new TestModel(name, UUID.fromString(uuidString));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TestModel random() {
|
||||||
|
return new TestModel(UUID.randomUUID().toString().substring(0, 5), UUID.randomUUID());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "TestUser{" +
|
||||||
|
"name='" + name + '\'' +
|
||||||
|
", uuid=" + uuid +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package config.source;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
||||||
|
import cc.carm.lib.configuration.core.annotation.ConfigComment;
|
||||||
|
import cc.carm.lib.configuration.core.annotation.ConfigPath;
|
||||||
|
import cc.carm.lib.configuration.core.value.ConfigValue;
|
||||||
|
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
|
||||||
|
|
||||||
|
@ConfigComment({"数据库配置", " 用于提供数据库连接,进行数据库操作。"})
|
||||||
|
public class DatabaseConfiguration extends ConfigurationRoot {
|
||||||
|
|
||||||
|
@ConfigPath("driver")
|
||||||
|
@ConfigComment({
|
||||||
|
"数据库驱动配置,请根据数据库类型设置。",
|
||||||
|
"- MySQL: com.mysql.cj.jdbc.Driver",
|
||||||
|
"- MariaDB(推荐): org.mariadb.jdbc.Driver",
|
||||||
|
})
|
||||||
|
protected static final ConfigValue<String> DRIVER_NAME = ConfiguredValue.of(
|
||||||
|
String.class, "com.mysql.cj.jdbc.Driver"
|
||||||
|
);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> HOST = ConfiguredValue.of(String.class, "127.0.0.1");
|
||||||
|
protected static final ConfigValue<Integer> PORT = ConfiguredValue.of(Integer.class, 3306);
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> DATABASE = ConfiguredValue.of(String.class, "minecraft");
|
||||||
|
protected static final ConfigValue<String> USERNAME = ConfiguredValue.of(String.class, "root");
|
||||||
|
protected static final ConfigValue<String> PASSWORD = ConfiguredValue.of(String.class, "password");
|
||||||
|
|
||||||
|
protected static final ConfigValue<String> EXTRA = ConfiguredValue.of(String.class, "?useSSL=false");
|
||||||
|
|
||||||
|
protected static String buildJDBC() {
|
||||||
|
return String.format("jdbc:mysql://%s:%s/%s%s", HOST.get(), PORT.get(), DATABASE.get(), EXTRA.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package config.source;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
||||||
|
import cc.carm.lib.configuration.core.annotation.ConfigComment;
|
||||||
|
import cc.carm.lib.configuration.core.annotation.ConfigPath;
|
||||||
|
import cc.carm.lib.configuration.core.value.ConfigValue;
|
||||||
|
import cc.carm.lib.configuration.core.value.type.ConfiguredList;
|
||||||
|
import cc.carm.lib.configuration.core.value.type.ConfiguredMap;
|
||||||
|
import cc.carm.lib.configuration.core.value.type.ConfiguredSection;
|
||||||
|
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
|
||||||
|
import config.model.TestModel;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
public class DemoConfiguration extends ConfigurationRoot {
|
||||||
|
|
||||||
|
@ConfigPath(root = true)
|
||||||
|
@ConfigComment({
|
||||||
|
"有时候,需要在配置文件最上面显示点东西,",
|
||||||
|
"此时就推荐添加一个可以用到但并不重要的参数到最上面",
|
||||||
|
"并给他添加对应的注释。"
|
||||||
|
})
|
||||||
|
protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D);
|
||||||
|
|
||||||
|
// 可以直接写静态内部类,并通过 Class<?> 声明。
|
||||||
|
public static final Class<?> SUB_TEST = Sub.class;
|
||||||
|
|
||||||
|
@ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。
|
||||||
|
@ConfigComment({"Section类型数据测试"}) // 通过注解给配置添加注释。
|
||||||
|
public static final ConfigValue<TestModel> MODEL_TEST = ConfiguredSection
|
||||||
|
.builder(TestModel.class)
|
||||||
|
.defaults(new TestModel("Carm", UUID.randomUUID()))
|
||||||
|
.parseValue((section, defaultValue) -> TestModel.deserialize(section))
|
||||||
|
.serializeValue(TestModel::serialize).build();
|
||||||
|
|
||||||
|
// 子配置文件
|
||||||
|
@ConfigPath("database")
|
||||||
|
public static final Class<?> DB_CONFIG = DatabaseConfiguration.class;
|
||||||
|
|
||||||
|
@ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"})
|
||||||
|
public static final ConfigValue<Map<Integer, UUID>> USERS = ConfiguredMap
|
||||||
|
.builder(Integer.class, UUID.class).fromString()
|
||||||
|
.parseKey(Integer::parseInt)
|
||||||
|
.parseValue(v -> Objects.requireNonNull(UUID.fromString(v)))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
public static class Sub extends ConfigurationRoot {
|
||||||
|
|
||||||
|
@ConfigPath(value = "uuid-value", root = true)
|
||||||
|
public static final ConfigValue<UUID> UUID_CONFIG_VALUE = ConfiguredValue
|
||||||
|
.builder(UUID.class).fromString()
|
||||||
|
.parseValue((data, defaultValue) -> UUID.fromString(data))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
public static final Class<?> NOTHING = That.class;
|
||||||
|
|
||||||
|
public static class That extends ConfigurationRoot {
|
||||||
|
|
||||||
|
public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList
|
||||||
|
.builder(UUID.class).fromString()
|
||||||
|
.parseValue(s -> Objects.requireNonNull(UUID.fromString(s)))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>1.2.0</version>
|
<version>2.1.0</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package cc.carm.lib.configuration;
|
package cc.carm.lib.configuration;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.yaml.YamlConfigProvider;
|
import cc.carm.lib.configuration.yaml.YAMLConfigProvider;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class EasyConfiguration {
|
public class EasyConfiguration {
|
||||||
|
|
||||||
public static YamlConfigProvider from(File file, String source) {
|
public static YAMLConfigProvider from(File file, String source) {
|
||||||
YamlConfigProvider provider = new YamlConfigProvider(file);
|
YAMLConfigProvider provider = new YAMLConfigProvider(file);
|
||||||
try {
|
try {
|
||||||
provider.initializeFile(source);
|
provider.initializeFile(source);
|
||||||
provider.initializeConfig();
|
provider.initializeConfig();
|
||||||
@@ -18,15 +18,15 @@ public class EasyConfiguration {
|
|||||||
return provider;
|
return provider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static YamlConfigProvider from(File file) {
|
public static YAMLConfigProvider from(File file) {
|
||||||
return from(file, file.getName());
|
return from(file, file.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static YamlConfigProvider from(String fileName) {
|
public static YAMLConfigProvider from(String fileName) {
|
||||||
return from(fileName, fileName);
|
return from(fileName, fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static YamlConfigProvider from(String fileName, String source) {
|
public static YAMLConfigProvider from(String fileName, String source) {
|
||||||
return from(new File(fileName), source);
|
return from(new File(fileName), source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class YamlComments implements CommentsProvider {
|
public class YAMLComments implements CommentsProvider {
|
||||||
|
|
||||||
Map<String, String[]> comments = new HashMap<>();
|
Map<String, String[]> comments = new HashMap<>();
|
||||||
|
|
||||||
+7
-7
@@ -8,13 +8,13 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
public class YamlConfigProvider extends FileConfigProvider<YamlSectionWrapper> {
|
public class YAMLConfigProvider extends FileConfigProvider<YAMLSectionWrapper> {
|
||||||
|
|
||||||
protected final @NotNull YamlComments comments = new YamlComments();
|
protected final @NotNull YAMLComments comments = new YAMLComments();
|
||||||
protected CommentedYamlConfiguration configuration;
|
protected CommentedYamlConfiguration configuration;
|
||||||
protected ConfigInitializer<YamlConfigProvider> initializer;
|
protected ConfigInitializer<YAMLConfigProvider> initializer;
|
||||||
|
|
||||||
public YamlConfigProvider(@NotNull File file) {
|
public YAMLConfigProvider(@NotNull File file) {
|
||||||
super(file);
|
super(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,8 +24,8 @@ public class YamlConfigProvider extends FileConfigProvider<YamlSectionWrapper> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull YamlSectionWrapper getConfiguration() {
|
public @NotNull YAMLSectionWrapper getConfiguration() {
|
||||||
return YamlSectionWrapper.of(configuration);
|
return YAMLSectionWrapper.of(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -49,7 +49,7 @@ public class YamlConfigProvider extends FileConfigProvider<YamlSectionWrapper> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull ConfigInitializer<YamlConfigProvider> getInitializer() {
|
public @NotNull ConfigInitializer<YAMLConfigProvider> getInitializer() {
|
||||||
return this.initializer;
|
return this.initializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
+4
-4
@@ -12,17 +12,17 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class YamlSectionWrapper implements ConfigurationWrapper {
|
public class YAMLSectionWrapper implements ConfigurationWrapper {
|
||||||
|
|
||||||
private final ConfigurationSection section;
|
private final ConfigurationSection section;
|
||||||
|
|
||||||
private YamlSectionWrapper(ConfigurationSection section) {
|
private YAMLSectionWrapper(ConfigurationSection section) {
|
||||||
this.section = section;
|
this.section = section;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Contract("!null->!null")
|
@Contract("!null->!null")
|
||||||
public static @Nullable YamlSectionWrapper of(@Nullable ConfigurationSection section) {
|
public static @Nullable YAMLSectionWrapper of(@Nullable ConfigurationSection section) {
|
||||||
return section == null ? null : new YamlSectionWrapper(section);
|
return section == null ? null : new YAMLSectionWrapper(section);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -2,30 +2,28 @@ package cc.carm.lib.configuration.yaml;
|
|||||||
|
|
||||||
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
|
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
|
||||||
import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
|
import cc.carm.lib.configuration.core.value.impl.CachedConfigValue;
|
||||||
import cc.carm.lib.configuration.yaml.YamlConfigProvider;
|
import cc.carm.lib.configuration.yaml.builder.YAMLConfigBuilder;
|
||||||
import cc.carm.lib.configuration.yaml.YamlSectionWrapper;
|
|
||||||
import cc.carm.lib.configuration.yaml.builder.YamlConfigBuilder;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
public abstract class YAMLValue<T> extends CachedConfigValue<T> {
|
public abstract class YAMLValue<T> extends CachedConfigValue<T> {
|
||||||
|
|
||||||
public static @NotNull YamlConfigBuilder builder() {
|
public static @NotNull YAMLConfigBuilder builder() {
|
||||||
return new YamlConfigBuilder();
|
return new YAMLConfigBuilder();
|
||||||
}
|
}
|
||||||
|
|
||||||
public YAMLValue(@Nullable YamlConfigProvider provider,
|
public YAMLValue(@Nullable YAMLConfigProvider provider,
|
||||||
@Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) {
|
@Nullable String configPath, @NotNull String[] comments, @Nullable T defaultValue) {
|
||||||
super(provider, configPath, comments, defaultValue);
|
super(provider, configPath, comments, defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public YamlConfigProvider getYAMLProvider() {
|
public YAMLConfigProvider getYAMLProvider() {
|
||||||
ConfigurationProvider<?> provider = getProvider();
|
ConfigurationProvider<?> provider = getProvider();
|
||||||
if (provider instanceof YamlConfigProvider) return (YamlConfigProvider) getProvider();
|
if (provider instanceof YAMLConfigProvider) return (YAMLConfigProvider) getProvider();
|
||||||
else throw new IllegalStateException("Provider is not a SpigotConfigProvider");
|
else throw new IllegalStateException("Provider is not a YamlConfigProvider");
|
||||||
}
|
}
|
||||||
|
|
||||||
public YamlSectionWrapper getYAMLConfig() {
|
public YAMLSectionWrapper getYAMLConfig() {
|
||||||
return getYAMLProvider().getConfiguration();
|
return getYAMLProvider().getConfiguration();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,13 +1,13 @@
|
|||||||
package cc.carm.lib.configuration.yaml.builder;
|
package cc.carm.lib.configuration.yaml.builder;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder;
|
import cc.carm.lib.configuration.core.builder.AbstractConfigBuilder;
|
||||||
import cc.carm.lib.configuration.yaml.YamlConfigProvider;
|
import cc.carm.lib.configuration.yaml.YAMLConfigProvider;
|
||||||
|
|
||||||
public abstract class AbstractYAMLBuilder<T, B extends AbstractYAMLBuilder<T, B>>
|
public abstract class AbstractYAMLBuilder<T, B extends AbstractYAMLBuilder<T, B>>
|
||||||
extends AbstractConfigBuilder<T, B, YamlConfigProvider> {
|
extends AbstractConfigBuilder<T, B, YAMLConfigProvider> {
|
||||||
|
|
||||||
public AbstractYAMLBuilder() {
|
public AbstractYAMLBuilder() {
|
||||||
super(YamlConfigProvider.class);
|
super(YAMLConfigProvider.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@ import cc.carm.lib.configuration.yaml.builder.serializable.SerializableBuilder;
|
|||||||
import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable;
|
import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class YamlConfigBuilder extends ConfigBuilder {
|
public class YAMLConfigBuilder extends ConfigBuilder {
|
||||||
|
|
||||||
public <V extends ConfigurationSerializable> @NotNull SerializableBuilder<V> ofSerializable(@NotNull Class<V> valueClass) {
|
public <V extends ConfigurationSerializable> @NotNull SerializableBuilder<V> ofSerializable(@NotNull Class<V> valueClass) {
|
||||||
return new SerializableBuilder<>(valueClass);
|
return new SerializableBuilder<>(valueClass);
|
||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
package cc.carm.lib.configuration.yaml.value;
|
package cc.carm.lib.configuration.yaml.value;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.yaml.YAMLValue;
|
import cc.carm.lib.configuration.yaml.YAMLValue;
|
||||||
import cc.carm.lib.configuration.yaml.YamlConfigProvider;
|
import cc.carm.lib.configuration.yaml.YAMLConfigProvider;
|
||||||
import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable;
|
import org.bspfsystems.yamlconfiguration.serialization.ConfigurationSerializable;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -21,7 +21,7 @@ public class ConfiguredSerializable<T extends ConfigurationSerializable> extends
|
|||||||
|
|
||||||
protected final @NotNull Class<T> valueClass;
|
protected final @NotNull Class<T> valueClass;
|
||||||
|
|
||||||
public ConfiguredSerializable(@Nullable YamlConfigProvider provider,
|
public ConfiguredSerializable(@Nullable YAMLConfigProvider provider,
|
||||||
@Nullable String configPath, @NotNull String[] comments,
|
@Nullable String configPath, @NotNull String[] comments,
|
||||||
@NotNull Class<T> valueClass, @Nullable T defaultValue) {
|
@NotNull Class<T> valueClass, @Nullable T defaultValue) {
|
||||||
super(provider, configPath, comments, defaultValue);
|
super(provider, configPath, comments, defaultValue);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package config;
|
package config;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.EasyConfiguration;
|
import cc.carm.lib.configuration.EasyConfiguration;
|
||||||
import cc.carm.lib.configuration.yaml.YamlConfigProvider;
|
import cc.carm.lib.configuration.yaml.YAMLConfigProvider;
|
||||||
import config.model.AbstractModel;
|
import config.model.AbstractModel;
|
||||||
import config.model.SomeModel;
|
import config.model.SomeModel;
|
||||||
import config.model.TestModel;
|
import config.model.TestModel;
|
||||||
@@ -23,7 +23,7 @@ public class ConfigTester {
|
|||||||
ConfigurationSerialization.registerClass(SomeModel.class);
|
ConfigurationSerialization.registerClass(SomeModel.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final YamlConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml");
|
protected final YAMLConfigProvider provider = EasyConfiguration.from("target/config.yml", "config.yml");
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onTest() {
|
public void onTest() {
|
||||||
|
|||||||
@@ -15,10 +15,11 @@
|
|||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>1.2.0</version>
|
<version>2.1.0</version>
|
||||||
<modules>
|
<modules>
|
||||||
<module>core</module>
|
<module>core</module>
|
||||||
<module>impl/yaml</module>
|
<module>impl/yaml</module>
|
||||||
|
<module>impl/json</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<name>EasyConfiguration</name>
|
<name>EasyConfiguration</name>
|
||||||
@@ -163,7 +164,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
<version>3.3.2</version>
|
<version>3.4.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<classifier>javadoc</classifier>
|
<classifier>javadoc</classifier>
|
||||||
<detectJavaApiLink>false</detectJavaApiLink>
|
<detectJavaApiLink>false</detectJavaApiLink>
|
||||||
|
|||||||
Reference in New Issue
Block a user