From 7208c1a8a7177c0bbd9e559d1543a3137c2f7d67 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sun, 1 Sep 2019 18:16:38 +0300 Subject: [PATCH] Export of Player JSON --- .../manage/ManageExportCommand.java | 38 +++----- .../plan/delivery/export/Exporter.java | 30 ++++++ .../plan/delivery/export/HtmlExport.java | 17 +--- .../plan/delivery/export/JSONExport.java | 94 ------------------- .../delivery/export/PlayerJSONExporter.java | 52 ++++++++++ .../plan/delivery/export/SpecificExport.java | 12 +-- 6 files changed, 97 insertions(+), 146 deletions(-) delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/delivery/export/PlayerJSONExporter.java diff --git a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageExportCommand.java b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageExportCommand.java index f2d63a778..91be26cb3 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageExportCommand.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/commands/subcommands/manage/ManageExportCommand.java @@ -18,9 +18,7 @@ package com.djrapitops.plan.commands.subcommands.manage; import com.djrapitops.plan.delivery.export.Exporter; import com.djrapitops.plan.delivery.export.HtmlExport; -import com.djrapitops.plan.delivery.export.JSONExport; import com.djrapitops.plan.exceptions.ExportException; -import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.processing.Processing; import com.djrapitops.plan.settings.Permissions; import com.djrapitops.plan.settings.config.PlanConfig; @@ -58,10 +56,8 @@ public class ManageExportCommand extends CommandNode { private final ColorScheme colorScheme; private final PlanConfig config; private final DBSystem dbSystem; - private final ServerInfo serverInfo; private final Exporter exporter; private final HtmlExport htmlExport; - private final JSONExport jsonExport; private final Processing processing; @Inject @@ -70,11 +66,9 @@ public class ManageExportCommand extends CommandNode { ColorScheme colorScheme, PlanConfig config, DBSystem dbSystem, - ServerInfo serverInfo, Exporter exporter, Processing processing, - HtmlExport htmlExport, - JSONExport jsonExport + HtmlExport htmlExport ) { super("export", Permissions.MANAGE.getPermission(), CommandType.CONSOLE); @@ -82,10 +76,8 @@ public class ManageExportCommand extends CommandNode { this.colorScheme = colorScheme; this.config = config; this.dbSystem = dbSystem; - this.serverInfo = serverInfo; this.exporter = exporter; this.htmlExport = htmlExport; - this.jsonExport = jsonExport; this.processing = processing; setArguments("/list"); @@ -101,7 +93,7 @@ public class ManageExportCommand extends CommandNode { String exportArg = args[0]; if ("list".equals(exportArg)) { - sender.sendMessage("> " + colorScheme.getMainColor() + "players, server_json"); + sender.sendMessage("> " + colorScheme.getMainColor() + "players"); return; } @@ -115,22 +107,10 @@ public class ManageExportCommand extends CommandNode { } private Consumer getExportFunction(String exportArg) { - switch (exportArg) { - case "players": - return this::exportPlayers; - case "server_json": - return this::exportServerJSON; - default: - return sender -> sender.sendMessage(locale.getString(ManageLang.FAIL_EXPORTER_NOT_FOUND, exportArg)); + if ("players".equals(exportArg)) { + return this::exportPlayers; } - } - - private void exportServerJSON(Sender sender) { - sender.sendMessage(locale.getString(ManageLang.PROGRESS_START)); - processing.submitNonCritical(() -> { - jsonExport.exportServerJSON(serverInfo.getServerUUID()); - sender.sendMessage(locale.getString(ManageLang.PROGRESS_SUCCESS)); - }); + return sender -> sender.sendMessage(locale.getString(ManageLang.FAIL_EXPORTER_NOT_FOUND, exportArg)); } private void exportPlayers(Sender sender) { @@ -140,6 +120,12 @@ public class ManageExportCommand extends CommandNode { } Boolean exportPlayerJSON = config.get(ExportSettings.PLAYER_JSON); Boolean exportPlayerHTML = config.get(ExportSettings.PLAYER_PAGES); + if (!exportPlayerJSON && !exportPlayerHTML) { + sender.sendMessage(locale.getString(ManageLang.PROGRESS_FAIL)); + sender.sendMessage("§c'" + ExportSettings.PLAYER_JSON.getPath() + "' & '" + ExportSettings.PLAYER_PAGES.getPath() + "': false"); + return; + } + processing.submitNonCritical(() -> { Map players = dbSystem.getDatabase().query(UserIdentifierQueries.fetchAllPlayerNames()); int size = players.size(); @@ -148,7 +134,7 @@ public class ManageExportCommand extends CommandNode { int i = 1; for (Map.Entry entry : players.entrySet()) { try { - if (exportPlayerJSON) jsonExport.exportPlayerJSON(entry.getKey()); + if (exportPlayerJSON) exporter.exportPlayerJSON(entry.getKey(), entry.getValue()); if (exportPlayerHTML) exporter.exportPlayerPage(entry.getKey(), entry.getValue()); } catch (ExportException e) { failed++; 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 index 8ea36e3ef..b2f514b05 100644 --- 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 @@ -43,6 +43,7 @@ public class Exporter { private final PlanFiles files; private final PlanConfig config; + private final PlayerJSONExporter playerJSONExporter; private final PlayerPageExporter playerPageExporter; private final ServerPageExporter serverPageExporter; private final NetworkPageExporter networkPageExporter; @@ -53,12 +54,14 @@ public class Exporter { public Exporter( PlanFiles files, PlanConfig config, + PlayerJSONExporter playerJSONExporter, PlayerPageExporter playerPageExporter, ServerPageExporter serverPageExporter, NetworkPageExporter networkPageExporter ) { this.files = files; this.config = config; + this.playerJSONExporter = playerJSONExporter; this.playerPageExporter = playerPageExporter; this.serverPageExporter = serverPageExporter; this.networkPageExporter = networkPageExporter; @@ -73,6 +76,13 @@ public class Exporter { : files.getDataDirectory().resolve(exportDirectory); } + private Path getJSONExportDirectory() { + Path exportDirectory = Paths.get(config.get(ExportSettings.JSON_EXPORT_PATH)); + return exportDirectory.isAbsolute() + ? exportDirectory + : files.getDataDirectory().resolve(exportDirectory); + } + /** * Export a page of a server. * @@ -117,4 +127,24 @@ public class Exporter { throw new ExportException("Failed to export player: " + playerName + ", " + e.getMessage(), e); } } + + /** + * Export Raw Data JSON of a player. + * + * @param playerUUID UUID of the player. + * @param playerName Name of the player. + * @return false if the json was not exported due to config settings. + * @throws ExportException If the export failed due to IOException. + */ + public boolean exportPlayerJSON(UUID playerUUID, String playerName) throws ExportException { + Path toDirectory = getJSONExportDirectory(); + if (!config.get(ExportSettings.PLAYER_JSON)) return false; + + try { + playerJSONExporter.export(toDirectory, playerUUID, playerName); + return true; + } catch (IOException e) { + throw new ExportException("Failed to export player: " + playerName + ", " + e.getMessage(), 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 419bbe8eb..dd00d9f46 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 @@ -16,15 +16,12 @@ */ package com.djrapitops.plan.delivery.export; -import com.djrapitops.plan.delivery.rendering.json.JSONFactory; import com.djrapitops.plan.delivery.rendering.pages.PageFactory; import com.djrapitops.plan.exceptions.ParseException; import com.djrapitops.plan.exceptions.database.DBOpException; 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.storage.database.DBSystem; import com.djrapitops.plan.storage.file.PlanFiles; import com.djrapitops.plugin.logging.L; import com.djrapitops.plugin.logging.error.ErrorHandler; @@ -49,10 +46,6 @@ import java.util.List; 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; @@ -60,20 +53,12 @@ public class HtmlExport extends SpecificExport { public HtmlExport( PlanFiles files, PlanConfig config, - Theme theme, - DBSystem dbSystem, - Exporter exporter, PageFactory pageFactory, - JSONFactory jsonFactory, ServerInfo serverInfo, ErrorHandler errorHandler ) { - super(files, jsonFactory, serverInfo); + super(files, serverInfo); this.config = config; - this.theme = theme; - this.files = files; - this.dbSystem = dbSystem; - this.exporter = exporter; this.pageFactory = pageFactory; this.errorHandler = errorHandler; } 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 deleted file mode 100644 index a2ac1f380..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/JSONExport.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.json.JSONFactory; -import com.djrapitops.plan.delivery.webserver.response.ResponseFactory; -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.storage.database.DBSystem; -import com.djrapitops.plan.storage.database.queries.objects.UserIdentifierQueries; -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.File; -import java.io.IOException; -import java.net.URLEncoder; -import java.util.Collections; -import java.util.UUID; - -/** - * Class in charge of exporting json files. - * - * @author Rsl1122 - */ -@Singleton -@Deprecated -public class JSONExport extends SpecificExport { - - private final PlanConfig config; - private final DBSystem dbSystem; - private final ResponseFactory responseFactory; - private final ErrorHandler errorHandler; - - @Inject - public JSONExport( - PlanFiles files, - PlanConfig config, - DBSystem dbSystem, - ServerInfo serverInfo, - JSONFactory jsonFactory, - ResponseFactory responseFactory, - ErrorHandler errorHandler - ) { - super(files, jsonFactory, serverInfo); - this.config = config; - this.dbSystem = dbSystem; - this.responseFactory = responseFactory; - this.errorHandler = errorHandler; - } - - @Override - protected String getPath() { - return config.get(ExportSettings.JSON_EXPORT_PATH); - } - - public void exportPlayerJSON(UUID playerUUID) { - String json = responseFactory.rawPlayerPageResponse(playerUUID).getContent(); - - dbSystem.getDatabase().query(UserIdentifierQueries.fetchPlayerNameOf(playerUUID)) - .ifPresent(playerName -> { - try { - File htmlLocation = getPlayerFolder(); - htmlLocation.mkdirs(); - File exportFile = new File(htmlLocation, URLEncoder.encode(playerName, "UTF-8") + ".json"); - - export(exportFile, Collections.singletonList(json)); - } catch (IOException e) { - errorHandler.log(L.WARN, this.getClass(), e); - } - }); - } - - public void exportServerJSON(UUID serverUUID) { - // TODO Export JSON Parser results - } -} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/PlayerJSONExporter.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/PlayerJSONExporter.java new file mode 100644 index 000000000..0536c1d2f --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/PlayerJSONExporter.java @@ -0,0 +1,52 @@ +/* + * 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.webserver.response.ResponseFactory; + +import javax.inject.Inject; +import javax.inject.Singleton; +import java.io.IOException; +import java.nio.file.Path; +import java.util.UUID; + +/** + * Handles exporting of player json. + * + * @author Rsl1122 + */ +@Singleton +public class PlayerJSONExporter extends FileExporter { + + private final ResponseFactory responseFactory; + + @Inject + public PlayerJSONExporter( + ResponseFactory responseFactory + ) { + this.responseFactory = responseFactory; + } + + public void export(Path toDirectory, UUID playerUUID, String playerName) throws IOException { + Path to = toDirectory.resolve("player/" + toFileName(playerName) + ".json"); + exportJSON(to, playerUUID); + } + + private void exportJSON(Path to, UUID playerUUID) throws IOException { + export(to, responseFactory.rawPlayerPageResponse(playerUUID).getContent()); + } +} \ 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 7cb40050f..c00aa0213 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 @@ -16,7 +16,6 @@ */ package com.djrapitops.plan.delivery.export; -import com.djrapitops.plan.delivery.rendering.json.JSONFactory; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.storage.file.PlanFiles; @@ -39,15 +38,14 @@ import java.util.List; public abstract class SpecificExport { private final PlanFiles files; - private final JSONFactory jsonFactory; // Hacky, TODO export needs a rework protected final ServerInfo serverInfo; SpecificExport( PlanFiles files, - JSONFactory jsonFactory, ServerInfo serverInfo + ServerInfo serverInfo ) { this.files = files; - this.jsonFactory = jsonFactory; + // Hacky, TODO export needs a rework this.serverInfo = serverInfo; } @@ -75,10 +73,4 @@ public abstract class SpecificExport { Files.write(to.toPath(), lines, StandardCharsets.UTF_8, StandardOpenOption.CREATE); } - File getPlayerFolder() { - File player = new File(getFolder(), "player"); - player.mkdirs(); - return player; - } - }