From 20b651f9091c94010174ee3b985f65c97e5dcbbf Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Wed, 22 Aug 2018 10:19:52 +0300 Subject: [PATCH] WebServer initialized by Dagger --- .../main/java/com/djrapitops/plan/Plan.java | 6 +- .../java/com/djrapitops/plan/PlanBungee.java | 8 +- .../java/com/djrapitops/plan/PlanSponge.java | 6 +- .../plan/modules/bungee/BungeeInfoModule.java | 21 +++ .../modules/common/WebServerSystemModule.java | 27 ---- .../djrapitops/plan/system/BukkitSystem.java | 3 + .../djrapitops/plan/system/BungeeSystem.java | 6 +- .../djrapitops/plan/system/PlanSystem.java | 4 +- .../djrapitops/plan/system/SpongeSystem.java | 5 +- .../system/info/server/BukkitServerInfo.java | 23 +++- .../system/info/server/BungeeServerInfo.java | 54 +++++--- .../system/info/server/SpongeServerInfo.java | 11 +- .../plan/system/webserver/RequestHandler.java | 17 ++- .../system/webserver/ResponseHandler.java | 36 +++-- .../plan/system/webserver/WebServer.java | 125 +++++++++--------- .../system/webserver/WebServerSystem.java | 23 ++-- .../webserver/pages/RootPageHandler.java | 17 +-- .../webserver/response/DefaultResponses.java | 6 +- 18 files changed, 229 insertions(+), 169 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/modules/bungee/BungeeInfoModule.java delete mode 100644 Plan/src/main/java/com/djrapitops/plan/modules/common/WebServerSystemModule.java diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index 4c4ddc7ce..caaec606d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -22,7 +22,10 @@ package com.djrapitops.plan; import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.command.PlanCommand; import com.djrapitops.plan.modules.APFModule; -import com.djrapitops.plan.modules.common.*; +import com.djrapitops.plan.modules.common.ExportModule; +import com.djrapitops.plan.modules.common.LocaleModule; +import com.djrapitops.plan.modules.common.PluginHookModule; +import com.djrapitops.plan.modules.common.VersionCheckModule; import com.djrapitops.plan.modules.server.ServerAPIModule; import com.djrapitops.plan.modules.server.ServerDataCacheModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule; @@ -64,7 +67,6 @@ import java.util.logging.Logger; BukkitInfoModule.class, BukkitDatabaseModule.class, ServerDataCacheModule.class, - WebServerSystemModule.class, ServerInfoSystemModule.class, PluginHookModule.class, ServerAPIModule.class diff --git a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java index 8222184b0..577a09ca4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java +++ b/Plan/src/main/java/com/djrapitops/plan/PlanBungee.java @@ -10,7 +10,11 @@ import com.djrapitops.plan.modules.APFModule; import com.djrapitops.plan.modules.bungee.BungeeAPIModule; import com.djrapitops.plan.modules.bungee.BungeeConfigModule; import com.djrapitops.plan.modules.bungee.BungeeDatabaseModule; -import com.djrapitops.plan.modules.common.*; +import com.djrapitops.plan.modules.bungee.BungeeInfoModule; +import com.djrapitops.plan.modules.common.ExportModule; +import com.djrapitops.plan.modules.common.LocaleModule; +import com.djrapitops.plan.modules.common.PluginHookModule; +import com.djrapitops.plan.modules.common.VersionCheckModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule; import com.djrapitops.plan.system.BungeeSystem; import com.djrapitops.plan.system.locale.Locale; @@ -41,8 +45,8 @@ import java.io.InputStream; VersionCheckModule.class, BungeeConfigModule.class, LocaleModule.class, + BungeeInfoModule.class, BungeeDatabaseModule.class, - WebServerSystemModule.class, ServerInfoSystemModule.class, PluginHookModule.class, BungeeAPIModule.class diff --git a/Plan/src/main/java/com/djrapitops/plan/PlanSponge.java b/Plan/src/main/java/com/djrapitops/plan/PlanSponge.java index a61b9c4a4..89e8d0128 100644 --- a/Plan/src/main/java/com/djrapitops/plan/PlanSponge.java +++ b/Plan/src/main/java/com/djrapitops/plan/PlanSponge.java @@ -3,7 +3,10 @@ package com.djrapitops.plan; import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.command.PlanCommand; import com.djrapitops.plan.modules.APFModule; -import com.djrapitops.plan.modules.common.*; +import com.djrapitops.plan.modules.common.ExportModule; +import com.djrapitops.plan.modules.common.LocaleModule; +import com.djrapitops.plan.modules.common.PluginHookModule; +import com.djrapitops.plan.modules.common.VersionCheckModule; import com.djrapitops.plan.modules.server.ServerAPIModule; import com.djrapitops.plan.modules.server.ServerDataCacheModule; import com.djrapitops.plan.modules.server.ServerInfoSystemModule; @@ -51,7 +54,6 @@ import java.io.InputStream; LocaleModule.class, SpongeDatabaseModule.class, ServerDataCacheModule.class, - WebServerSystemModule.class, ServerInfoSystemModule.class, SpongeInfoModule.class, PluginHookModule.class, diff --git a/Plan/src/main/java/com/djrapitops/plan/modules/bungee/BungeeInfoModule.java b/Plan/src/main/java/com/djrapitops/plan/modules/bungee/BungeeInfoModule.java new file mode 100644 index 000000000..8117c3a9a --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/modules/bungee/BungeeInfoModule.java @@ -0,0 +1,21 @@ +package com.djrapitops.plan.modules.bungee; + +import com.djrapitops.plan.PlanBungee; +import com.djrapitops.plan.system.info.server.properties.BungeeServerProperties; +import com.djrapitops.plan.system.info.server.properties.ServerProperties; +import dagger.Module; +import dagger.Provides; + +/** + * Dagger module for Bukkit ServerInfo. + * + * @author Rsl1122 + */ +@Module +public class BungeeInfoModule { + + @Provides + ServerProperties provideServerProperties(PlanBungee plugin) { + return new BungeeServerProperties(plugin.getProxy()); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/modules/common/WebServerSystemModule.java b/Plan/src/main/java/com/djrapitops/plan/modules/common/WebServerSystemModule.java deleted file mode 100644 index 23e9d9f39..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/modules/common/WebServerSystemModule.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.djrapitops.plan.modules.common; - -import com.djrapitops.plan.system.locale.Locale; -import com.djrapitops.plan.system.webserver.WebServer; -import com.djrapitops.plan.system.webserver.WebServerSystem; -import dagger.Module; -import dagger.Provides; - -/** - * Dagger module for WebServerSystem. - * - * @author Rsl1122 - */ -@Module -public class WebServerSystemModule { - - @Provides - WebServerSystem provideWebServerSystem(Locale locale) { - return new WebServerSystem(() -> locale); - } - - @Provides - WebServer provideWebServer(WebServerSystem webServerSystem) { - return webServerSystem.getWebServer(); - } - -} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java index a4a41fec0..be7e42fad 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java @@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.ConfigSystem; import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.tasks.BukkitTaskSystem; import com.djrapitops.plan.system.update.VersionCheckSystem; +import com.djrapitops.plan.system.webserver.WebServerSystem; import javax.inject.Inject; @@ -36,6 +37,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem { InfoSystem serverInfoSystem, BukkitServerInfo serverInfo, DBSystem databaseSystem, + WebServerSystem webServerSystem, BukkitListenerSystem bukkitListenerSystem, BukkitTaskSystem bukkitTaskSystem, ExportSystem exportSystem, @@ -43,6 +45,7 @@ public class BukkitSystem extends PlanSystem implements ServerSystem { PlanAPI planAPI, ShutdownHook shutdownHook ) { + super(webServerSystem); this.versionCheckSystem = versionCheckSystem; this.fileSystem = fileSystem; this.configSystem = serverConfigSystem; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java index 5dd185649..4708af47e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java @@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.BungeeConfigSystem; import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.tasks.BungeeTaskSystem; import com.djrapitops.plan.system.update.VersionCheckSystem; +import com.djrapitops.plan.system.webserver.WebServerSystem; import javax.inject.Inject; @@ -34,12 +35,15 @@ public class BungeeSystem extends PlanSystem { VersionCheckSystem versionCheckSystem, FileSystem fileSystem, BungeeConfigSystem bungeeConfigSystem, + BungeeServerInfo bungeeServerInfo, BungeeCacheSystem bungeeCacheSystem, DBSystem databaseSystem, + WebServerSystem webServerSystem, HookHandler hookHandler, ExportSystem exportSystem, PlanAPI planAPI ) { + super(webServerSystem); setTestSystem(this); this.versionCheckSystem = versionCheckSystem; @@ -52,7 +56,7 @@ public class BungeeSystem extends PlanSystem { taskSystem = new BungeeTaskSystem(plugin.getRunnableFactory()); infoSystem = new BungeeInfoSystem(); - serverInfo = new BungeeServerInfo(plugin); + serverInfo = bungeeServerInfo; this.hookHandler = hookHandler; this.planAPI = planAPI; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/PlanSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/PlanSystem.java index 60f17fc2d..6b4e3c059 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/PlanSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/PlanSystem.java @@ -61,11 +61,11 @@ public abstract class PlanSystem implements SubSystem { // Not a SubSystem. protected PlanAPI planAPI; - public PlanSystem() { + public PlanSystem(WebServerSystem webServerSystem) { + this.webServerSystem = webServerSystem; Supplier localeSupplier = () -> getLocaleSystem().getLocale(); processing = new Processing(localeSupplier); - webServerSystem = new WebServerSystem(localeSupplier); localeSystem = new LocaleSystem(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/SpongeSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/SpongeSystem.java index 0ed3fc979..b34c1a2a5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/SpongeSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/SpongeSystem.java @@ -19,6 +19,7 @@ import com.djrapitops.plan.system.settings.config.ConfigSystem; import com.djrapitops.plan.system.settings.network.NetworkSettings; import com.djrapitops.plan.system.tasks.SpongeTaskSystem; import com.djrapitops.plan.system.update.VersionCheckSystem; +import com.djrapitops.plan.system.webserver.WebServerSystem; import javax.inject.Inject; @@ -36,14 +37,16 @@ public class SpongeSystem extends PlanSystem implements ServerSystem { ConfigSystem serverConfigSystem, InfoSystem serverInfoSystem, SpongeServerInfo serverInfo, + DBSystem databaseSystem, + WebServerSystem webServerSystem, SpongeListenerSystem spongeListenerSystem, SpongeTaskSystem spongeTaskSystem, - DBSystem databaseSystem, ExportSystem exportSystem, HookHandler hookHandler, PlanAPI planAPI, ShutdownHook shutdownHook ) { + super(webServerSystem); setTestSystem(this); this.versionCheckSystem = versionCheckSystem; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/server/BukkitServerInfo.java b/Plan/src/main/java/com/djrapitops/plan/system/info/server/BukkitServerInfo.java index 5dc83d226..92ccf5248 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/server/BukkitServerInfo.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/server/BukkitServerInfo.java @@ -10,7 +10,7 @@ import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.config.PlanConfig; -import com.djrapitops.plan.system.webserver.WebServerSystem; +import com.djrapitops.plan.system.webserver.WebServer; import javax.inject.Inject; import java.io.IOException; @@ -26,15 +26,23 @@ import java.util.UUID; */ public class BukkitServerInfo extends ServerInfo { + private final WebServer webServer; private final PlanConfig config; private ServerInfoFile serverInfoFile; private Database database; @Inject - public BukkitServerInfo(ServerProperties serverProperties, ServerInfoFile serverInfoFile, Database database, PlanConfig config) { + public BukkitServerInfo( + ServerProperties serverProperties, + ServerInfoFile serverInfoFile, + Database database, + WebServer webServer, + PlanConfig config + ) { super(serverProperties); this.serverInfoFile = serverInfoFile; this.database = database; + this.webServer = webServer; this.config = config; } @@ -67,7 +75,7 @@ public class BukkitServerInfo extends ServerInfo { return registerServer(serverUUID); } String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_"); - String webAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); + String webAddress = webServer.getAccessAddress(); if ("plan".equalsIgnoreCase(name)) { name = "Server " + serverID.get(); } @@ -83,7 +91,7 @@ public class BukkitServerInfo extends ServerInfo { } private Server registerServer(UUID serverUUID) throws IOException { - String webAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); + String webAddress = webServer.getAccessAddress(); String name = config.getString(Settings.SERVER_NAME).replaceAll("[^a-zA-Z0-9_\\s]", "_"); int maxPlayers = serverProperties.getMaxPlayers(); @@ -103,7 +111,12 @@ public class BukkitServerInfo extends ServerInfo { } private UUID generateNewUUID() { - String seed = serverProperties.getServerId() + serverProperties.getName() + serverProperties.getIp() + serverProperties.getPort() + serverProperties.getVersion() + serverProperties.getImplVersion(); + String seed = serverProperties.getServerId() + + serverProperties.getName() + + serverProperties.getIp() + + serverProperties.getPort() + + serverProperties.getVersion() + + serverProperties.getImplVersion(); return UUID.nameUUIDFromBytes(seed.getBytes()); } } \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/server/BungeeServerInfo.java b/Plan/src/main/java/com/djrapitops/plan/system/info/server/BungeeServerInfo.java index add3e6463..86cbfc75d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/server/BungeeServerInfo.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/server/BungeeServerInfo.java @@ -4,15 +4,14 @@ */ package com.djrapitops.plan.system.info.server; -import com.djrapitops.plan.PlanBungee; import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.api.exceptions.database.DBOpException; import com.djrapitops.plan.system.database.databases.Database; -import com.djrapitops.plan.system.info.server.properties.BungeeServerProperties; import com.djrapitops.plan.system.info.server.properties.ServerProperties; -import com.djrapitops.plan.system.webserver.WebServerSystem; -import com.djrapitops.plugin.api.utility.log.Log; +import com.djrapitops.plan.system.webserver.WebServer; +import com.djrapitops.plugin.logging.console.PluginLogger; +import javax.inject.Inject; import java.util.Optional; import java.util.UUID; @@ -23,8 +22,21 @@ import java.util.UUID; */ public class BungeeServerInfo extends ServerInfo { - public BungeeServerInfo(PlanBungee plugin) { - super(new BungeeServerProperties(plugin.getProxy())); + private final Database database; + private final WebServer webServer; + private final PluginLogger logger; + + @Inject + public BungeeServerInfo( + ServerProperties serverProperties, + Database database, + WebServer webServer, + PluginLogger logger + ) { + super(serverProperties); + this.database = database; + this.webServer = webServer; + this.logger = logger; } @Override @@ -32,13 +44,12 @@ public class BungeeServerInfo extends ServerInfo { checkIfDefaultIP(); try { - Database db = Database.getActive(); - Optional bungeeInfo = db.fetch().getBungeeInformation(); + Optional bungeeInfo = database.fetch().getBungeeInformation(); if (bungeeInfo.isPresent()) { server = bungeeInfo.get(); - updateServerInfo(db); + updateServerInfo(database); } else { - server = registerBungeeInfo(db); + server = registerBungeeInfo(database); } } catch (DBOpException e) { throw new EnableException("Failed to read Server information from Database."); @@ -47,7 +58,7 @@ public class BungeeServerInfo extends ServerInfo { } private void updateServerInfo(Database db) { - String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); + String accessAddress = webServer.getAccessAddress(); if (!accessAddress.equals(server.getWebAddress())) { server.setWebAddress(accessAddress); db.save().serverInfoForThisServer(server); @@ -55,20 +66,19 @@ public class BungeeServerInfo extends ServerInfo { } private void checkIfDefaultIP() throws EnableException { - String ip = ServerInfo.getServerProperties_Old().getIp(); + String ip = serverProperties.getIp(); if ("0.0.0.0".equals(ip)) { - Log.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); - Log.info("Player Analytics partially enabled (Use /planbungee to reload config)"); + logger.error("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); + logger.info("Player Analytics partially enabled (Use /planbungee to reload config)"); throw new EnableException("IP setting still 0.0.0.0 - Configure AlternativeIP/IP that connects to the Proxy server."); } } private Server registerBungeeInfo(Database db) throws EnableException { - ServerProperties properties = ServerInfo.getServerProperties_Old(); - UUID serverUUID = generateNewUUID(properties); - String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress(); + UUID serverUUID = generateNewUUID(); + String accessAddress = webServer.getAccessAddress(); - Server bungeeCord = new Server(-1, serverUUID, "BungeeCord", accessAddress, properties.getMaxPlayers()); + Server bungeeCord = new Server(-1, serverUUID, "BungeeCord", accessAddress, serverProperties.getMaxPlayers()); db.save().serverInfoForThisServer(bungeeCord); Optional bungeeInfo = db.fetch().getBungeeInformation(); @@ -78,8 +88,12 @@ public class BungeeServerInfo extends ServerInfo { throw new EnableException("BungeeCord registration failed (DB)"); } - private UUID generateNewUUID(ServerProperties properties) { - String seed = properties.getName() + properties.getIp() + properties.getPort() + properties.getVersion() + properties.getImplVersion(); + private UUID generateNewUUID() { + String seed = serverProperties.getName() + + serverProperties.getIp() + + serverProperties.getPort() + + serverProperties.getVersion() + + serverProperties.getImplVersion(); return UUID.nameUUIDFromBytes(seed.getBytes()); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/server/SpongeServerInfo.java b/Plan/src/main/java/com/djrapitops/plan/system/info/server/SpongeServerInfo.java index 9d8337074..38f37653f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/server/SpongeServerInfo.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/server/SpongeServerInfo.java @@ -3,13 +3,20 @@ package com.djrapitops.plan.system.info.server; import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.settings.config.PlanConfig; +import com.djrapitops.plan.system.webserver.WebServer; import javax.inject.Inject; public class SpongeServerInfo extends BukkitServerInfo { @Inject - public SpongeServerInfo(ServerProperties serverProperties, ServerInfoFile serverInfoFile, Database database, PlanConfig config) { - super(serverProperties, serverInfoFile, database, config); + public SpongeServerInfo( + ServerProperties serverProperties, + ServerInfoFile serverInfoFile, + Database database, + WebServer webServer, + PlanConfig config + ) { + super(serverProperties, serverInfoFile, database, webServer, config); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/RequestHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/RequestHandler.java index 936d727ca..4877844f3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/RequestHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/RequestHandler.java @@ -17,29 +17,32 @@ import com.sun.net.httpserver.Headers; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; +import javax.inject.Inject; +import javax.inject.Singleton; import java.util.List; -import java.util.function.Supplier; /** * HttpHandler for WebServer request management. * * @author Rsl1122 */ +@Singleton public class RequestHandler implements HttpHandler { - private final Supplier locale; + private final Locale locale; private final ResponseHandler responseHandler; - RequestHandler(WebServer webServer) { - responseHandler = new ResponseHandler(webServer); - locale = webServer.getLocaleSupplier(); + @Inject + RequestHandler(Locale locale, ResponseHandler responseHandler) { + this.locale = locale; + this.responseHandler = responseHandler; } @Override public void handle(HttpExchange exchange) { Headers requestHeaders = exchange.getRequestHeaders(); Headers responseHeaders = exchange.getResponseHeaders(); - Request request = new Request(exchange, locale.get()); + Request request = new Request(exchange, locale); request.setAuth(getAuthorization(requestHeaders)); String requestString = request.toString(); @@ -53,7 +56,7 @@ public class RequestHandler implements HttpHandler { } response.setResponseHeaders(responseHeaders); - response.send(exchange, locale.get()); + response.send(exchange, locale); } catch (Exception e) { if (Settings.DEV_MODE.isTrue()) { Log.warn("THIS ERROR IS ONLY LOGGED IN DEV MODE:"); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java index 280b6de56..5274e0b05 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/ResponseHandler.java @@ -14,8 +14,11 @@ import com.djrapitops.plan.system.webserver.cache.ResponseCache; import com.djrapitops.plan.system.webserver.pages.*; import com.djrapitops.plan.system.webserver.response.*; import com.djrapitops.plan.system.webserver.response.errors.*; -import com.djrapitops.plugin.api.utility.log.Log; +import com.djrapitops.plugin.logging.L; +import com.djrapitops.plugin.logging.error.ErrorHandler; +import javax.inject.Inject; +import javax.inject.Singleton; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -26,15 +29,22 @@ import java.util.Optional; * * @author Rsl1122 */ +@Singleton public class ResponseHandler extends TreePageHandler { - private final WebServer webServer; + private final ErrorHandler errorHandler; - public ResponseHandler(WebServer webServer) { - this.webServer = webServer; + private WebServer webServer; + + @Inject + public ResponseHandler(ErrorHandler errorHandler) { + this.errorHandler = errorHandler; + + registerWebAPIPages(); + registerDefaultPages(); } - public void registerDefaultPages() { + private void registerDefaultPages() { registerPage("favicon.ico", new RedirectResponse("https://puu.sh/tK0KL/6aa2ba141b.ico"), 5); registerPage("debug", new DebugPageHandler()); registerPage("players", new PlayersPageHandler()); @@ -44,7 +54,7 @@ public class ResponseHandler extends TreePageHandler { registerPage("network", serverPageHandler); registerPage("server", serverPageHandler); registerPage("", webServer.isAuthRequired() - ? new RootPageHandler(this) + ? new RootPageHandler() : new PageHandler() { @Override public Response getResponse(Request request, List target) { @@ -53,7 +63,7 @@ public class ResponseHandler extends TreePageHandler { }); } - public void registerWebAPIPages() { + private void registerWebAPIPages() { registerPage("info", new InfoRequestPageHandler()); } @@ -84,7 +94,7 @@ public class ResponseHandler extends TreePageHandler { return new InternalErrorResponse(request.getTarget(), e); } } catch (Exception e) { - Log.toLog(this.getClass(), e); + errorHandler.log(L.ERROR, this.getClass(), e); return new InternalErrorResponse(request.getTarget(), e); } } @@ -106,7 +116,7 @@ public class ResponseHandler extends TreePageHandler { if (webServer.isUsingHTTPS()) { return DefaultResponses.BASIC_AUTH.get(); } else { - return forbiddenResponse(); + return DefaultResponses.FORBIDDEN.get(); } } } @@ -118,13 +128,11 @@ public class ResponseHandler extends TreePageHandler { if (!isAuthRequired || isAuthorized) { return pageHandler.getResponse(request, target); } - return forbiddenResponse(); + return DefaultResponses.FORBIDDEN.get(); } } - public Response forbiddenResponse() { - return ResponseCache.loadResponse(PageId.FORBIDDEN.id(), () -> - new ForbiddenResponse("Your user is not authorized to view this page.
" - + "If you believe this is an error contact staff to change your access level.")); + public void setWebServer(WebServer webServer) { + this.webServer = webServer; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServer.java index 7d83f7a49..7e451f089 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServer.java @@ -1,22 +1,25 @@ package com.djrapitops.plan.system.webserver; -import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.system.SubSystem; import com.djrapitops.plan.system.file.FileSystem; import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.locale.lang.PluginLang; import com.djrapitops.plan.system.settings.Settings; +import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.utilities.html.HtmlUtils; -import com.djrapitops.plugin.StaticHolder; import com.djrapitops.plugin.api.Check; -import com.djrapitops.plugin.api.utility.log.Log; +import com.djrapitops.plugin.logging.L; +import com.djrapitops.plugin.logging.console.PluginLogger; +import com.djrapitops.plugin.logging.error.ErrorHandler; import com.djrapitops.plugin.utilities.Verify; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsConfigurator; import com.sun.net.httpserver.HttpsParameters; import com.sun.net.httpserver.HttpsServer; +import javax.inject.Inject; +import javax.inject.Singleton; import javax.net.ssl.*; import java.io.File; import java.io.FileInputStream; @@ -30,14 +33,21 @@ import java.security.cert.CertificateException; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; /** * @author Rsl1122 */ +@Singleton public class WebServer implements SubSystem { - private final Supplier locale; + private final Locale locale; + private final FileSystem fileSystem; + private final PlanConfig config; + + private final RequestHandler requestHandler; + + private final PluginLogger logger; + private final ErrorHandler errorHandler; private int port; private boolean enabled = false; @@ -45,13 +55,27 @@ public class WebServer implements SubSystem { private boolean usingHttps = false; - private RequestHandler requestHandler; - private ResponseHandler responseHandler; - - public WebServer(Supplier locale) { + @Inject + public WebServer( + Locale locale, + FileSystem fileSystem, + PlanConfig config, + PluginLogger logger, + ErrorHandler errorHandler, + RequestHandler requestHandler + ) { this.locale = locale; + this.fileSystem = fileSystem; + this.config = config; + + this.requestHandler = requestHandler; + requestHandler.getResponseHandler().setWebServer(this); + + this.logger = logger; + this.errorHandler = errorHandler; } + @Deprecated public static WebServer getInstance() { WebServer webServer = WebServerSystem.getInstance().getWebServer(); Verify.nullCheck(webServer, () -> new IllegalStateException("WebServer was not initialized.")); @@ -60,25 +84,18 @@ public class WebServer implements SubSystem { @Override public void enable() throws EnableException { - this.port = Settings.WEBSERVER_PORT.getNumber(); - - requestHandler = new RequestHandler(this); - responseHandler = requestHandler.getResponseHandler(); - - PlanPlugin plugin = PlanPlugin.getInstance(); - StaticHolder.saveInstance(RequestHandler.class, plugin.getClass()); - StaticHolder.saveInstance(ResponseHandler.class, plugin.getClass()); + this.port = config.getNumber(Settings.WEBSERVER_PORT); initServer(); if (!isEnabled()) { if (Check.isBungeeAvailable()) { - throw new EnableException(locale.get().getString(PluginLang.ENABLE_FAIL_NO_WEB_SERVER_BUNGEE)); + throw new EnableException(locale.getString(PluginLang.ENABLE_FAIL_NO_WEB_SERVER_BUNGEE)); } - if (Settings.WEBSERVER_DISABLED.isTrue()) { - Log.warn(locale.get().getString(PluginLang.ENABLE_NOTIFY_WEB_SERVER_DISABLED)); + if (config.isTrue(Settings.WEBSERVER_DISABLED)) { + logger.warn(locale.getString(PluginLang.ENABLE_NOTIFY_WEB_SERVER_DISABLED)); } else { - Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_PORT_BIND, port)); + logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_PORT_BIND, port)); } } } @@ -87,24 +104,24 @@ public class WebServer implements SubSystem { * Starts up the WebServer in a new Thread Pool. */ private void initServer() { - // Check if Bukkit WebServer has been disabled. - if (!Check.isBungeeAvailable() && Settings.WEBSERVER_DISABLED.isTrue()) { + if (!Check.isBungeeAvailable() && config.isTrue(Settings.WEBSERVER_DISABLED)) { + // Bukkit WebServer has been disabled. return; } - // Server is already enabled stop code if (enabled) { + // Server is already enabled stop code return; } try { usingHttps = startHttpsServer(); - Log.debug(usingHttps ? "Https Start Successful." : "Https Start Failed."); + logger.debug(usingHttps ? "Https Start Successful." : "Https Start Failed."); if (!usingHttps) { - Log.infoColor("§e" + locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH)); - server = HttpServer.create(new InetSocketAddress(Settings.WEBSERVER_IP.toString(), port), 10); + logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP_USER_AUTH)); + server = HttpServer.create(new InetSocketAddress(config.getString(Settings.WEBSERVER_IP), port), 10); } server.createContext("/", requestHandler); @@ -113,22 +130,22 @@ public class WebServer implements SubSystem { enabled = true; - Log.info(locale.get().getString(PluginLang.ENABLED_WEB_SERVER, server.getAddress().getPort(), getAccessAddress())); + logger.info(locale.getString(PluginLang.ENABLED_WEB_SERVER, server.getAddress().getPort(), getAccessAddress())); } catch (IllegalArgumentException | IllegalStateException | IOException e) { - Log.toLog(this.getClass(), e); + errorHandler.log(L.ERROR, this.getClass(), e); enabled = false; } } private boolean startHttpsServer() { - String keyStorePath = Settings.WEBSERVER_CERTIFICATE_PATH.toString(); + String keyStorePath = config.getString(Settings.WEBSERVER_CERTIFICATE_PATH); if (!Paths.get(keyStorePath).isAbsolute()) { - keyStorePath = FileSystem.getDataFolder_Old() + File.separator + keyStorePath; + keyStorePath = fileSystem.getDataFolder() + File.separator + keyStorePath; } - char[] storepass = Settings.WEBSERVER_CERTIFICATE_STOREPASS.toString().toCharArray(); - char[] keypass = Settings.WEBSERVER_CERTIFICATE_KEYPASS.toString().toCharArray(); - String alias = Settings.WEBSERVER_CERTIFICATE_ALIAS.toString(); + char[] storepass = config.getString(Settings.WEBSERVER_CERTIFICATE_STOREPASS).toCharArray(); + char[] keypass = config.getString(Settings.WEBSERVER_CERTIFICATE_KEYPASS).toCharArray(); + String alias = config.getString(Settings.WEBSERVER_CERTIFICATE_ALIAS); boolean startSuccessful = false; try (FileInputStream fIn = new FileInputStream(keyStorePath)) { @@ -141,7 +158,7 @@ public class WebServer implements SubSystem { throw new IllegalStateException("Certificate with Alias: " + alias + " was not found in the Keystore."); } - Log.info("Certificate: " + cert.getType()); + logger.info("Certificate: " + cert.getType()); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); keyManagerFactory.init(keystore, keypass); @@ -149,7 +166,7 @@ public class WebServer implements SubSystem { TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509"); trustManagerFactory.init(keystore); - server = HttpsServer.create(new InetSocketAddress(Settings.WEBSERVER_IP.toString(), port), 10); + server = HttpsServer.create(new InetSocketAddress(config.getString(Settings.WEBSERVER_IP), port), 10); SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(keyManagerFactory.getKeyManagers(), null/*trustManagerFactory.getTrustManagers()*/, null); @@ -168,20 +185,20 @@ public class WebServer implements SubSystem { }); startSuccessful = true; } catch (IllegalStateException e) { - Log.error(e.getMessage()); - Log.toLog(this.getClass(), e); + logger.error(e.getMessage()); + errorHandler.log(L.ERROR, this.getClass(), e); } catch (KeyManagementException | NoSuchAlgorithmException e) { - Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT)); - Log.toLog(this.getClass(), e); + logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_SSL_CONTEXT)); + errorHandler.log(L.ERROR, this.getClass(), e); } catch (FileNotFoundException e) { - Log.infoColor("§e" + locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_NO_CERT_FILE, keyStorePath)); - Log.info(locale.get().getString(PluginLang.WEB_SERVER_NOTIFY_HTTP)); + logger.log(L.INFO_COLOR, "§e" + locale.getString(PluginLang.WEB_SERVER_NOTIFY_NO_CERT_FILE, keyStorePath)); + logger.info(locale.getString(PluginLang.WEB_SERVER_NOTIFY_HTTP)); } catch (IOException e) { - Log.error("WebServer: " + e); - Log.toLog(this.getClass(), e); + logger.error("WebServer: " + e); + errorHandler.log(L.ERROR, this.getClass(), e); } catch (KeyStoreException | CertificateException | UnrecoverableKeyException e) { - Log.error(locale.get().getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD)); - Log.toLog(this.getClass(), e); + logger.error(locale.getString(PluginLang.WEB_SERVER_FAIL_STORE_LOAD)); + errorHandler.log(L.ERROR, this.getClass(), e); } return startSuccessful; } @@ -199,7 +216,7 @@ public class WebServer implements SubSystem { @Override public void disable() { if (server != null) { - Log.info(locale.get().getString(PluginLang.DISABLED_WEB_SERVER)); + logger.info(locale.getString(PluginLang.DISABLED_WEB_SERVER)); server.stop(0); } enabled = false; @@ -218,18 +235,6 @@ public class WebServer implements SubSystem { } public String getAccessAddress() { - return isEnabled() ? getProtocol() + "://" + HtmlUtils.getIP() : Settings.EXTERNAL_WEBSERVER_LINK.toString(); - } - - public RequestHandler getRequestHandler() { - return requestHandler; - } - - public ResponseHandler getResponseHandler() { - return responseHandler; - } - - Supplier getLocaleSupplier() { - return locale; + return isEnabled() ? getProtocol() + "://" + HtmlUtils.getIP() : config.getString(Settings.EXTERNAL_WEBSERVER_LINK); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServerSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServerSystem.java index 39f6830dd..13235dee5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServerSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/WebServerSystem.java @@ -7,11 +7,10 @@ package com.djrapitops.plan.system.webserver; import com.djrapitops.plan.api.exceptions.EnableException; import com.djrapitops.plan.system.PlanSystem; import com.djrapitops.plan.system.SubSystem; -import com.djrapitops.plan.system.locale.Locale; import com.djrapitops.plan.system.webserver.cache.ResponseCache; -import com.djrapitops.plugin.api.Benchmark; +import com.djrapitops.plugin.benchmarking.Timings; -import java.util.function.Supplier; +import javax.inject.Inject; /** * WebServer subsystem for managing WebServer initialization. @@ -20,16 +19,21 @@ import java.util.function.Supplier; */ public class WebServerSystem implements SubSystem { - private WebServer webServer; + private final WebServer webServer; + private Timings timings; - public WebServerSystem(Supplier locale) { - webServer = new WebServer(locale); + @Inject + public WebServerSystem(WebServer webServer, Timings timings) { + this.webServer = webServer; + this.timings = timings; } + @Deprecated public static WebServerSystem getInstance() { return PlanSystem.getInstance().getWebServerSystem(); } + @Deprecated public static boolean isWebServerEnabled() { WebServer webServer = getInstance().webServer; return webServer != null && webServer.isEnabled(); @@ -37,12 +41,9 @@ public class WebServerSystem implements SubSystem { @Override public void enable() throws EnableException { - Benchmark.start("WebServer Initialization"); + timings.start("WebServer Initialization"); webServer.enable(); - ResponseHandler responseHandler = webServer.getResponseHandler(); - responseHandler.registerWebAPIPages(); - responseHandler.registerDefaultPages(); - Benchmark.stop("Enable", "WebServer Initialization"); + timings.end("WebServer Initialization"); } @Override diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java index ed140c925..b0afa92d3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/RootPageHandler.java @@ -7,12 +7,11 @@ package com.djrapitops.plan.system.webserver.pages; import com.djrapitops.plan.api.exceptions.connection.WebException; import com.djrapitops.plan.data.WebUser; import com.djrapitops.plan.system.webserver.Request; -import com.djrapitops.plan.system.webserver.ResponseHandler; import com.djrapitops.plan.system.webserver.auth.Authentication; import com.djrapitops.plan.system.webserver.response.DefaultResponses; +import com.djrapitops.plan.system.webserver.response.RedirectResponse; import com.djrapitops.plan.system.webserver.response.Response; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -25,12 +24,6 @@ import java.util.Optional; */ public class RootPageHandler extends PageHandler { - private final ResponseHandler responseHandler; - - public RootPageHandler(ResponseHandler responseHandler) { - this.responseHandler = responseHandler; - } - @Override public Response getResponse(Request request, List target) throws WebException { Optional auth = request.getAuth(); @@ -43,13 +36,13 @@ public class RootPageHandler extends PageHandler { int permLevel = webUser.getPermLevel(); switch (permLevel) { case 0: - return responseHandler.getPageHandler("server").getResponse(request, Collections.emptyList()); + return new RedirectResponse("/server"); case 1: - return responseHandler.getPageHandler("players").getResponse(request, Collections.emptyList()); + return new RedirectResponse("/players"); case 2: - return responseHandler.getPageHandler("player").getResponse(request, Collections.singletonList(webUser.getName())); + return new RedirectResponse("/player/" + webUser.getName()); default: - return responseHandler.forbiddenResponse(); + return DefaultResponses.FORBIDDEN.get(); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java index 5278d691a..15e6ac89f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/DefaultResponses.java @@ -4,6 +4,8 @@ */ package com.djrapitops.plan.system.webserver.response; +import com.djrapitops.plan.system.webserver.response.errors.ForbiddenResponse; + /** * Enum containing default responses that don't need to be cached because they're always the same. * @@ -11,7 +13,9 @@ package com.djrapitops.plan.system.webserver.response; */ public enum DefaultResponses { BASIC_AUTH(PromptAuthorizationResponse.getBasicAuthResponse()), - SUCCESS(new TextResponse("Success")); + SUCCESS(new TextResponse("Success")), + FORBIDDEN(new ForbiddenResponse("Your user is not authorized to view this page.
" + + "If you believe this is an error contact staff to change your access level.")); private final Response response;