From c1c2da8517419778e8969076f5e55b41578f64ad Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sun, 1 Sep 2019 13:32:40 +0300 Subject: [PATCH] Server page exporting --- .../commands/subcommands/AnalyzeCommand.java | 2 +- .../plan/delivery/export/ExportPaths.java | 47 +++++ .../plan/delivery/export/ExportSystem.java | 6 +- .../plan/delivery/export/Exporter.java | 74 +++++++ .../plan/delivery/export/FileExporter.java | 80 ++++++++ .../plan/delivery/export/HtmlExport.java | 91 ++------ .../plan/delivery/export/JSONExport.java | 1 + .../delivery/export/ServerPageExporter.java | 194 ++++++++++++++++++ .../plan/delivery/export/SpecificExport.java | 44 +--- .../plan/storage/file/PlanFiles.java | 4 + Plan/config/checkstyle/checkstyle.xml | 1 - 11 files changed, 421 insertions(+), 123 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportPaths.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/Exporter.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ServerPageExporter.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/AnalyzeCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/AnalyzeCommand.java index ad185b69a..0f6c568d5 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/AnalyzeCommand.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/AnalyzeCommand.java @@ -97,7 +97,7 @@ public class AnalyzeCommand extends CommandNode { try { Server server = getServer(args); sendWebUserNotificationIfNecessary(sender); - export.exportServer(server.getUuid()); + export.exportServer(server); // TODO sendLink(server, sender); } catch (DBOpException e) { sender.sendMessage("§cError occurred: " + e.toString()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportPaths.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportPaths.java new file mode 100644 index 000000000..684b4cad0 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportPaths.java @@ -0,0 +1,47 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.delivery.export; + +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * Export utility that takes care of path replacement for different resources referenced in other files. + * + * @author Rsl1122 + */ +public class ExportPaths { + + private List replace; + private List with; + + public ExportPaths() { + replace = new ArrayList<>(); + with = new ArrayList<>(); + } + + public String resolveExportPaths(String original) { + return StringUtils.replaceEach(original, replace.toArray(new String[0]), with.toArray(new String[0])); + } + + public void put(String replace, String with) { + this.replace.add(replace); + this.with.add(with); + } +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java index 928551733..ed90a73a6 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ExportSystem.java @@ -66,9 +66,9 @@ public class ExportSystem implements SubSystem { } if (config.isTrue(ExportSettings.JS_AND_CSS)) { - processing.submitNonCritical(htmlExport::exportJs); - processing.submitNonCritical(htmlExport::exportCss); - processing.submitNonCritical(htmlExport::exportPlugins); +// processing.submitNonCritical(htmlExport::exportJs); +// processing.submitNonCritical(htmlExport::exportCss); +// processing.submitNonCritical(htmlExport::exportPlugins); } if (config.isTrue(ExportSettings.PLAYERS_PAGE)) { processing.submitNonCritical(htmlExport::exportPlayersPage); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/Exporter.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/Exporter.java new file mode 100644 index 000000000..468ec5bdd --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/Exporter.java @@ -0,0 +1,74 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.delivery.export; + +import com.djrapitops.plan.exceptions.ParseException; +import com.djrapitops.plan.exceptions.connection.NotFoundException; +import com.djrapitops.plan.identification.Server; +import com.djrapitops.plan.settings.config.PlanConfig; +import com.djrapitops.plan.settings.config.paths.ExportSettings; +import com.djrapitops.plan.storage.file.PlanFiles; +import com.djrapitops.plugin.logging.L; +import com.djrapitops.plugin.logging.error.ErrorHandler; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Handles export for different pages. + * + * @author Rsl1122 + */ +@Singleton +public class Exporter { + + private final PlanFiles files; + private final PlanConfig config; + private final ServerPageExporter serverPageExporter; + private final ErrorHandler errorHandler; + + @Inject + public Exporter( + PlanFiles files, + PlanConfig config, + ServerPageExporter serverPageExporter, + ErrorHandler errorHandler + ) { + this.files = files; + this.config = config; + this.serverPageExporter = serverPageExporter; + this.errorHandler = errorHandler; + } + + public Path getPageExportDirectory() { + Path exportDirectory = Paths.get(config.get(ExportSettings.HTML_EXPORT_PATH)); + return exportDirectory.isAbsolute() + ? exportDirectory + : files.getDataDirectory().resolve(exportDirectory); + } + + public void exportServerPage(Server server) { + try { + serverPageExporter.export(getPageExportDirectory(), server); + } catch (IOException | NotFoundException | ParseException e) { + errorHandler.log(L.WARN, this.getClass(), e); + } + } +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java new file mode 100644 index 000000000..f4aee8d74 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java @@ -0,0 +1,80 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.delivery.export; + +import com.djrapitops.plan.storage.file.Resource; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.Arrays; +import java.util.List; + +/** + * Code that handles writing the actual files that are exported. + * + * @author Rsl1122 + */ +abstract class FileExporter { + + private static void copy(InputStream in, OutputStream out) throws IOException { + int read; + byte[] bytes = new byte[1024]; + + while ((read = in.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + } + + void export(Path to, List content) throws IOException { + Files.createDirectories(to.getParent()); + Files.write(to, content, StandardCharsets.UTF_8, StandardOpenOption.CREATE); + } + + void export(Path to, String content) throws IOException { + Files.createDirectories(to.getParent()); + Files.write(to, Arrays.asList(StringUtils.split(content, "\r\n")), StandardCharsets.UTF_8, StandardOpenOption.CREATE); + } + + void export(Path to, Resource resource) throws IOException { + Files.createDirectories(to.getParent()); + if (Files.exists(to)) Files.delete(to); + Files.createFile(to); + try ( + InputStream in = resource.asInputStream(); + OutputStream out = Files.newOutputStream(to) + ) { + copy(in, out); + } + } + + String toFileName(String resourceName) { + try { + return URLEncoder.encode(resourceName, "UTF-8").replace(".", "%2E"); + } catch (UnsupportedEncodingException e) { + throw new IllegalStateException("Unexpected: UTF-8 encoding not supported", e); + } + } + +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java index 7f5b342a2..0c03931ad 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/HtmlExport.java @@ -28,7 +28,6 @@ import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.settings.config.PlanConfig; import com.djrapitops.plan.settings.config.paths.ExportSettings; import com.djrapitops.plan.settings.theme.Theme; -import com.djrapitops.plan.settings.theme.ThemeVal; import com.djrapitops.plan.storage.database.DBSystem; import com.djrapitops.plan.storage.database.Database; import com.djrapitops.plan.storage.database.queries.objects.BaseUserQueries; @@ -54,12 +53,14 @@ import java.util.*; * @author Rsl1122 */ @Singleton +@Deprecated public class HtmlExport extends SpecificExport { private final PlanConfig config; private final Theme theme; private final PlanFiles files; private final DBSystem dbSystem; + private final Exporter exporter; private final PageFactory pageFactory; private final ErrorHandler errorHandler; @@ -69,6 +70,7 @@ public class HtmlExport extends SpecificExport { PlanConfig config, Theme theme, DBSystem dbSystem, + Exporter exporter, PageFactory pageFactory, JSONFactory jsonFactory, ServerInfo serverInfo, @@ -79,6 +81,7 @@ public class HtmlExport extends SpecificExport { this.theme = theme; this.files = files; this.dbSystem = dbSystem; + this.exporter = exporter; this.pageFactory = pageFactory; this.errorHandler = errorHandler; } @@ -88,21 +91,13 @@ public class HtmlExport extends SpecificExport { return config.get(ExportSettings.HTML_EXPORT_PATH); } - public void exportServer(UUID serverUUID) { + public void exportServer(Server server) { Database database = dbSystem.getDatabase(); - boolean hasProxy = database.query(ServerQueries.fetchProxyServerInformation()).isPresent(); - if (serverInfo.getServer().isNotProxy() && hasProxy) { - return; - } - database.query(ServerQueries.fetchServerMatchingIdentifier(serverUUID)) - .map(Server::getName) - .ifPresent(serverName -> { - try { - exportAvailableServerPage(serverUUID, serverName); - } catch (IOException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } - }); +// boolean hasProxy = database.query(ServerQueries.fetchProxyServerInformation()).isPresent(); +// if (serverInfo.getServer().isNotProxy() && hasProxy) { +// return; +// } + exporter.exportServerPage(server); } public void exportPlayerPage(UUID playerUUID) { @@ -175,66 +170,6 @@ public class HtmlExport extends SpecificExport { // TODO } - public void exportAvailableServerPages() { - try { - Map serverNames = dbSystem.getDatabase().query(ServerQueries.fetchServerNames()); - - for (Map.Entry entry : serverNames.entrySet()) { - exportAvailableServerPage(entry.getKey(), entry.getValue()); - } - } catch (IOException | DBOpException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } - } - - public void exportCss() { - String[] resources = new String[]{ - "web/css/main.css", - "web/css/materialize.css", - "web/css/style.css", - "web/css/themes/all-themes.css" - }; - copyFromJar(resources); - } - - public void exportJs() { - String[] resources = new String[]{ - "web/js/demo.js", - "web/js/admin.js", - "web/js/helpers.js", - "web/js/script.js", - "web/js/graphs.js" - }; - copyFromJar(resources); - - try { - String demo = files.getCustomizableResourceOrDefault("web/js/demo.js") - .asString() - .replace("${defaultTheme}", theme.getValue(ThemeVal.THEME_DEFAULT)); - List lines = Arrays.asList(demo.split("\n")); - File outputFolder = new File(getFolder(), "js"); - Verify.isTrue(outputFolder.exists() && outputFolder.isDirectory() || outputFolder.mkdirs(), - () -> new FileNotFoundException("Output folder could not be created at " + outputFolder.getAbsolutePath())); - export(new File(outputFolder, "demo.js"), lines); - } catch (IOException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } - } - - public void exportPlugins() { - String[] resources = new String[]{ - "web/plugins/node-waves/waves.css", - "web/plugins/node-waves/waves.js", - "web/plugins/animate-css/animate.css", - "web/plugins/jquery-slimscroll/jquery.slimscroll.js", - "web/plugins/jquery/jquery.min.js", - "web/plugins/fullcalendar/fullcalendar.min.js", - "web/plugins/fullcalendar/fullcalendar.min.css", - "web/plugins/momentjs/moment.js", - }; - copyFromJar(resources); - } - private void copyFromJar(String[] resources) { for (String resource : resources) { try { @@ -263,4 +198,10 @@ public class HtmlExport extends SpecificExport { export(to, lines); } + + public void exportAvailableServerPages() { + for (Server server : dbSystem.getDatabase().query(ServerQueries.fetchPlanServerInformationCollection())) { + exportServer(server); + } + } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java index 866531ac7..a2ac1f380 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java @@ -41,6 +41,7 @@ import java.util.UUID; * @author Rsl1122 */ @Singleton +@Deprecated public class JSONExport extends SpecificExport { private final PlanConfig config; diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ServerPageExporter.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ServerPageExporter.java new file mode 100644 index 000000000..12227d64a --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/ServerPageExporter.java @@ -0,0 +1,194 @@ +/* + * This file is part of Player Analytics (Plan). + * + * Plan is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License v3 as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Plan is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Plan. If not, see . + */ +package com.djrapitops.plan.delivery.export; + +import com.djrapitops.plan.delivery.rendering.pages.PageFactory; +import com.djrapitops.plan.delivery.rendering.pages.ServerPage; +import com.djrapitops.plan.delivery.webserver.RequestTarget; +import com.djrapitops.plan.delivery.webserver.pages.json.RootJSONHandler; +import com.djrapitops.plan.delivery.webserver.response.Response; +import com.djrapitops.plan.delivery.webserver.response.errors.ErrorResponse; +import com.djrapitops.plan.exceptions.ParseException; +import com.djrapitops.plan.exceptions.connection.NotFoundException; +import com.djrapitops.plan.exceptions.connection.WebException; +import com.djrapitops.plan.identification.Server; +import com.djrapitops.plan.identification.ServerInfo; +import com.djrapitops.plan.storage.file.PlanFiles; +import com.djrapitops.plan.storage.file.Resource; +import org.apache.commons.lang3.StringUtils; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Path; +import java.util.UUID; + +/** + * Handles exporting of /server page html, data and resources. + * + * @author Rsl1122 + */ +@Singleton +public class ServerPageExporter extends FileExporter { + + private final PlanFiles files; + private final PageFactory pageFactory; + private final RootJSONHandler jsonHandler; + private final ServerInfo serverInfo; + + private final ExportPaths exportPaths; + + @Inject + public ServerPageExporter( + PlanFiles files, + PageFactory pageFactory, + RootJSONHandler jsonHandler, + ServerInfo serverInfo // To know if current server is a Proxy + ) { + this.files = files; + this.pageFactory = pageFactory; + this.jsonHandler = jsonHandler; + this.serverInfo = serverInfo; + + exportPaths = new ExportPaths(); + } + + public void export(Path toDirectory, Server server) throws IOException, NotFoundException, ParseException { + exportRequiredResources(toDirectory); + exportJSON(toDirectory, server); + exportHtml(toDirectory, server); + } + + private void exportHtml(Path toDirectory, Server server) throws IOException, NotFoundException, ParseException { + UUID serverUUID = server.getUuid(); + Path to = toDirectory + .resolve(serverInfo.getServer().isProxy() ? "server/" + server.getName() : "server") + .resolve("index.html"); + + ServerPage serverPage = pageFactory.serverPage(serverUUID); + export(to, exportPaths.resolveExportPaths(serverPage.toHtml())); + } + + private void exportJSON(Path toDirectory, Server server) throws IOException, NotFoundException { + String serverName = server.getName(); + + exportJSON(toDirectory, "serverOverview?server=" + serverName); + exportJSON(toDirectory, "onlineOverview?server=" + serverName); + exportJSON(toDirectory, "sessionsOverview?server=" + serverName); + exportJSON(toDirectory, "playerVersus?server=" + serverName); + exportJSON(toDirectory, "playerbaseOverview?server=" + serverName); + exportJSON(toDirectory, "performanceOverview?server=" + serverName); + exportJSON(toDirectory, "graph?type=performance&server=" + serverName); + exportJSON(toDirectory, "graph?type=aggregatedPing&server=" + serverName); + exportJSON(toDirectory, "graph?type=worldPie&server=" + serverName); + exportJSON(toDirectory, "graph?type=activity&server=" + serverName); + exportJSON(toDirectory, "graph?type=geolocation&server=" + serverName); + exportJSON(toDirectory, "graph?type=uniqueAndNew&server=" + serverName); + exportJSON(toDirectory, "graph?type=serverCalendar&server=" + serverName); + exportJSON(toDirectory, "graph?type=punchCard&server=" + serverName); + exportJSON(toDirectory, "players?server=" + serverName); + exportJSON(toDirectory, "kills?server=" + serverName); + exportJSON(toDirectory, "pingTable?server=" + serverName); + exportJSON(toDirectory, "sessions?server=" + serverName); + } + + private void exportJSON(Path toDirectory, String resource) throws NotFoundException, IOException { + Response found = getJSONResponse(resource); + if (found instanceof ErrorResponse) { + throw new NotFoundException(resource + " was not properly exported: " + found.getContent()); + } + + String jsonResourceName = toFileName(toJSONResourceName(resource)) + ".json"; + + export(toDirectory.resolve("data").resolve(jsonResourceName), found.getContent()); + exportPaths.put("../v1/" + resource, toRelativePathFromRoot("data/" + jsonResourceName)); + } + + private String toJSONResourceName(String resource) { + return StringUtils.replaceEach(resource, new String[]{"?", "&", "type=", "server="}, new String[]{"-", "_", "", ""}); + } + + private Response getJSONResponse(String resource) { + try { + return jsonHandler.getResponse(null, new RequestTarget(URI.create(resource))); + } catch (WebException e) { + // The rest of the exceptions should not be thrown + throw new IllegalStateException("Unexpected exception thrown: " + e.toString(), e); + } + } + + private void exportRequiredResources(Path toDirectory) throws IOException { + // Style + exportResource(toDirectory, "css/sb-admin-2.css"); + exportResource(toDirectory, "css/style.css"); + exportImage(toDirectory, "img/Flaticon_circle.png"); + + // Plugins + exportResource(toDirectory, "vendor/jquery/jquery.min.js"); + exportResource(toDirectory, "vendor/bootstrap/js/bootstrap.bundle.min.js"); + exportResource(toDirectory, "vendor/jquery-easing/jquery.easing.min.js"); + exportResource(toDirectory, "vendor/datatables/jquery.dataTables.min.js"); + exportResource(toDirectory, "vendor/datatables/dataTables.bootstrap4.min.js"); + exportResource(toDirectory, "vendor/highcharts/highstock.js"); + exportResource(toDirectory, "vendor/highcharts/map.js"); + exportResource(toDirectory, "vendor/highcharts/world.js"); + exportResource(toDirectory, "vendor/highcharts/drilldown.js"); + exportResource(toDirectory, "vendor/highcharts/highcharts-more.js"); + exportResource(toDirectory, "vendor/highcharts/no-data-to-display.js"); + exportResource(toDirectory, "vendor/fullcalendar/fullcalendar.min.css"); + exportResource(toDirectory, "vendor/momentjs/moment.js"); + exportResource(toDirectory, "vendor/fullcalendar/fullcalendar.min.js"); + + // Page level plugins + exportResource(toDirectory, "js/sb-admin-2.js"); + exportResource(toDirectory, "js/xmlhttprequests.js"); + exportResource(toDirectory, "js/color-selector.js"); + + // Page level scripts + exportResource(toDirectory, "js/sessionAccordion.js"); + exportResource(toDirectory, "js/pingTable.js"); + exportResource(toDirectory, "js/graphs.js"); + exportResource(toDirectory, "js/server-values.js"); + } + + private void exportResource(Path toDirectory, String resourceName) throws IOException { + Resource resource = files.getCustomizableResourceOrDefault("web/" + resourceName); + Path to = toDirectory.resolve(resourceName); + export(to, resource.asLines()); + + exportPaths.put(resourceName, toRelativePathFromRoot(resourceName)); + } + + private void exportImage(Path toDirectory, String resourceName) throws IOException { + Resource resource = files.getCustomizableResourceOrDefault("web/" + resourceName); + Path to = toDirectory.resolve(resourceName); + export(to, resource); + + exportPaths.put(resourceName, toRelativePathFromRoot(resourceName)); + } + + private String toRelativePathFromRoot(String resourceName) { + // Server html is exported at /server//index.html or /server/index.html + return (serverInfo.getServer().isProxy() ? "../../" : "../") + toNonRelativePath(resourceName); + } + + private String toNonRelativePath(String resourceName) { + return StringUtils.remove(resourceName, "../"); + } + +} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java index f16374861..0e1e7fe62 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/SpecificExport.java @@ -29,7 +29,6 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.UUID; @@ -40,6 +39,7 @@ import java.util.UUID; * * @author Rsl1122 */ +@Deprecated public abstract class SpecificExport { private final PlanFiles files; @@ -110,46 +110,4 @@ public abstract class SpecificExport { String html = response.getContent(); exportPlayerPage(name, html); } - - void exportAvailableServerPage(UUID serverUUID, String serverName) throws IOException { - // TODO Force export in the future - Response response = null; - if (response == null) { - return; - } - - String html = response.getContent() - .replace("href=\"plugins/", "href=\"../plugins/") - .replace("href=\"css/", "href=\"../css/") - .replace("src=\"plugins/", "src=\"../plugins/") - .replace("src=\"js/", "src=\"../js/") - .replace("../json/players?serverName=" + serverName, "./players_table.json"); - - File htmlLocation; - if (serverInfo.getServer().isProxy()) { - if (serverUUID.equals(serverInfo.getServerUUID())) { - htmlLocation = new File(getFolder(), "network"); - } else { - htmlLocation = new File(getServerFolder(), URLEncoder.encode(serverName, "UTF-8").replace(".", "%2E")); - html = html.replace("../", "../../"); - exportPlayersTableJSON(htmlLocation, serverUUID); - } - } else { - htmlLocation = getServerFolder(); - exportPlayersTableJSON(htmlLocation, serverUUID); - } - - htmlLocation.mkdirs(); - File exportFile = new File(htmlLocation, "index.html"); - - List lines = Arrays.asList(html.split("\n")); - - export(exportFile, lines); - } - - private void exportPlayersTableJSON(File htmlLocation, UUID serverUUID) throws IOException { - htmlLocation.mkdirs(); - File exportFile = new File(htmlLocation, "players_table.json"); - export(exportFile, Collections.singletonList(jsonFactory.serverPlayersTableJSON(serverUUID))); - } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java index 09d933c45..67b789aac 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java @@ -53,6 +53,10 @@ public class PlanFiles implements SubSystem { return dataFolder; } + public Path getDataDirectory() { + return dataFolder.toPath(); + } + public File getLogsFolder() { File folder = getFileFromPluginFolder("logs"); folder.mkdirs(); diff --git a/Plan/config/checkstyle/checkstyle.xml b/Plan/config/checkstyle/checkstyle.xml index b4be762da..57e57dd8d 100644 --- a/Plan/config/checkstyle/checkstyle.xml +++ b/Plan/config/checkstyle/checkstyle.xml @@ -34,7 +34,6 @@ -