aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitServerConfigProvider.java69
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/AbstractServerConfigProvider.java97
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ConfigParser.java7
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ExcludedConfigFilter.java97
-rw-r--r--spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/PropertiesConfigParser.java16
5 files changed, 162 insertions, 124 deletions
diff --git a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitServerConfigProvider.java b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitServerConfigProvider.java
index bc1bdf8..f822015 100644
--- a/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitServerConfigProvider.java
+++ b/spark-bukkit/src/main/java/me/lucko/spark/bukkit/BukkitServerConfigProvider.java
@@ -22,12 +22,15 @@ package me.lucko.spark.bukkit;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
+import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
import com.google.gson.JsonSerializer;
import me.lucko.spark.common.platform.serverconfig.AbstractServerConfigProvider;
import me.lucko.spark.common.platform.serverconfig.ConfigParser;
+import me.lucko.spark.common.platform.serverconfig.ExcludedConfigFilter;
import me.lucko.spark.common.platform.serverconfig.PropertiesConfigParser;
import org.bukkit.Bukkit;
@@ -45,6 +48,7 @@ import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -59,13 +63,21 @@ public class BukkitServerConfigProvider extends AbstractServerConfigProvider {
super(FILES, HIDDEN_PATHS);
}
- @Override
- protected void customiseGson(GsonBuilder gson) {
- gson.registerTypeAdapter(MemorySection.class, (JsonSerializer<MemorySection>) (obj, type, ctx) -> ctx.serialize(obj.getValues(false)));
- }
-
private static class YamlConfigParser implements ConfigParser {
public static final YamlConfigParser INSTANCE = new YamlConfigParser();
+ protected static final Gson GSON = new GsonBuilder()
+ .registerTypeAdapter(MemorySection.class, (JsonSerializer<MemorySection>) (obj, type, ctx) -> ctx.serialize(obj.getValues(false)))
+ .create();
+
+ @Override
+ public JsonElement load(String file, ExcludedConfigFilter filter) throws IOException {
+ Map<String, Object> values = this.parse(Paths.get(file));
+ if (values == null) {
+ return null;
+ }
+
+ return filter.apply(GSON.toJsonTree(values));
+ }
@Override
public Map<String, Object> parse(BufferedReader reader) throws IOException {
@@ -79,37 +91,40 @@ public class BukkitServerConfigProvider extends AbstractServerConfigProvider {
public static final SplitYamlConfigParser INSTANCE = new SplitYamlConfigParser();
@Override
- public Map<String, Object> parse(String prefix) throws IOException {
+ public JsonElement load(String group, ExcludedConfigFilter filter) throws IOException {
+ String prefix = group.replace("/", "");
+
Path configDir = Paths.get("config");
if (!Files.exists(configDir)) {
return null;
}
- Map<String, Object> configs = Maps.newHashMap();
+ JsonObject root = new JsonObject();
- parseIfExists(configs,
- "global.yml",
- configDir.resolve(prefix + "-global.yml")
- );
- parseIfExists(configs,
- "world-defaults.yml",
- configDir.resolve(prefix + "-world-defaults.yml")
- );
- for (World world : Bukkit.getWorlds()) {
- parseIfExists(configs,
- world.getName() + ".yml",
- world.getWorldFolder().toPath().resolve(prefix + "-world.yml")
- );
+ for (Map.Entry<String, Path> entry : getNestedFiles(configDir, prefix).entrySet()) {
+ String fileName = entry.getKey();
+ Path path = entry.getValue();
+
+ Map<String, Object> values = this.parse(path);
+ if (values == null) {
+ continue;
+ }
+
+ // apply the filter individually to each nested file
+ root.add(fileName, filter.apply(GSON.toJsonTree(values)));
}
- return configs;
+ return root;
}
- private void parseIfExists(Map<String, Object> configs, String name, Path path) throws IOException {
- Map<String, Object> values = parse(path);
- if (values != null) {
- configs.put(name, values);
+ private static Map<String, Path> getNestedFiles(Path configDir, String prefix) {
+ Map<String, Path> files = new LinkedHashMap<>();
+ files.put("global.yml", configDir.resolve(prefix + "-global.yml"));
+ files.put("world-defaults.yml", configDir.resolve(prefix + "-world-defaults.yml"));
+ for (World world : Bukkit.getWorlds()) {
+ files.put(world.getName() + ".yml", world.getWorldFolder().toPath().resolve(prefix + "-world.yml"));
}
+ return files;
}
}
@@ -119,7 +134,7 @@ public class BukkitServerConfigProvider extends AbstractServerConfigProvider {
.put("bukkit.yml", YamlConfigParser.INSTANCE)
.put("spigot.yml", YamlConfigParser.INSTANCE)
.put("paper.yml", YamlConfigParser.INSTANCE)
- .put("paper", SplitYamlConfigParser.INSTANCE)
+ .put("paper/", SplitYamlConfigParser.INSTANCE)
.put("purpur.yml", YamlConfigParser.INSTANCE);
for (String config : getSystemPropertyList("spark.serverconfigs.extra")) {
diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/AbstractServerConfigProvider.java b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/AbstractServerConfigProvider.java
index 5a14382..501851a 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/AbstractServerConfigProvider.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/AbstractServerConfigProvider.java
@@ -21,24 +21,10 @@
package me.lucko.spark.common.platform.serverconfig;
import com.google.common.collect.ImmutableMap;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
-import java.util.Deque;
-import java.util.LinkedList;
import java.util.Map;
-import java.util.stream.Collectors;
/**
* Abstract implementation of {@link ServerConfigProvider}.
@@ -48,31 +34,23 @@ import java.util.stream.Collectors;
*/
public abstract class AbstractServerConfigProvider implements ServerConfigProvider {
private final Map<String, ConfigParser> files;
- private final Collection<String> hiddenPaths;
-
- private final Gson gson;
+ private final ExcludedConfigFilter hiddenPathFilters;
protected AbstractServerConfigProvider(Map<String, ConfigParser> files, Collection<String> hiddenPaths) {
this.files = files;
- this.hiddenPaths = hiddenPaths;
-
- GsonBuilder gson = new GsonBuilder();
- customiseGson(gson);
- this.gson = gson.create();
+ this.hiddenPathFilters = new ExcludedConfigFilter(hiddenPaths);
}
@Override
public final Map<String, JsonElement> loadServerConfigurations() {
ImmutableMap.Builder<String, JsonElement> builder = ImmutableMap.builder();
- this.files.forEach((path, reader) -> {
+ this.files.forEach((path, parser) -> {
try {
- JsonElement json = load(path, reader);
+ JsonElement json = parser.load(path, this.hiddenPathFilters);
if (json == null) {
return;
}
-
- delete(json, this.hiddenPaths);
builder.put(path, json);
} catch (Exception e) {
e.printStackTrace();
@@ -82,71 +60,4 @@ public abstract class AbstractServerConfigProvider implements ServerConfigProvid
return builder.build();
}
- private JsonElement load(String path, ConfigParser parser) throws IOException {
- Map<String, Object> values = parser.parse(path);
- if (values == null) {
- return null;
- }
-
- return this.gson.toJsonTree(values);
- }
-
- protected void customiseGson(GsonBuilder gson) {
-
- }
-
- /**
- * Deletes the given paths from the json element.
- *
- * @param json the json element
- * @param paths the paths to delete
- */
- private static void delete(JsonElement json, Collection<String> paths) {
- for (String path : paths) {
- Deque<String> pathDeque = new LinkedList<>(Arrays.asList(path.split("\\.")));
- delete(json, pathDeque);
- }
- }
-
- private static void delete(JsonElement json, Deque<String> path) {
- if (path.isEmpty()) {
- return;
- }
- if (!json.isJsonObject()) {
- return;
- }
-
- JsonObject jsonObject = json.getAsJsonObject();
- String expected = path.removeFirst().replace("<dot>", ".");
-
- Collection<String> keys;
- if (expected.equals("*")) {
- keys = jsonObject.entrySet().stream()
- .map(Map.Entry::getKey)
- .collect(Collectors.toList());
- } else if (expected.endsWith("*")) {
- String pattern = expected.substring(0, expected.length() - 1);
- keys = jsonObject.entrySet().stream()
- .map(Map.Entry::getKey)
- .filter(key -> key.startsWith(pattern))
- .collect(Collectors.toList());
- } else if (jsonObject.has(expected)) {
- keys = Collections.singletonList(expected);
- } else {
- keys = Collections.emptyList();
- }
-
- for (String key : keys) {
- if (path.isEmpty()) {
- jsonObject.remove(key);
- } else {
- Deque<String> pathCopy = keys.size() > 1
- ? new LinkedList<>(path)
- : path;
-
- delete(jsonObject.get(key), pathCopy);
- }
- }
- }
-
}
diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ConfigParser.java b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ConfigParser.java
index dfbf816..675a32e 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ConfigParser.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ConfigParser.java
@@ -20,19 +20,18 @@
package me.lucko.spark.common.platform.serverconfig;
+import com.google.gson.JsonElement;
+
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Map;
public interface ConfigParser {
- default Map<String, Object> parse(String file) throws IOException {
- return parse(Paths.get(file));
- }
+ JsonElement load(String file, ExcludedConfigFilter filter) throws IOException;
default Map<String, Object> parse(Path file) throws IOException {
if (!Files.exists(file)) {
diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ExcludedConfigFilter.java b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ExcludedConfigFilter.java
new file mode 100644
index 0000000..c11c7f8
--- /dev/null
+++ b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/ExcludedConfigFilter.java
@@ -0,0 +1,97 @@
+/*
+ * This file is part of spark.
+ *
+ * Copyright (c) lucko (Luck) <luck@lucko.me>
+ * Copyright (c) contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package me.lucko.spark.common.platform.serverconfig;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * Filtered excluded paths from {@link JsonElement}s (parsed configuration files).
+ */
+public class ExcludedConfigFilter {
+ private final Collection<String> pathsToExclude;
+
+ public ExcludedConfigFilter(Collection<String> pathsToExclude) {
+ this.pathsToExclude = pathsToExclude;
+ }
+
+ /**
+ * Deletes the excluded paths from the json element.
+ *
+ * @param json the json element
+ */
+ public JsonElement apply(JsonElement json) {
+ for (String path : this.pathsToExclude) {
+ Deque<String> pathDeque = new LinkedList<>(Arrays.asList(path.split("\\.")));
+ delete(json, pathDeque);
+ }
+ return json;
+ }
+
+ private static void delete(JsonElement json, Deque<String> path) {
+ if (path.isEmpty()) {
+ return;
+ }
+ if (!json.isJsonObject()) {
+ return;
+ }
+
+ JsonObject jsonObject = json.getAsJsonObject();
+ String expected = path.removeFirst().replace("<dot>", ".");
+
+ Collection<String> keys;
+ if (expected.equals("*")) {
+ keys = jsonObject.entrySet().stream()
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toList());
+ } else if (expected.endsWith("*")) {
+ String pattern = expected.substring(0, expected.length() - 1);
+ keys = jsonObject.entrySet().stream()
+ .map(Map.Entry::getKey)
+ .filter(key -> key.startsWith(pattern))
+ .collect(Collectors.toList());
+ } else if (jsonObject.has(expected)) {
+ keys = Collections.singletonList(expected);
+ } else {
+ keys = Collections.emptyList();
+ }
+
+ for (String key : keys) {
+ if (path.isEmpty()) {
+ jsonObject.remove(key);
+ } else {
+ Deque<String> pathCopy = keys.size() > 1
+ ? new LinkedList<>(path)
+ : path;
+
+ delete(jsonObject.get(key), pathCopy);
+ }
+ }
+ }
+}
diff --git a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/PropertiesConfigParser.java b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/PropertiesConfigParser.java
index 4c7c2c1..344ba1c 100644
--- a/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/PropertiesConfigParser.java
+++ b/spark-common/src/main/java/me/lucko/spark/common/platform/serverconfig/PropertiesConfigParser.java
@@ -20,8 +20,12 @@
package me.lucko.spark.common.platform.serverconfig;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+
import java.io.BufferedReader;
import java.io.IOException;
+import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
@@ -32,6 +36,18 @@ import java.util.Properties;
public enum PropertiesConfigParser implements ConfigParser {
INSTANCE;
+ private static final Gson GSON = new Gson();
+
+ @Override
+ public JsonElement load(String file, ExcludedConfigFilter filter) throws IOException {
+ Map<String, Object> values = this.parse(Paths.get(file));
+ if (values == null) {
+ return null;
+ }
+
+ return filter.apply(GSON.toJsonTree(values));
+ }
+
@Override
public Map<String, Object> parse(BufferedReader reader) throws IOException {
Properties properties = new Properties();