diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/BungeeInfoSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/info/BungeeInfoSystem.java index 4233e8d7d..78ba8b368 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/BungeeInfoSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/BungeeInfoSystem.java @@ -15,10 +15,10 @@ import com.djrapitops.plan.system.info.request.CacheRequest; import com.djrapitops.plan.system.info.request.GenerateInspectPageRequest; import com.djrapitops.plan.system.info.request.InfoRequest; import com.djrapitops.plan.system.info.server.ServerInfo; -import com.djrapitops.plan.system.webserver.pages.parsing.NetworkPage; import com.djrapitops.plan.system.webserver.response.cache.PageId; import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.pages.AnalysisPageResponse; +import com.djrapitops.plan.utilities.html.pages.NetworkPage; /** * InfoSystem for Bungee. diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateAnalysisPageRequest.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateAnalysisPageRequest.java index 85ab5970a..e421b5797 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateAnalysisPageRequest.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateAnalysisPageRequest.java @@ -12,9 +12,9 @@ import com.djrapitops.plan.data.store.containers.AnalysisContainer; import com.djrapitops.plan.system.cache.CacheSystem; import com.djrapitops.plan.system.info.InfoSystem; import com.djrapitops.plan.system.info.server.ServerInfo; -import com.djrapitops.plan.system.webserver.pages.parsing.AnalysisPage; import com.djrapitops.plan.system.webserver.response.DefaultResponses; import com.djrapitops.plan.system.webserver.response.Response; +import com.djrapitops.plan.utilities.html.pages.AnalysisPage; import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.utilities.Verify; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java index ebc9671bd..aa5bc2fc7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/request/GenerateInspectPageRequest.java @@ -8,10 +8,10 @@ import com.djrapitops.plan.api.exceptions.ParseException; import com.djrapitops.plan.api.exceptions.connection.*; import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.system.info.InfoSystem; -import com.djrapitops.plan.system.webserver.pages.parsing.InspectPage; import com.djrapitops.plan.system.webserver.response.DefaultResponses; import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.utilities.html.pages.InspectPage; import com.djrapitops.plugin.utilities.Verify; import java.util.Map; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java index 1b9e2a5b5..d94af90cc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/AnalysisPageResponse.java @@ -5,11 +5,11 @@ import com.djrapitops.plan.api.exceptions.connection.NoServersException; import com.djrapitops.plan.api.exceptions.connection.WebException; import com.djrapitops.plan.system.info.InfoSystem; import com.djrapitops.plan.system.processing.Processing; -import com.djrapitops.plan.system.webserver.pages.parsing.AnalysisPage; import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.cache.PageId; import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.errors.NotFoundResponse; +import com.djrapitops.plan.utilities.html.pages.AnalysisPage; import com.djrapitops.plugin.api.utility.log.Log; import java.util.UUID; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java index cc62f669b..a263d0d3a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/DebugPageResponse.java @@ -4,40 +4,9 @@ */ package com.djrapitops.plan.system.webserver.response.pages; -import com.djrapitops.plan.PlanPlugin; -import com.djrapitops.plan.data.container.Session; -import com.djrapitops.plan.data.store.CachingSupplier; -import com.djrapitops.plan.data.store.Key; -import com.djrapitops.plan.data.store.keys.SessionKeys; -import com.djrapitops.plan.data.store.mutators.formatting.Formatter; -import com.djrapitops.plan.data.store.mutators.formatting.Formatters; -import com.djrapitops.plan.data.store.objects.DateHolder; -import com.djrapitops.plan.system.cache.CacheSystem; -import com.djrapitops.plan.system.cache.SessionCache; -import com.djrapitops.plan.system.database.databases.Database; -import com.djrapitops.plan.system.info.connection.ConnectionLog; -import com.djrapitops.plan.system.info.connection.ConnectionSystem; -import com.djrapitops.plan.system.info.server.Server; -import com.djrapitops.plan.system.info.server.ServerInfo; -import com.djrapitops.plan.system.info.server.properties.ServerProperties; -import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse; -import com.djrapitops.plan.utilities.file.FileUtil; -import com.djrapitops.plan.utilities.html.Html; -import com.djrapitops.plan.utilities.html.HtmlStructure; import com.djrapitops.plan.utilities.html.icon.Icon; -import com.djrapitops.plan.utilities.html.structure.TabsElement; -import com.djrapitops.plugin.api.Benchmark; -import com.djrapitops.plugin.api.utility.log.ErrorLogger; -import com.djrapitops.plugin.api.utility.log.Log; - -import java.io.File; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; -import java.nio.charset.Charset; -import java.util.*; -import java.util.function.Supplier; +import com.djrapitops.plan.utilities.html.pages.DebugPage; /** * WebServer response for /debug-page used for easing issue reporting. @@ -49,288 +18,8 @@ public class DebugPageResponse extends ErrorResponse { public DebugPageResponse() { super.setHeader("HTTP/1.1 200 OK"); super.setTitle(Icon.called("bug") + " Debug Information"); - super.setParagraph(buildContent()); + super.setParagraph(new DebugPage().toHtml()); replacePlaceholders(); } - private String buildContent() { - StringBuilder preContent = new StringBuilder(); - - String issueLink = Html.LINK_EXTERNAL.parse("https://github.com/Rsl1122/Plan-PlayerAnalytics/issues/new", "Create new issue on Github"); - String hastebinLink = Html.LINK_EXTERNAL.parse("https://hastebin.com/", "Create a new hastebin paste"); - - preContent.append("

") - .append(HtmlStructure.separateWithDots(issueLink, hastebinLink)).append("

") - .append("This page contains debug information for an issue ticket. You can copy it directly into the issue, the info is pre-formatted.") - .append("

"); - - TabsElement.Tab info = new TabsElement.Tab(Icon.called("server") + " Server Information", createServerInfoContent()); - TabsElement.Tab errors = new TabsElement.Tab(Icon.called("exclamation-circle") + " Errors", createErrorContent()); - TabsElement.Tab debugLog = new TabsElement.Tab(Icon.called("bug") + " Debug Log", createDebugLogContent()); - TabsElement.Tab config = new TabsElement.Tab(Icon.called("cogs") + " Plan Config", createConfigContent()); - TabsElement.Tab caches = new TabsElement.Tab(Icon.called("archive") + " Plan Caches", createCacheContent()); - - TabsElement tabs = new TabsElement(info, errors, debugLog, config, caches); - - return preContent + tabs.toHtmlFull(); - } - - private String createCacheContent() { - StringBuilder content = new StringBuilder(); - appendResponseCache(content); - appendSessionCache(content); - appendDataContainerCache(content); - return content.toString(); - } - - private void appendResponseCache(StringBuilder content) { - try { - content.append("
### Cached Responses:

"); - List cacheKeys = new ArrayList<>(ResponseCache.getCacheKeys()); - if (cacheKeys.isEmpty()) { - content.append("Empty"); - } - Collections.sort(cacheKeys); - for (String cacheKey : cacheKeys) { - content.append("- ").append(cacheKey).append("
"); - } - content.append("
"); - } catch (Exception e) { - Log.toLog(this.getClass(), e); - } - } - - private void appendSessionCache(StringBuilder content) { - try { - content.append("
### Session Cache:

"); - content.append("UUID | Session Started
") - .append("-- | --
"); - Formatter timeStamp = Formatters.yearLongValue(); - Set> sessions = SessionCache.getActiveSessions().entrySet(); - if (sessions.isEmpty()) { - content.append("Empty"); - } - for (Map.Entry entry : sessions) { - UUID uuid = entry.getKey(); - String start = entry.getValue().getValue(SessionKeys.START).map(timeStamp).orElse("Unknown"); - content.append(uuid.toString()).append(" | ").append(start).append("
"); - } - content.append("
"); - } catch (Exception e) { - Log.toLog(this.getClass(), e); - } - } - - private void appendDataContainerCache(StringBuilder content) { - try { - content.append("
### DataContainer Cache:

"); - - content.append("Key | Is Cached | Cache Time
") - .append("-- | -- | --
"); - Formatter timeStamp = Formatters.yearLongValue(); - Set> dataContainers = CacheSystem.getInstance().getDataContainerCache().getMap().entrySet(); - if (dataContainers.isEmpty()) { - content.append("Empty"); - } - for (Map.Entry entry : dataContainers) { - String keyName = entry.getKey().getKeyName(); - Supplier supplier = entry.getValue(); - if (supplier instanceof CachingSupplier) { - CachingSupplier cachingSupplier = (CachingSupplier) supplier; - boolean isCached = cachingSupplier.isCached(); - String cacheText = isCached ? "Yes" : "No"; - String cacheTime = isCached ? timeStamp.apply(cachingSupplier.getCacheTime()) : "-"; - content.append(keyName).append(" | ").append(cacheText).append(" | ").append(cacheTime).append("
"); - } else { - content.append(keyName).append(" | ").append("Non-caching Supplier").append(" | ").append("-").append("
"); - } - } - content.append("
"); - } catch (Exception e) { - Log.toLog(this.getClass(), e); - } - } - - private String createConfigContent() { - StringBuilder content = new StringBuilder(); - appendConfig(content); - return content.toString(); - } - - private String createDebugLogContent() { - StringBuilder content = new StringBuilder(); - appendDebugLog(content); - return content.toString(); - } - - private String createErrorContent() { - StringBuilder content = new StringBuilder(); - appendLoggedErrors(content); - return content.toString(); - } - - private String createServerInfoContent() { - StringBuilder content = new StringBuilder(); - - appendServerInformation(content); - appendConnectionLog(content); - appendBenchmarks(content); - - return content.toString(); - } - - private void appendConnectionLog(StringBuilder content) { - try { - Map> logEntries = ConnectionLog.getLogEntries(); - - content.append("
### Connection Log:

"); - content.append("Server Address | Request Type | Response | Sent
") - .append("-- | -- | -- | --
"); - - Formatter formatter = Formatters.second(); - - if (logEntries.isEmpty()) { - content.append("**No Connections Logged**
"); - } - for (Map.Entry> entry : logEntries.entrySet()) { - String address = entry.getKey(); - Map requests = entry.getValue(); - for (Map.Entry requestEntry : requests.entrySet()) { - String infoRequest = requestEntry.getKey(); - ConnectionLog.Entry logEntry = requestEntry.getValue(); - - content.append(address).append(" | ") - .append(infoRequest).append(" | ") - .append(logEntry.getResponseCode()).append(" | ") - .append(formatter.apply(logEntry)).append("
"); - } - - } - content.append("
"); - - content.append("
### Servers:

"); - List servers = ConnectionSystem.getInstance().getBukkitServers(); - content.append("Server Name | Address | UUID
") - .append("-- | -- | --
"); - for (Server server : servers) { - content.append(server.getName()).append(" | ") - .append(server.getWebAddress()).append(" | ") - .append(server.getUuid()).append("
"); - } - content.append("
"); - - } catch (Exception e) { - Log.toLog(this.getClass(), e); - } - } - - private void appendServerInformation(StringBuilder content) { - PlanPlugin plugin = PlanPlugin.getInstance(); - ServerProperties variable = ServerInfo.getServerProperties(); - - content.append("
### Server Information
") - .append("**Plan Version:** ").append(plugin.getVersion()).append("
"); - - content.append("**Server:** "); - content.append(variable.getName()) - .append(" ").append(variable.getImplVersion()) - .append(" ").append(variable.getVersion()); - content.append("
"); - - Database database = Database.getActive(); - content.append("**Database:** ").append(database.getName()); - content.append("

"); - - RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); - Properties properties = System.getProperties(); - - String osName = properties.getProperty("os.name"); - String osVersion = properties.getProperty("os.version"); - String osArch = properties.getProperty("os.arch"); - - String javaVendor = properties.getProperty("java.vendor"); - String javaVersion = properties.getProperty("java.version"); - - String javaVMVendor = properties.getProperty("java.vm.vendor"); - String javaVMName = properties.getProperty("java.vm.name"); - String javaVMVersion = properties.getProperty("java.vm.version"); - List javaVMFlags = runtimeMxBean.getInputArguments(); - - content.append("**Operating SubSystem:** ").append(osName).append(" (").append(osArch) - .append(") version ").append(osVersion).append("
"); - - content.append("**Java Version:** ").append(javaVersion).append(", ").append(javaVendor).append("
"); - content.append("**Java VM Version:** ").append(javaVMName).append(" version ").append(javaVMVersion) - .append(", ").append(javaVMVendor).append("
"); - content.append("**Java VM Flags:** ").append(javaVMFlags).append("
"); - - content.append("
"); - } - - private void appendConfig(StringBuilder content) { - try { - File configFile = new File(PlanPlugin.getInstance().getDataFolder(), "config.yml"); - if (configFile.exists()) { - content.append("
### config.yml
```
"); - FileUtil.lines(configFile, Charset.forName("UTF-8")) - .stream().filter(line -> !line.toLowerCase().contains("pass") && !line.toLowerCase().contains("secret")) - .forEach(line -> content.append(line).append("
")); - content.append("```
"); - } - } catch (IOException e) { - Log.toLog(this.getClass(), e); - } - } - - private void appendBenchmarks(StringBuilder content) { - content.append("
### Benchmarks
```
"); - try { - for (String line : Benchmark.getAverages().asStringArray()) { - content.append(line).append("
"); - } - } catch (Exception e) { - content.append("Exception on Benchmark.getAverages().asStringArray()"); - } - content.append("```
"); - } - - private void appendLoggedErrors(StringBuilder content) { - try { - content.append("
### Logged Errors
"); - - SortedMap> errors = ErrorLogger.getLoggedErrors(PlanPlugin.getInstance()); - - if (!errors.isEmpty()) { - List errorLines = new ArrayList<>(); - for (Map.Entry> entry : errors.entrySet()) { - StringBuilder errorLineBuilder = new StringBuilder(); - for (String line : entry.getValue()) { - errorLineBuilder.append(line).append("
"); - } - String error = errorLineBuilder.toString(); - if (!errorLines.contains(error)) { - errorLines.add(error); - } - } - for (String error : errorLines) { - content.append("
```
") - .append(error) - .append("```"); - } - } else { - content.append("**No Errors logged.**
"); - } - content.append("
"); - } catch (IOException e) { - Log.toLog(this.getClass(), e); - } - } - - private void appendDebugLog(StringBuilder content) { - content.append("
### Debug Log
```
"); - for (String line : Log.getDebugLogInMemory()) { - content.append(line).append("
"); - } - content.append("```
"); - } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/PlayersPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/PlayersPageResponse.java index 5040db598..2b805db9f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/PlayersPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/webserver/response/pages/PlayersPageResponse.java @@ -1,9 +1,9 @@ package com.djrapitops.plan.system.webserver.response.pages; import com.djrapitops.plan.api.exceptions.ParseException; -import com.djrapitops.plan.system.webserver.pages.parsing.PlayersPage; import com.djrapitops.plan.system.webserver.response.Response; import com.djrapitops.plan.system.webserver.response.errors.InternalErrorResponse; +import com.djrapitops.plan.utilities.html.pages.PlayersPage; import com.djrapitops.plugin.api.utility.log.Log; /** diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/AnalysisPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java similarity index 99% rename from Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/AnalysisPage.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java index a8c30cafc..071c60eb1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/AnalysisPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/AnalysisPage.java @@ -2,7 +2,7 @@ * License is provided in the jar as LICENSE also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE */ -package com.djrapitops.plan.system.webserver.pages.parsing; +package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.api.exceptions.ParseException; import com.djrapitops.plan.data.store.containers.AnalysisContainer; diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java new file mode 100644 index 000000000..f01f85926 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/DebugPage.java @@ -0,0 +1,325 @@ +package com.djrapitops.plan.utilities.html.pages; + +import com.djrapitops.plan.PlanPlugin; +import com.djrapitops.plan.data.container.Session; +import com.djrapitops.plan.data.store.CachingSupplier; +import com.djrapitops.plan.data.store.Key; +import com.djrapitops.plan.data.store.keys.SessionKeys; +import com.djrapitops.plan.data.store.mutators.formatting.Formatter; +import com.djrapitops.plan.data.store.mutators.formatting.Formatters; +import com.djrapitops.plan.data.store.objects.DateHolder; +import com.djrapitops.plan.system.cache.CacheSystem; +import com.djrapitops.plan.system.cache.SessionCache; +import com.djrapitops.plan.system.database.databases.Database; +import com.djrapitops.plan.system.info.connection.ConnectionLog; +import com.djrapitops.plan.system.info.connection.ConnectionSystem; +import com.djrapitops.plan.system.info.server.Server; +import com.djrapitops.plan.system.info.server.ServerInfo; +import com.djrapitops.plan.system.info.server.properties.ServerProperties; +import com.djrapitops.plan.system.webserver.response.cache.ResponseCache; +import com.djrapitops.plan.utilities.file.FileUtil; +import com.djrapitops.plan.utilities.html.Html; +import com.djrapitops.plan.utilities.html.HtmlStructure; +import com.djrapitops.plan.utilities.html.icon.Icon; +import com.djrapitops.plan.utilities.html.structure.TabsElement; +import com.djrapitops.plugin.api.Benchmark; +import com.djrapitops.plugin.api.utility.log.ErrorLogger; +import com.djrapitops.plugin.api.utility.log.Log; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.management.RuntimeMXBean; +import java.nio.charset.Charset; +import java.util.*; +import java.util.function.Supplier; + +/** + * Html parsing for the Debug page. + * + * @author Rsl1122 + */ +public class DebugPage implements Page { + + @Override + public String toHtml() { + StringBuilder preContent = new StringBuilder(); + + String issueLink = Html.LINK_EXTERNAL.parse("https://github.com/Rsl1122/Plan-PlayerAnalytics/issues/new", "Create new issue on Github"); + String hastebinLink = Html.LINK_EXTERNAL.parse("https://hastebin.com/", "Create a new hastebin paste"); + + preContent.append("

") + .append(HtmlStructure.separateWithDots(issueLink, hastebinLink)).append("

") + .append("This page contains debug information for an issue ticket. You can copy it directly into the issue, the info is pre-formatted.") + .append("

"); + + TabsElement.Tab info = new TabsElement.Tab(Icon.called("server") + " Server Information", createServerInfoContent()); + TabsElement.Tab errors = new TabsElement.Tab(Icon.called("exclamation-circle") + " Errors", createErrorContent()); + TabsElement.Tab debugLog = new TabsElement.Tab(Icon.called("bug") + " Debug Log", createDebugLogContent()); + TabsElement.Tab config = new TabsElement.Tab(Icon.called("cogs") + " Plan Config", createConfigContent()); + TabsElement.Tab caches = new TabsElement.Tab(Icon.called("archive") + " Plan Caches", createCacheContent()); + + TabsElement tabs = new TabsElement(info, errors, debugLog, config, caches); + + return preContent + tabs.toHtmlFull(); + } + + private String createCacheContent() { + StringBuilder content = new StringBuilder(); + appendResponseCache(content); + appendSessionCache(content); + appendDataContainerCache(content); + return content.toString(); + } + + private void appendResponseCache(StringBuilder content) { + try { + content.append("
### Cached Responses:

"); + List cacheKeys = new ArrayList<>(ResponseCache.getCacheKeys()); + if (cacheKeys.isEmpty()) { + content.append("Empty"); + } + Collections.sort(cacheKeys); + for (String cacheKey : cacheKeys) { + content.append("- ").append(cacheKey).append("
"); + } + content.append("
"); + } catch (Exception e) { + Log.toLog(this.getClass(), e); + } + } + + private void appendSessionCache(StringBuilder content) { + try { + content.append("
### Session Cache:

"); + content.append("UUID | Session Started
") + .append("-- | --
"); + Formatter timeStamp = Formatters.yearLongValue(); + Set> sessions = SessionCache.getActiveSessions().entrySet(); + if (sessions.isEmpty()) { + content.append("Empty"); + } + for (Map.Entry entry : sessions) { + UUID uuid = entry.getKey(); + String start = entry.getValue().getValue(SessionKeys.START).map(timeStamp).orElse("Unknown"); + content.append(uuid.toString()).append(" | ").append(start).append("
"); + } + content.append("
"); + } catch (Exception e) { + Log.toLog(this.getClass(), e); + } + } + + private void appendDataContainerCache(StringBuilder content) { + try { + content.append("
### DataContainer Cache:

"); + + content.append("Key | Is Cached | Cache Time
") + .append("-- | -- | --
"); + Formatter timeStamp = Formatters.yearLongValue(); + Set> dataContainers = CacheSystem.getInstance().getDataContainerCache().getMap().entrySet(); + if (dataContainers.isEmpty()) { + content.append("Empty"); + } + for (Map.Entry entry : dataContainers) { + String keyName = entry.getKey().getKeyName(); + Supplier supplier = entry.getValue(); + if (supplier instanceof CachingSupplier) { + CachingSupplier cachingSupplier = (CachingSupplier) supplier; + boolean isCached = cachingSupplier.isCached(); + String cacheText = isCached ? "Yes" : "No"; + String cacheTime = isCached ? timeStamp.apply(cachingSupplier.getCacheTime()) : "-"; + content.append(keyName).append(" | ").append(cacheText).append(" | ").append(cacheTime).append("
"); + } else { + content.append(keyName).append(" | ").append("Non-caching Supplier").append(" | ").append("-").append("
"); + } + } + content.append("
"); + } catch (Exception e) { + Log.toLog(this.getClass(), e); + } + } + + private String createConfigContent() { + StringBuilder content = new StringBuilder(); + appendConfig(content); + return content.toString(); + } + + private String createDebugLogContent() { + StringBuilder content = new StringBuilder(); + appendDebugLog(content); + return content.toString(); + } + + private String createErrorContent() { + StringBuilder content = new StringBuilder(); + appendLoggedErrors(content); + return content.toString(); + } + + private String createServerInfoContent() { + StringBuilder content = new StringBuilder(); + + appendServerInformation(content); + appendConnectionLog(content); + appendBenchmarks(content); + + return content.toString(); + } + + private void appendConnectionLog(StringBuilder content) { + try { + Map> logEntries = ConnectionLog.getLogEntries(); + + content.append("
### Connection Log:

"); + content.append("Server Address | Request Type | Response | Sent
") + .append("-- | -- | -- | --
"); + + Formatter formatter = Formatters.second(); + + if (logEntries.isEmpty()) { + content.append("**No Connections Logged**
"); + } + for (Map.Entry> entry : logEntries.entrySet()) { + String address = entry.getKey(); + Map requests = entry.getValue(); + for (Map.Entry requestEntry : requests.entrySet()) { + String infoRequest = requestEntry.getKey(); + ConnectionLog.Entry logEntry = requestEntry.getValue(); + + content.append(address).append(" | ") + .append(infoRequest).append(" | ") + .append(logEntry.getResponseCode()).append(" | ") + .append(formatter.apply(logEntry)).append("
"); + } + + } + content.append("
"); + + content.append("
### Servers:

"); + List servers = ConnectionSystem.getInstance().getBukkitServers(); + content.append("Server Name | Address | UUID
") + .append("-- | -- | --
"); + for (Server server : servers) { + content.append(server.getName()).append(" | ") + .append(server.getWebAddress()).append(" | ") + .append(server.getUuid()).append("
"); + } + content.append("
"); + + } catch (Exception e) { + Log.toLog(this.getClass(), e); + } + } + + private void appendServerInformation(StringBuilder content) { + PlanPlugin plugin = PlanPlugin.getInstance(); + ServerProperties variable = ServerInfo.getServerProperties(); + + content.append("
### Server Information
") + .append("**Plan Version:** ").append(plugin.getVersion()).append("
"); + + content.append("**Server:** "); + content.append(variable.getName()) + .append(" ").append(variable.getImplVersion()) + .append(" ").append(variable.getVersion()); + content.append("
"); + + Database database = Database.getActive(); + content.append("**Database:** ").append(database.getName()); + content.append("

"); + + RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); + Properties properties = System.getProperties(); + + String osName = properties.getProperty("os.name"); + String osVersion = properties.getProperty("os.version"); + String osArch = properties.getProperty("os.arch"); + + String javaVendor = properties.getProperty("java.vendor"); + String javaVersion = properties.getProperty("java.version"); + + String javaVMVendor = properties.getProperty("java.vm.vendor"); + String javaVMName = properties.getProperty("java.vm.name"); + String javaVMVersion = properties.getProperty("java.vm.version"); + List javaVMFlags = runtimeMxBean.getInputArguments(); + + content.append("**Operating SubSystem:** ").append(osName).append(" (").append(osArch) + .append(") version ").append(osVersion).append("
"); + + content.append("**Java Version:** ").append(javaVersion).append(", ").append(javaVendor).append("
"); + content.append("**Java VM Version:** ").append(javaVMName).append(" version ").append(javaVMVersion) + .append(", ").append(javaVMVendor).append("
"); + content.append("**Java VM Flags:** ").append(javaVMFlags).append("
"); + + content.append("
"); + } + + private void appendConfig(StringBuilder content) { + try { + File configFile = new File(PlanPlugin.getInstance().getDataFolder(), "config.yml"); + if (configFile.exists()) { + content.append("
### config.yml
```
"); + FileUtil.lines(configFile, Charset.forName("UTF-8")) + .stream().filter(line -> !line.toLowerCase().contains("pass") && !line.toLowerCase().contains("secret")) + .forEach(line -> content.append(line).append("
")); + content.append("```
"); + } + } catch (IOException e) { + Log.toLog(this.getClass(), e); + } + } + + private void appendBenchmarks(StringBuilder content) { + content.append("
### Benchmarks
```
"); + try { + for (String line : Benchmark.getAverages().asStringArray()) { + content.append(line).append("
"); + } + } catch (Exception e) { + content.append("Exception on Benchmark.getAverages().asStringArray()"); + } + content.append("```
"); + } + + private void appendLoggedErrors(StringBuilder content) { + try { + content.append("
### Logged Errors
"); + + SortedMap> errors = ErrorLogger.getLoggedErrors(PlanPlugin.getInstance()); + + if (!errors.isEmpty()) { + List errorLines = new ArrayList<>(); + for (Map.Entry> entry : errors.entrySet()) { + StringBuilder errorLineBuilder = new StringBuilder(); + for (String line : entry.getValue()) { + errorLineBuilder.append(line).append("
"); + } + String error = errorLineBuilder.toString(); + if (!errorLines.contains(error)) { + errorLines.add(error); + } + } + for (String error : errorLines) { + content.append("
```
") + .append(error) + .append("```"); + } + } else { + content.append("**No Errors logged.**
"); + } + content.append("
"); + } catch (IOException e) { + Log.toLog(this.getClass(), e); + } + } + + private void appendDebugLog(StringBuilder content) { + content.append("
### Debug Log
```
"); + for (String line : Log.getDebugLogInMemory()) { + content.append(line).append("
"); + } + content.append("```
"); + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java similarity index 99% rename from Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java index bbcbbbad4..6312d31f4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/InspectPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/InspectPage.java @@ -2,7 +2,7 @@ * License is provided in the jar as LICENSE also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE */ -package com.djrapitops.plan.system.webserver.pages.parsing; +package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.api.exceptions.ParseException; import com.djrapitops.plan.data.container.Session; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/NetworkPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/NetworkPage.java similarity index 97% rename from Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/NetworkPage.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/NetworkPage.java index 333e0c6de..688d155d3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/NetworkPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/NetworkPage.java @@ -2,7 +2,7 @@ * License is provided in the jar as LICENSE also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE */ -package com.djrapitops.plan.system.webserver.pages.parsing; +package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.api.exceptions.ParseException; import com.djrapitops.plan.data.store.containers.NetworkContainer; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/Page.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/Page.java similarity index 85% rename from Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/Page.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/Page.java index a3ec064f1..7b1e1b5b2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/Page.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/Page.java @@ -2,7 +2,7 @@ * License is provided in the jar as LICENSE also here: * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/LICENSE */ -package com.djrapitops.plan.system.webserver.pages.parsing; +package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.api.exceptions.ParseException; diff --git a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/PlayersPage.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java similarity index 96% rename from Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/PlayersPage.java rename to Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java index f2211dbbc..020266e82 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/webserver/pages/parsing/PlayersPage.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java @@ -1,4 +1,4 @@ -package com.djrapitops.plan.system.webserver.pages.parsing; +package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.api.exceptions.ParseException;