[FEATURE] ConfigManager

This commit is contained in:
Gravit 2019-04-03 17:09:53 +07:00
parent e9f36fa44f
commit a636fbe336
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
10 changed files with 152 additions and 30 deletions

View file

@ -4,7 +4,9 @@
import com.google.gson.GsonBuilder; import com.google.gson.GsonBuilder;
import ru.gravit.launcher.Launcher; import ru.gravit.launcher.Launcher;
import ru.gravit.launcher.LauncherConfig; import ru.gravit.launcher.LauncherConfig;
import ru.gravit.launcher.NeedGarbageCollection;
import ru.gravit.launcher.hasher.HashedDir; import ru.gravit.launcher.hasher.HashedDir;
import ru.gravit.launcher.managers.ConfigManager;
import ru.gravit.launcher.managers.GarbageManager; import ru.gravit.launcher.managers.GarbageManager;
import ru.gravit.launcher.profiles.ClientProfile; import ru.gravit.launcher.profiles.ClientProfile;
import ru.gravit.launcher.serialize.signed.SignedObjectHolder; import ru.gravit.launcher.serialize.signed.SignedObjectHolder;
@ -22,10 +24,11 @@
import ru.gravit.launchserver.auth.provider.RejectAuthProvider; import ru.gravit.launchserver.auth.provider.RejectAuthProvider;
import ru.gravit.launchserver.binary.*; import ru.gravit.launchserver.binary.*;
import ru.gravit.launchserver.components.Component; import ru.gravit.launchserver.components.Component;
import ru.gravit.utils.config.JsonConfigurable;
import ru.gravit.launchserver.config.adapter.*;
import ru.gravit.utils.command.CommandHandler; import ru.gravit.utils.command.CommandHandler;
import ru.gravit.utils.command.JLineCommandHandler; import ru.gravit.utils.command.JLineCommandHandler;
import ru.gravit.utils.command.StdCommandHandler; import ru.gravit.utils.command.StdCommandHandler;
import ru.gravit.launchserver.config.*;
import ru.gravit.launchserver.manangers.*; import ru.gravit.launchserver.manangers.*;
import ru.gravit.launchserver.manangers.hook.AuthHookManager; import ru.gravit.launchserver.manangers.hook.AuthHookManager;
import ru.gravit.launchserver.manangers.hook.BuildHookManager; import ru.gravit.launchserver.manangers.hook.BuildHookManager;
@ -360,6 +363,8 @@ public static void main(String... args) throws Throwable {
public final ReconfigurableManager reconfigurableManager; public final ReconfigurableManager reconfigurableManager;
public final ConfigManager configManager;
public final BuildHookManager buildHookManager; public final BuildHookManager buildHookManager;
@ -487,32 +492,15 @@ public LaunchServer(Path dir, String[] args) throws IOException, InvalidKeySpecE
reconfigurableManager = new ReconfigurableManager(); reconfigurableManager = new ReconfigurableManager();
socketHookManager = new SocketHookManager(); socketHookManager = new SocketHookManager();
authHookManager = new AuthHookManager(); authHookManager = new AuthHookManager();
configManager = new ConfigManager();
GarbageManager.registerNeedGC(sessionManager); GarbageManager.registerNeedGC(sessionManager);
reloadManager.registerReloadable("launchServer", this); reloadManager.registerReloadable("launchServer", this);
if (config.permissionsHandler instanceof Reloadable) registerObject("permissionsHandler", config.permissionsHandler);
reloadManager.registerReloadable("permissionsHandler", (Reloadable) config.permissionsHandler);
for (int i = 0; i < config.auth.length; ++i) { for (int i = 0; i < config.auth.length; ++i) {
AuthProviderPair pair = config.auth[i]; AuthProviderPair pair = config.auth[i];
if (pair.provider instanceof Reloadable) registerObject("auth.".concat(pair.name).concat(".provider"), pair.provider);
reloadManager.registerReloadable("auth.".concat(pair.name).concat(".provider"), (Reloadable) pair.provider); registerObject("auth.".concat(pair.name).concat(".handler"), pair.handler);
if (pair.handler instanceof Reloadable) registerObject("auth.".concat(pair.name).concat(".texture"), pair.textureProvider);
reloadManager.registerReloadable("auth.".concat(pair.name).concat(".handler"), (Reloadable) pair.handler);
if (pair.textureProvider instanceof Reloadable)
reloadManager.registerReloadable("auth.".concat(pair.name).concat(".texture"), (Reloadable) pair.textureProvider);
}
Arrays.stream(config.mirrors).forEach(mirrorManager::addMirror);
if (config.permissionsHandler instanceof Reconfigurable)
reconfigurableManager.registerReconfigurable("permissionsHandler", (Reconfigurable) config.permissionsHandler);
for (int i = 0; i < config.auth.length; ++i) {
AuthProviderPair pair = config.auth[i];
if (pair.provider instanceof Reconfigurable)
reconfigurableManager.registerReconfigurable("auth.".concat(pair.name).concat(".provider"), (Reconfigurable) pair.provider);
if (pair.handler instanceof Reconfigurable)
reconfigurableManager.registerReconfigurable("auth.".concat(pair.name).concat(".handler"), (Reconfigurable) pair.handler);
if (pair.textureProvider instanceof Reconfigurable)
reconfigurableManager.registerReconfigurable("auth.".concat(pair.name).concat(".texture"), (Reconfigurable) pair.textureProvider);
} }
Arrays.stream(config.mirrors).forEach(mirrorManager::addMirror); Arrays.stream(config.mirrors).forEach(mirrorManager::addMirror);
@ -524,6 +512,7 @@ public LaunchServer(Path dir, String[] args) throws IOException, InvalidKeySpecE
LogHelper.debug("Init components"); LogHelper.debug("Init components");
config.components.forEach((k,v) -> { config.components.forEach((k,v) -> {
LogHelper.subDebug("Init component %s", k); LogHelper.subDebug("Init component %s", k);
registerObject("component.".concat(k),v);
v.init(this); v.init(this);
}); });
LogHelper.debug("Init components successful"); LogHelper.debug("Init components successful");
@ -800,6 +789,26 @@ public void restart() {
} }
} }
public void registerObject(String name, Object object)
{
if(object instanceof Reloadable)
{
reloadManager.registerReloadable(name, (Reloadable) object);
}
if(object instanceof Reconfigurable)
{
reconfigurableManager.registerReconfigurable(name, (Reconfigurable) object);
}
if(object instanceof NeedGarbageCollection)
{
GarbageManager.registerNeedGC((NeedGarbageCollection) object);
}
if(object instanceof JsonConfigurable)
{
}
}
public void fullyRestart() { public void fullyRestart() {
restart(); restart();
JVMHelper.RUNTIME.exit(0); JVMHelper.RUNTIME.exit(0);

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.auth.handler.AuthHandler; import ru.gravit.launchserver.auth.handler.AuthHandler;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.auth.provider.AuthProvider; import ru.gravit.launchserver.auth.provider.AuthProvider;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.components.Component; import ru.gravit.launchserver.components.Component;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.auth.hwid.HWIDHandler; import ru.gravit.launchserver.auth.hwid.HWIDHandler;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.auth.permissions.PermissionsHandler; import ru.gravit.launchserver.auth.permissions.PermissionsHandler;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.auth.protect.ProtectHandler; import ru.gravit.launchserver.auth.protect.ProtectHandler;

View file

@ -1,4 +1,4 @@
package ru.gravit.launchserver.config; package ru.gravit.launchserver.config.adapter;
import com.google.gson.*; import com.google.gson.*;
import ru.gravit.launchserver.texture.TextureProvider; import ru.gravit.launchserver.texture.TextureProvider;

View file

@ -0,0 +1,55 @@
package ru.gravit.launcher.managers;
import ru.gravit.utils.config.JsonConfigurable;
import ru.gravit.utils.helper.LogHelper;
import ru.gravit.utils.helper.VerifyHelper;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Objects;
public class ConfigManager {
private final HashMap<String, JsonConfigurable> CONFIGURABLE = new HashMap<>();
public void registerConfigurable(String name, JsonConfigurable reconfigurable) {
VerifyHelper.putIfAbsent(CONFIGURABLE, name.toLowerCase(), Objects.requireNonNull(reconfigurable, "adapter"),
String.format("Reloadable has been already registered: '%s'", name));
}
public void printConfigurables() {
LogHelper.info("Print configurables");
CONFIGURABLE.forEach((k, v) -> LogHelper.subInfo(k));
LogHelper.info("Found %d configurables", CONFIGURABLE.size());
}
public void save(String name) throws IOException
{
CONFIGURABLE.get(name).saveConfig();
}
public void load(String name) throws IOException
{
CONFIGURABLE.get(name).loadConfig();
}
public void save(String name, Path path) throws IOException
{
CONFIGURABLE.get(name).saveConfig(path);
}
public void reset(String name) throws IOException
{
CONFIGURABLE.get(name).resetConfig();
}
public void load(String name, Path path) throws IOException
{
CONFIGURABLE.get(name).loadConfig(path);
}
public void reset(String name, Path path) throws IOException
{
CONFIGURABLE.get(name).resetConfig(path);
}
}

View file

@ -0,0 +1,58 @@
package ru.gravit.utils.config;
import ru.gravit.launcher.Launcher;
import ru.gravit.utils.helper.IOHelper;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.file.Path;
public abstract class JsonConfigurable<T> {
private Type type;
protected Path configPath;
public void saveConfig() throws IOException
{
saveConfig(configPath);
}
public void loadConfig() throws IOException
{
loadConfig(configPath);
}
public JsonConfigurable(Type type, Path configPath) {
this.type = type;
this.configPath = configPath;
}
public void saveConfig(Path configPath) throws IOException
{
try(BufferedWriter writer = IOHelper.newWriter(configPath))
{
Launcher.gson.toJson(getConfig(), type, writer);
}
}
public void loadConfig(Path configPath) throws IOException
{
try (BufferedReader reader = IOHelper.newReader(configPath)) {
setConfig(Launcher.gson.fromJson(reader, type));
}
}
public void resetConfig() throws IOException
{
setConfig(getDefaultConfig());
saveConfig();
}
public void resetConfig(Path newPath) throws IOException
{
setConfig(getDefaultConfig());
saveConfig(newPath);
}
public abstract T getConfig();
public abstract T getDefaultConfig();
public abstract void setConfig(T config);
}