Add config migration feature
This commit is contained in:
parent
5aeef212dc
commit
25fdec31b1
16 changed files with 252 additions and 151 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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<>();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,4 +12,9 @@ public class CommandsResource extends ServerUtilsResource {
|
|||
public CommandsResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
|
||||
super(plugin, COMMANDS_RESOURCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void migrate(int currentConfigVersion) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,4 +9,9 @@ public class ConfigResource extends ServerUtilsResource {
|
|||
public ConfigResource(ServerUtilsPlugin<?, ?, ?, ?> plugin) {
|
||||
super(plugin, CONFIG_RESOURCE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void migrate(int currentConfigVersion) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
plugin.getDataFolder().toPath().resolve(
|
||||
resourceName + plugin.getResourceProvider().getResourceExtension()
|
||||
),
|
||||
resourceName
|
||||
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()
|
||||
)
|
||||
);
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue