Add config migration feature

This commit is contained in:
Frank van der Heijden 2021-07-24 18:21:30 +02:00
parent 5aeef212dc
commit 25fdec31b1
No known key found for this signature in database
GPG key ID: B808721C2DD5B5B8
16 changed files with 252 additions and 151 deletions

View file

@ -68,6 +68,11 @@ public class BukkitYamlConfig implements ServerUtilsConfig {
return config.getBoolean(path);
}
@Override
public int getInt(String path) {
return config.getInt(path, -1);
}
@Override
public Collection<? extends String> getKeys() {
return config.getKeys(false);

View file

@ -1,26 +1,34 @@
{
"commands": {
"serverutils": {
"subcommands": {
"enableplugin": {
"main": "enableplugin",
"aliases": ["ep"],
"aliases": [
"ep"
],
"permission": "serverutils.enableplugin",
"description": "Enables the specified plugin.",
"display-in-help": true
},
"disableplugin": {
"main": "disableplugin",
"aliases": ["dp"],
"aliases": [
"dp"
],
"permission": "serverutils.disableplugin",
"description": "Disables the specified plugin.",
"display-in-help": true
},
"reloadconfig": {
"main": "reloadconfig",
"aliases": ["rc"],
"aliases": [
"rc"
],
"permission": "serverutils.reloadconfig",
"description": "Reloads particular server configurations."
}
}
}
}
}

View file

@ -75,6 +75,11 @@ public class BungeeYamlConfig implements ServerUtilsConfig {
return config.getBoolean(path);
}
@Override
public int getInt(String path) {
return config.getInt(path, -1);
}
@Override
public Collection<? extends String> getKeys() {
return config.getKeys();

View file

@ -1,13 +1,17 @@
{
"commands": {
"plugins": {
"flags": {
"modules": {
"main": "modules",
"aliases": ["m"],
"aliases": [
"m"
],
"permission": "serverutils.plugins.modules",
"description": "Displays the proxy modules.",
"display-in-help": true
}
}
}
}
}

View file

@ -83,7 +83,7 @@ public abstract class CommandServerUtils<U extends ServerUtilsPlugin<P, ?, C, ?>
FormatBuilder builder = FormatBuilder.create(plugin.getMessagesResource().getMessage("serverutils.help.format"))
.orderedKeys("%command%", "%help%");
ServerUtilsConfig config = plugin.getCommandsResource().getConfig();
ServerUtilsConfig config = (ServerUtilsConfig) plugin.getCommandsResource().getConfig().get("commands");
for (String commandName : config.getKeys()) {
ServerUtilsConfig commandConfig = (ServerUtilsConfig) config.get(commandName);
CommandElement commandElement = parseElement(commandConfig);

View file

@ -23,7 +23,8 @@ public abstract class ServerUtilsCommand<U extends ServerUtilsPlugin<?, ?, C, ?>
protected ServerUtilsCommand(U plugin, String commandName) {
this.plugin = plugin;
this.commandName = commandName;
this.commandConfig = (ServerUtilsConfig) plugin.getCommandsResource().getConfig().get(commandName);
this.commandConfig = (ServerUtilsConfig) plugin.getCommandsResource().getConfig()
.get("commands." + commandName);
this.arguments = new HashMap<>();
}

View file

@ -12,4 +12,9 @@ public class CommandsResource extends ServerUtilsResource {
public CommandsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
super(plugin, COMMANDS_RESOURCE);
}
@Override
public void migrate(int currentConfigVersion) {
}
}

View file

@ -9,4 +9,9 @@ public class ConfigResource extends ServerUtilsResource {
public ConfigResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
super(plugin, CONFIG_RESOURCE);
}
@Override
public void migrate(int currentConfigVersion) {
}
}

View file

@ -8,13 +8,17 @@ import com.google.gson.JsonPrimitive;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
import net.frankheijden.serverutils.common.providers.ResourceProvider;
public class JsonConfig implements ServerUtilsConfig {
@ -32,11 +36,34 @@ public class JsonConfig implements ServerUtilsConfig {
this.config = config;
}
/**
* Loads a resource from the jar file.
*/
public static JsonConfig load(ResourceProvider provider, ServerUtilsPlugin.Platform platform, String resourceName) {
// Create the platform JsonConfig by merging the platformConfig with the generalConfig
JsonConfig generalConfig = new JsonConfig(JsonConfig.gson.fromJson(
new InputStreamReader(provider.getRawResource(resourceName + ".json")),
JsonObject.class
));
String platformResource = platform.name().toLowerCase(Locale.ENGLISH) + '-' + resourceName;
JsonConfig platformConfig = new JsonConfig(JsonConfig.gson.fromJson(
new InputStreamReader(provider.getRawResource(platformResource + ".json")),
JsonObject.class
));
ServerUtilsConfig.addDefaults(platformConfig, generalConfig);
return generalConfig;
}
public JsonObject getConfig() {
return config;
}
private JsonElement getJsonElement(String path) {
/**
* Retrieves the JsonElement at given path.
*/
public JsonElement getJsonElement(String path) {
JsonElement result = config;
for (String memberName : path.split("\\.")) {
@ -137,6 +164,13 @@ public class JsonConfig implements ServerUtilsConfig {
return element.getAsBoolean();
}
@Override
public int getInt(String path) {
JsonElement element = getJsonElement(path);
if (element == null) return -1;
return element.getAsNumber().intValue();
}
@Override
public Collection<? extends String> getKeys() {
return config.keySet();

View file

@ -53,4 +53,11 @@ public class MessagesResource extends ServerUtilsResource {
sender.sendMessage(plugin.getChatProvider().color(message));
}
}
@Override
public void migrate(int currentConfigVersion) {
if (currentConfigVersion <= 1) {
reset("serverutils.help.format");
}
}
}

View file

@ -1,17 +1,12 @@
package net.frankheijden.serverutils.common.config;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.frankheijden.serverutils.common.entities.ServerCommandSender;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
import net.frankheijden.serverutils.common.providers.ResourceProvider;
/**
@ -61,6 +56,13 @@ public interface ServerUtilsConfig {
*/
boolean getBoolean(String path);
/**
* Retrieves an integer from a path.
* @param path The path.
* @return The integer at given path.
*/
int getInt(String path);
/**
* Retrieves the key nodes at the current level.
* @return The keys.
@ -146,28 +148,13 @@ public interface ServerUtilsConfig {
}
/**
* Loads a resource from the jar file.
* Loads a resource from the jar file and writes it to the given path, applying defaults if needed.
*/
static <U extends ServerUtilsPlugin<P, T, C, S>, P, T, C extends ServerCommandSender<S>, S> ServerUtilsConfig load(
U plugin,
Path path,
String resource
static ServerUtilsConfig init(
ServerUtilsConfig def,
ResourceProvider provider,
Path path
) {
ResourceProvider provider = plugin.getResourceProvider();
// Create the platform JsonConfig by merging the platformResource with the common resource
JsonConfig generalConfig = new JsonConfig(JsonConfig.gson.fromJson(
new InputStreamReader(provider.getRawResource(resource + ".json")),
JsonObject.class
));
String platformResource = plugin.getPlatform().name().toLowerCase(Locale.ENGLISH) + '-' + resource;
JsonConfig platformConfig = new JsonConfig(JsonConfig.gson.fromJson(
new InputStreamReader(provider.getRawResource(platformResource + ".json")),
JsonObject.class
));
addDefaults(platformConfig, generalConfig);
if (!Files.exists(path)) {
try {
Files.createFile(path);
@ -176,6 +163,6 @@ public interface ServerUtilsConfig {
}
}
return init(generalConfig, provider.load(path.toFile()));
return init(def, provider.load(path.toFile()));
}
}

View file

@ -1,31 +1,61 @@
package net.frankheijden.serverutils.common.config;
import java.io.IOException;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
public class ServerUtilsResource {
public abstract class ServerUtilsResource {
protected final ServerUtilsPlugin<?, ?, ?, ?> plugin;
protected final ServerUtilsConfig config;
protected final JsonConfig defaultConfig;
protected ServerUtilsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin, ServerUtilsConfig config) {
protected ServerUtilsResource(
ServerUtilsPlugin<?, ?, ?, ?> plugin,
ServerUtilsConfig config,
JsonConfig defaultConfig
) {
this.plugin = plugin;
this.config = config;
this.defaultConfig = defaultConfig;
}
protected ServerUtilsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin, String resourceName) {
this(
plugin,
ServerUtilsConfig.load(
plugin,
this.plugin = plugin;
this.defaultConfig = JsonConfig.load(plugin.getResourceProvider(), plugin.getPlatform(), resourceName);
this.config = ServerUtilsConfig.init(
this.defaultConfig,
plugin.getResourceProvider(),
plugin.getDataFolder().toPath().resolve(
resourceName + plugin.getResourceProvider().getResourceExtension()
),
resourceName
)
);
this.migrate();
}
public ServerUtilsConfig getConfig() {
return config;
}
public ServerUtilsConfig getDefaultConfig() {
return defaultConfig;
}
protected void reset(String path) {
config.set(path, JsonConfig.toObjectValue(defaultConfig.getJsonElement(path)));
}
/**
* Migrates values in the config.
*/
public void migrate() {
migrate(config.getInt("config-version"));
config.set("config-version", defaultConfig.getInt("config-version"));
try {
config.save();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public abstract void migrate(int currentConfigVersion);
}

View file

@ -1,4 +1,6 @@
{
"config-version": 1,
"commands": {
"plugins": {
"main": "%prefix%plugins",
"aliases": ["%prefix%pl"],
@ -86,4 +88,5 @@
}
}
}
}
}

View file

@ -1,4 +1,5 @@
{
"config-version": 1,
"settings": {
"disable-plugins-command": false,
"check-updates-boot": true,

View file

@ -1,4 +1,5 @@
{
"config-version": 2,
"serverutils": {
"success": "&3Successfully %action%ed &b%what%&3!",
"warning": "&3Successfully %action%ed &b%what%&3, but with warnings.",

View file

@ -74,6 +74,11 @@ public class VelocityTomlConfig implements ServerUtilsConfig {
return config.get(path);
}
@Override
public int getInt(String path) {
return config.getOrElse(path, -1);
}
@Override
public Collection<? extends String> getKeys() {
return new HashSet<>(config.valueMap().keySet());