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); return config.getBoolean(path);
} }
@Override
public int getInt(String path) {
return config.getInt(path, -1);
}
@Override @Override
public Collection<? extends String> getKeys() { public Collection<? extends String> getKeys() {
return config.getKeys(false); return config.getKeys(false);

View file

@ -1,25 +1,33 @@
{ {
"serverutils": { "commands": {
"subcommands": { "serverutils": {
"enableplugin": { "subcommands": {
"main": "enableplugin", "enableplugin": {
"aliases": ["ep"], "main": "enableplugin",
"permission": "serverutils.enableplugin", "aliases": [
"description": "Enables the specified plugin.", "ep"
"display-in-help": true ],
}, "permission": "serverutils.enableplugin",
"disableplugin": { "description": "Enables the specified plugin.",
"main": "disableplugin", "display-in-help": true
"aliases": ["dp"], },
"permission": "serverutils.disableplugin", "disableplugin": {
"description": "Disables the specified plugin.", "main": "disableplugin",
"display-in-help": true "aliases": [
}, "dp"
"reloadconfig": { ],
"main": "reloadconfig", "permission": "serverutils.disableplugin",
"aliases": ["rc"], "description": "Disables the specified plugin.",
"permission": "serverutils.reloadconfig", "display-in-help": true
"description": "Reloads particular server configurations." },
"reloadconfig": {
"main": "reloadconfig",
"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); return config.getBoolean(path);
} }
@Override
public int getInt(String path) {
return config.getInt(path, -1);
}
@Override @Override
public Collection<? extends String> getKeys() { public Collection<? extends String> getKeys() {
return config.getKeys(); return config.getKeys();

View file

@ -1,12 +1,16 @@
{ {
"plugins": { "commands": {
"flags": { "plugins": {
"modules": { "flags": {
"main": "modules", "modules": {
"aliases": ["m"], "main": "modules",
"permission": "serverutils.plugins.modules", "aliases": [
"description": "Displays the proxy modules.", "m"
"display-in-help": true ],
"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")) FormatBuilder builder = FormatBuilder.create(plugin.getMessagesResource().getMessage("serverutils.help.format"))
.orderedKeys("%command%", "%help%"); .orderedKeys("%command%", "%help%");
ServerUtilsConfig config = plugin.getCommandsResource().getConfig(); ServerUtilsConfig config = (ServerUtilsConfig) plugin.getCommandsResource().getConfig().get("commands");
for (String commandName : config.getKeys()) { for (String commandName : config.getKeys()) {
ServerUtilsConfig commandConfig = (ServerUtilsConfig) config.get(commandName); ServerUtilsConfig commandConfig = (ServerUtilsConfig) config.get(commandName);
CommandElement commandElement = parseElement(commandConfig); CommandElement commandElement = parseElement(commandConfig);

View file

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

View file

@ -12,4 +12,9 @@ public class CommandsResource extends ServerUtilsResource {
public CommandsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) { public CommandsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
super(plugin, COMMANDS_RESOURCE); 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) { public ConfigResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
super(plugin, CONFIG_RESOURCE); 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 com.google.gson.reflect.TypeToken;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
import net.frankheijden.serverutils.common.providers.ResourceProvider;
public class JsonConfig implements ServerUtilsConfig { public class JsonConfig implements ServerUtilsConfig {
@ -32,11 +36,34 @@ public class JsonConfig implements ServerUtilsConfig {
this.config = config; 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() { public JsonObject getConfig() {
return config; return config;
} }
private JsonElement getJsonElement(String path) { /**
* Retrieves the JsonElement at given path.
*/
public JsonElement getJsonElement(String path) {
JsonElement result = config; JsonElement result = config;
for (String memberName : path.split("\\.")) { for (String memberName : path.split("\\.")) {
@ -137,6 +164,13 @@ public class JsonConfig implements ServerUtilsConfig {
return element.getAsBoolean(); return element.getAsBoolean();
} }
@Override
public int getInt(String path) {
JsonElement element = getJsonElement(path);
if (element == null) return -1;
return element.getAsNumber().intValue();
}
@Override @Override
public Collection<? extends String> getKeys() { public Collection<? extends String> getKeys() {
return config.keySet(); return config.keySet();

View file

@ -53,4 +53,11 @@ public class MessagesResource extends ServerUtilsResource {
sender.sendMessage(plugin.getChatProvider().color(message)); 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; package net.frankheijden.serverutils.common.config;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; 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; import net.frankheijden.serverutils.common.providers.ResourceProvider;
/** /**
@ -61,6 +56,13 @@ public interface ServerUtilsConfig {
*/ */
boolean getBoolean(String path); 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. * Retrieves the key nodes at the current level.
* @return The keys. * @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( static ServerUtilsConfig init(
U plugin, ServerUtilsConfig def,
Path path, ResourceProvider provider,
String resource 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)) { if (!Files.exists(path)) {
try { try {
Files.createFile(path); 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; package net.frankheijden.serverutils.common.config;
import java.io.IOException;
import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin; import net.frankheijden.serverutils.common.entities.ServerUtilsPlugin;
public class ServerUtilsResource { public abstract class ServerUtilsResource {
protected final ServerUtilsPlugin<?, ?, ?, ?> plugin; protected final ServerUtilsPlugin<?, ?, ?, ?> plugin;
protected final ServerUtilsConfig config; 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.plugin = plugin;
this.config = config; this.config = config;
this.defaultConfig = defaultConfig;
} }
protected ServerUtilsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin, String resourceName) { protected ServerUtilsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin, String resourceName) {
this( this.plugin = plugin;
plugin, this.defaultConfig = JsonConfig.load(plugin.getResourceProvider(), plugin.getPlatform(), resourceName);
ServerUtilsConfig.load( this.config = ServerUtilsConfig.init(
plugin, this.defaultConfig,
plugin.getDataFolder().toPath().resolve( plugin.getResourceProvider(),
resourceName + plugin.getResourceProvider().getResourceExtension() plugin.getDataFolder().toPath().resolve(
), resourceName + plugin.getResourceProvider().getResourceExtension()
resourceName
) )
); );
this.migrate();
} }
public ServerUtilsConfig getConfig() { public ServerUtilsConfig getConfig() {
return config; 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,88 +1,91 @@
{ {
"plugins": { "config-version": 1,
"main": "%prefix%plugins", "commands": {
"aliases": ["%prefix%pl"], "plugins": {
"permission": "serverutils.plugins", "main": "%prefix%plugins",
"description": "Displays the enabled plugins.", "aliases": ["%prefix%pl"],
"display-in-help": true, "permission": "serverutils.plugins",
"flags": { "description": "Displays the enabled plugins.",
"version": { "display-in-help": true,
"main": "version", "flags": {
"aliases": ["v"], "version": {
"permission": "serverutils.plugins.version", "main": "version",
"description": "Displays the plugin versions.", "aliases": ["v"],
"display-in-help": true "permission": "serverutils.plugins.version",
"description": "Displays the plugin versions.",
"display-in-help": true
}
} }
} },
}, "serverutils": {
"serverutils": { "main": "%prefix%serverutils",
"main": "%prefix%serverutils", "aliases": ["%prefix%su"],
"aliases": ["%prefix%su"], "permission": "serverutils.help",
"permission": "serverutils.help", "display-in-help": false,
"display-in-help": false, "subcommands": {
"subcommands": { "help": {
"help": { "main": "help",
"main": "help", "aliases": [],
"aliases": [], "permission": "serverutils.help",
"permission": "serverutils.help", "description": "Displays the help page.",
"description": "Displays the help page.", "display-in-help": true
"display-in-help": true },
}, "reload": {
"reload": { "main": "reload",
"main": "reload", "aliases": [],
"aliases": [], "permission": "serverutils.reload",
"permission": "serverutils.reload", "description": "Reloads the ServerUtils plugin.",
"description": "Reloads the ServerUtils plugin.", "display-in-help": true
"display-in-help": true },
}, "loadplugin": {
"loadplugin": { "main": "loadplugin",
"main": "loadplugin", "aliases": ["lp"],
"aliases": ["lp"], "permission": "serverutils.loadplugin",
"permission": "serverutils.loadplugin", "description": "Loads the specified jar file as a plugin.",
"description": "Loads the specified jar file as a plugin.", "display-in-help": true
"display-in-help": true },
}, "unloadplugin": {
"unloadplugin": { "main": "unloadplugin",
"main": "unloadplugin", "aliases": ["up"],
"aliases": ["up"], "permission": "serverutils.unloadplugin",
"permission": "serverutils.unloadplugin", "description": "Disables and unloads the specified plugin.",
"description": "Disables and unloads the specified plugin.", "display-in-help": true
"display-in-help": true },
}, "reloadplugin": {
"reloadplugin": { "main": "reloadplugin",
"main": "reloadplugin", "aliases": ["rp"],
"aliases": ["rp"], "permission": "serverutils.reloadplugin",
"permission": "serverutils.reloadplugin", "description": "Reloads the specified plugin.",
"description": "Reloads the specified plugin.", "display-in-help": true
"display-in-help": true },
}, "watchplugin": {
"watchplugin": { "main": "watchplugin",
"main": "watchplugin", "aliases": ["wp"],
"aliases": ["wp"], "permission": "serverutils.watchplugin",
"permission": "serverutils.watchplugin", "description": "Watches the specified plugin for changes.",
"description": "Watches the specified plugin for changes.", "display-in-help": true
"display-in-help": true },
}, "unwatchplugin": {
"unwatchplugin": { "main": "unwatchplugin",
"main": "unwatchplugin", "aliases": ["uwp"],
"aliases": ["uwp"], "permission": "serverutils.watchplugin",
"permission": "serverutils.watchplugin", "description": "Stops watching the specified plugin for changes.",
"description": "Stops watching the specified plugin for changes.", "display-in-help": true
"display-in-help": true },
}, "plugininfo": {
"plugininfo": { "main": "plugininfo",
"main": "plugininfo", "aliases": ["pi"],
"aliases": ["pi"], "permission": "serverutils.plugininfo",
"permission": "serverutils.plugininfo", "description": "Shows information about the specified plugin.",
"description": "Shows information about the specified plugin.", "display-in-help": true
"display-in-help": true },
}, "commandinfo": {
"commandinfo": { "main": "commandinfo",
"main": "commandinfo", "aliases": ["ci"],
"aliases": ["ci"], "permission": "serverutils.commandinfo",
"permission": "serverutils.commandinfo", "description": "Shows information about the specified command.",
"description": "Shows information about the specified command.", "display-in-help": true
"display-in-help": true }
} }
} }
} }

View file

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

View file

@ -1,4 +1,5 @@
{ {
"config-version": 2,
"serverutils": { "serverutils": {
"success": "&3Successfully %action%ed &b%what%&3!", "success": "&3Successfully %action%ed &b%what%&3!",
"warning": "&3Successfully %action%ed &b%what%&3, but with warnings.", "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); return config.get(path);
} }
@Override
public int getInt(String path) {
return config.getOrElse(path, -1);
}
@Override @Override
public Collection<? extends String> getKeys() { public Collection<? extends String> getKeys() {
return new HashSet<>(config.valueMap().keySet()); return new HashSet<>(config.valueMap().keySet());