From de9f9ec5b4086b51c6ff2e2b0e2507bd6ddaf100 Mon Sep 17 00:00:00 2001 From: Aurora Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Sat, 9 Mar 2024 14:43:41 +0200 Subject: [PATCH] Sonar fixes (#3510) * Remove deprecated code - RemoveUnsatisfiedConditionalPlayerResultsTransaction.java - RemoveUnsatisfiedConditionalServerResultsTransaction.java * Fix apache compress deprecations - Use org.apache.commons.io.IOUtils instead of org.apache.commons.compress.utils.IOUtils - Use TarArchiveInputStream#getNextEntry instead of getNextTarEntry * Rename variable in BukkitPingCounter * Extract ApiServices from PlanSystem --- .../gathering/timed/BukkitPingCounter.java | 6 +- .../java/com/djrapitops/plan/ApiServices.java | 119 +++++++++++ .../java/com/djrapitops/plan/PlanSystem.java | 56 +---- ...edConditionalPlayerResultsTransaction.java | 195 ------------------ ...edConditionalServerResultsTransaction.java | 152 -------------- .../geolocation/GeoLite2Geolocator.java | 6 +- .../plan/storage/file/JarResource.java | 2 +- .../plan/storage/upkeep/DBCleanTask.java | 2 - .../subcommands/RegistrationCommandsTest.java | 2 +- .../delivery/webserver/AccessControlTest.java | 4 +- .../webserver/HttpAccessControlTest.java | 2 +- .../delivery/webserver/HttpsServerTest.java | 6 +- .../database/DatabaseTestPreparer.java | 4 +- .../queries/ExtensionsDatabaseTest.java | 8 - 14 files changed, 143 insertions(+), 421 deletions(-) create mode 100644 Plan/common/src/main/java/com/djrapitops/plan/ApiServices.java delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalPlayerResultsTransaction.java delete mode 100644 Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalServerResultsTransaction.java diff --git a/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitPingCounter.java b/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitPingCounter.java index 952a83db2..d81b80dff 100644 --- a/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitPingCounter.java +++ b/Plan/bukkit/src/main/java/com/djrapitops/plan/gathering/timed/BukkitPingCounter.java @@ -89,9 +89,9 @@ public class BukkitPingCounter extends TaskSystem.Task implements Listener { startRecording = new ConcurrentHashMap<>(); playerHistory = new HashMap<>(); - Optional pingMethod = loadPingMethod(); - if (pingMethod.isPresent()) { - this.pingMethod = pingMethod.get(); + Optional loaded = loadPingMethod(); + if (loaded.isPresent()) { + this.pingMethod = loaded.get(); pingMethodAvailable = true; } else { pingMethodAvailable = false; diff --git a/Plan/common/src/main/java/com/djrapitops/plan/ApiServices.java b/Plan/common/src/main/java/com/djrapitops/plan/ApiServices.java new file mode 100644 index 000000000..c3dd25097 --- /dev/null +++ b/Plan/common/src/main/java/com/djrapitops/plan/ApiServices.java @@ -0,0 +1,119 @@ +/* + * 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; + +import com.djrapitops.plan.component.ComponentSvc; +import com.djrapitops.plan.delivery.web.ResolverSvc; +import com.djrapitops.plan.delivery.web.ResourceSvc; +import com.djrapitops.plan.extension.ExtensionSvc; +import com.djrapitops.plan.query.QuerySvc; +import com.djrapitops.plan.settings.ListenerSvc; +import com.djrapitops.plan.settings.SchedulerSvc; +import com.djrapitops.plan.settings.SettingsSvc; + +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * Breaks up {@link PlanSystem} to be a smaller class. + * + * @author AuroraLS3 + */ +@Singleton +public class ApiServices { + + private final ComponentSvc componentService; + private final ResolverSvc resolverService; + private final ResourceSvc resourceService; + private final ExtensionSvc extensionService; + private final QuerySvc queryService; + private final ListenerSvc listenerService; + private final SettingsSvc settingsService; + private final SchedulerSvc schedulerService; + + @Inject + public ApiServices( + ComponentSvc componentService, + ResolverSvc resolverService, + ResourceSvc resourceService, + ExtensionSvc extensionService, + QuerySvc queryService, + ListenerSvc listenerService, + SettingsSvc settingsService, + SchedulerSvc schedulerService + ) { + this.componentService = componentService; + this.resolverService = resolverService; + this.resourceService = resourceService; + this.extensionService = extensionService; + this.queryService = queryService; + this.listenerService = listenerService; + this.settingsService = settingsService; + this.schedulerService = schedulerService; + } + + public void register() { + extensionService.register(); + componentService.register(); + resolverService.register(); + resourceService.register(); + listenerService.register(); + settingsService.register(); + schedulerService.register(); + queryService.register(); + } + + public void registerExtensions() { + extensionService.registerExtensions(); + } + + public void disableExtensionDataUpdates() { + extensionService.disableUpdates(); + } + + public ComponentSvc getComponentService() { + return componentService; + } + + public ResolverSvc getResolverService() { + return resolverService; + } + + public ResourceSvc getResourceService() { + return resourceService; + } + + public ExtensionSvc getExtensionService() { + return extensionService; + } + + public QuerySvc getQueryService() { + return queryService; + } + + public ListenerSvc getListenerService() { + return listenerService; + } + + public SettingsSvc getSettingsService() { + return settingsService; + } + + public SchedulerSvc getSchedulerService() { + return schedulerService; + } +} diff --git a/Plan/common/src/main/java/com/djrapitops/plan/PlanSystem.java b/Plan/common/src/main/java/com/djrapitops/plan/PlanSystem.java index 7b4f2f19d..15304077e 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/PlanSystem.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/PlanSystem.java @@ -17,25 +17,17 @@ package com.djrapitops.plan; import com.djrapitops.plan.api.PlanAPI; -import com.djrapitops.plan.component.ComponentSvc; import com.djrapitops.plan.delivery.DeliveryUtilities; import com.djrapitops.plan.delivery.export.ExportSystem; import com.djrapitops.plan.delivery.formatting.Formatters; -import com.djrapitops.plan.delivery.web.ResolverSvc; -import com.djrapitops.plan.delivery.web.ResourceSvc; import com.djrapitops.plan.delivery.webserver.NonProxyWebserverDisableChecker; import com.djrapitops.plan.delivery.webserver.WebServerSystem; -import com.djrapitops.plan.extension.ExtensionSvc; import com.djrapitops.plan.gathering.cache.CacheSystem; import com.djrapitops.plan.gathering.importing.ImportSystem; import com.djrapitops.plan.gathering.listeners.ListenerSystem; import com.djrapitops.plan.identification.ServerInfo; import com.djrapitops.plan.processing.Processing; -import com.djrapitops.plan.query.QuerySvc; import com.djrapitops.plan.settings.ConfigSystem; -import com.djrapitops.plan.settings.ListenerSvc; -import com.djrapitops.plan.settings.SchedulerSvc; -import com.djrapitops.plan.settings.SettingsSvc; import com.djrapitops.plan.settings.locale.LocaleSystem; import com.djrapitops.plan.storage.database.DBSystem; import com.djrapitops.plan.storage.file.PlanFiles; @@ -77,14 +69,7 @@ public class PlanSystem implements SubSystem { private final ImportSystem importSystem; private final ExportSystem exportSystem; private final DeliveryUtilities deliveryUtilities; - private final ComponentSvc componentService; - private final ResolverSvc resolverService; - private final ResourceSvc resourceService; - private final ExtensionSvc extensionService; - private final QuerySvc queryService; - private final ListenerSvc listenerService; - private final SettingsSvc settingsService; - private final SchedulerSvc schedulerService; + private final ApiServices apiServices; private final PluginLogger logger; private final ErrorLogger errorLogger; @@ -104,16 +89,9 @@ public class PlanSystem implements SubSystem { ImportSystem importSystem, ExportSystem exportSystem, DeliveryUtilities deliveryUtilities, - ComponentSvc componentService, - ResolverSvc resolverService, - ResourceSvc resourceService, - ExtensionSvc extensionService, - QuerySvc queryService, - ListenerSvc listenerService, - SettingsSvc settingsService, - SchedulerSvc schedulerService, PluginLogger logger, ErrorLogger errorLogger, + ApiServices apiServices, // API v5 @SuppressWarnings("deprecation") PlanAPI.PlanAPIHolder apiHolder // Deprecated PlanAPI, backwards compatibility ) { this.files = files; @@ -130,16 +108,9 @@ public class PlanSystem implements SubSystem { this.importSystem = importSystem; this.exportSystem = exportSystem; this.deliveryUtilities = deliveryUtilities; - this.componentService = componentService; - this.resolverService = resolverService; - this.resourceService = resourceService; - this.extensionService = extensionService; - this.queryService = queryService; - this.listenerService = listenerService; - this.settingsService = settingsService; - this.schedulerService = schedulerService; this.logger = logger; this.errorLogger = errorLogger; + this.apiServices = apiServices; logger.info("§2"); logger.info("§2 ██▌"); @@ -162,14 +133,7 @@ public class PlanSystem implements SubSystem { * Enables the rest of the systems that are not enabled in {@link #enableForCommands()}. */ public void enableOtherThanCommands() { - extensionService.register(); - componentService.register(); - resolverService.register(); - resourceService.register(); - listenerService.register(); - settingsService.register(); - schedulerService.register(); - queryService.register(); + apiServices.register(); enableSystems( processing, @@ -193,7 +157,7 @@ public class PlanSystem implements SubSystem { )); } - extensionService.registerExtensions(); + apiServices.registerExtensions(); enabled = true; String javaVersion = System.getProperty("java.specification.version"); @@ -223,7 +187,7 @@ public class PlanSystem implements SubSystem { enabled = false; Formatters.clearSingleton(); - extensionService.disableUpdates(); + apiServices.disableExtensionDataUpdates(); disableSystems( taskSystem, @@ -316,12 +280,8 @@ public class PlanSystem implements SubSystem { return enabled; } - public ExtensionSvc getExtensionService() { - return extensionService; - } - - public ComponentSvc getComponentService() { - return componentService; + public ApiServices getApiServices() { + return apiServices; } public static long getServerEnableTime() { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalPlayerResultsTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalPlayerResultsTransaction.java deleted file mode 100644 index d688fe5a6..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalPlayerResultsTransaction.java +++ /dev/null @@ -1,195 +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.extension.implementation.storage.transactions.results; - -import com.djrapitops.plan.storage.database.DBType; -import com.djrapitops.plan.storage.database.sql.tables.UsersTable; -import com.djrapitops.plan.storage.database.sql.tables.extension.*; -import com.djrapitops.plan.storage.database.transactions.ExecStatement; -import com.djrapitops.plan.storage.database.transactions.Executable; -import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction; - -import java.sql.PreparedStatement; -import java.sql.SQLException; - -import static com.djrapitops.plan.storage.database.sql.building.Sql.*; - -/** - * Transaction to remove older results that violate an updated condition value. - *

- * How it works: - * - Select all fulfilled conditions for all players (conditionName when true and not_conditionName when false) - * - Left join with player value and provider tables when uuids match, and when condition matches a condition in the query above. - * - Filter the join query for values where the condition did not match any provided condition in the join (Is null) - * - Delete all player values with IDs that are returned by the left join query after filtering - * - * @author AuroraLS3 - * @deprecated Cleanup is now done as part of {@link StorePlayerBooleanResultTransaction}. - */ -@Deprecated(since = "2024-03-02") -public class RemoveUnsatisfiedConditionalPlayerResultsTransaction extends ThrowawayTransaction { - - private final String providerTable; - private final String playerValueTable; - private final String playerTableValueTable; - private final String tableTable; - private final String groupTable; - - public RemoveUnsatisfiedConditionalPlayerResultsTransaction() { - providerTable = ExtensionProviderTable.TABLE_NAME; - playerValueTable = ExtensionPlayerValueTable.TABLE_NAME; - tableTable = ExtensionTableProviderTable.TABLE_NAME; - groupTable = ExtensionGroupsTable.TABLE_NAME; - playerTableValueTable = ExtensionPlayerTableValueTable.TABLE_NAME; - } - - @Override - protected void performOperations() { - String selectSatisfiedConditions = getSatisfiedConditionsSQL(); - - execute(deleteUnsatisfiedValues(selectSatisfiedConditions)); - execute(deleteUnsatisfiedGroupValues(selectSatisfiedConditions)); - execute(deleteUnsatisfiedTableValues(selectSatisfiedConditions)); - } - - private String getSatisfiedConditionsSQL() { - String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')'; - - String selectSatisfiedPositiveConditions = SELECT + - ExtensionProviderTable.PROVIDED_CONDITION + ',' + - ExtensionProviderTable.PLUGIN_ID + ',' + - "u." + UsersTable.ID + " as user_id" + - FROM + providerTable + - INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID + - INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.USER_UUID + "=" + playerValueTable + "." + ExtensionPlayerTableValueTable.USER_UUID + - WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" + - AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL; - String selectSatisfiedNegativeConditions = SELECT + - reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' + - ExtensionProviderTable.PLUGIN_ID + ',' + - "u." + UsersTable.ID + " as user_id" + - FROM + providerTable + - INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID + - INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.USER_UUID + "=" + playerValueTable + "." + ExtensionPlayerTableValueTable.USER_UUID + - WHERE + ExtensionPlayerValueTable.BOOLEAN_VALUE + "=?" + - AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL; - - // Query contents: Set of provided_conditions - return '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1"; - } - - private Executable deleteUnsatisfiedValues(String selectSatisfiedConditions) { - // Query contents: - // id | uuid | q1.uuid | condition | q1.provided_condition - // -- | ---- | ------- | --------- | --------------------- - // 1 | ... | ... | A | A Satisfied condition - // 2 | ... | ... | not_B | not_B Satisfied condition - // 3 | ... | ... | NULL | NULL Satisfied condition - // 4 | ... | ... | B | NULL Unsatisfied condition, filtered to these in WHERE clause. - // 5 | ... | ... | not_C | NULL Unsatisfied condition - String selectUnsatisfiedValueIDs = SELECT + playerValueTable + '.' + ExtensionPlayerValueTable.ID + - FROM + providerTable + - INNER_JOIN + playerValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionPlayerValueTable.PROVIDER_ID + - INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.USER_UUID + "=" + playerValueTable + "." + ExtensionPlayerTableValueTable.USER_UUID + - LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled - " on (" + // Join when uuid and plugin_id match and condition for the group provider is satisfied - "u." + UsersTable.ID + "=q1.user_id" + - AND + ExtensionProviderTable.CONDITION + "=q1." + ExtensionProviderTable.PROVIDED_CONDITION + - AND + providerTable + '.' + ExtensionProviderTable.PLUGIN_ID + "=q1." + ExtensionProviderTable.PLUGIN_ID + - ')' + - WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query - AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition - - // Nested query here is required because MySQL limits update statements with nested queries: - // The nested query creates a temporary table that bypasses the same table query-update limit. - // Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception. - String sql = DELETE_FROM + playerValueTable + - WHERE + ExtensionPlayerValueTable.ID + " IN (" + SELECT + ExtensionPlayerValueTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)"; - - return new ExecStatement(sql) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setBoolean(1, true); // Select provided conditions with 'true' value - statement.setBoolean(2, false); // Select negated conditions with 'false' value - } - }; - } - - private Executable deleteUnsatisfiedTableValues(String selectSatisfiedConditions) { - String selectUnsatisfiedValueIDs = SELECT + ExtensionTableProviderTable.ID + - FROM + tableTable + - LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled - " on (" + // Join when plugin_id matches and condition for the group provider is satisfied - tableTable + '.' + ExtensionTableProviderTable.CONDITION + - "=q1." + ExtensionProviderTable.PROVIDED_CONDITION + - AND + tableTable + '.' + ExtensionTableProviderTable.PLUGIN_ID + - "=q1." + ExtensionProviderTable.PLUGIN_ID + - ')' + - WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query - AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition - - // Nested query here is required because MySQL limits update statements with nested queries: - // The nested query creates a temporary table that bypasses the same table query-update limit. - // Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception. - String deleteValuesSQL = DELETE_FROM + playerTableValueTable + - WHERE + ExtensionPlayerTableValueTable.TABLE_ID + " IN (" + SELECT + ExtensionTableProviderTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)"; - - return new ExecStatement(deleteValuesSQL) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setBoolean(1, true); // Select provided conditions with 'true' value - statement.setBoolean(2, false); // Select negated conditions with 'false' value - } - }; - } - - private Executable deleteUnsatisfiedGroupValues(String selectSatisfiedConditions) { - // plan_extensions_player_groups.id is needed for removal of the correct row. - // The id is known if group_id & uuid are known - // - - // Conditions are in plan_extensions_providers - // selectSatisfiedConditions lists 'provided_condition' Strings - String selectUnsatisfiedIDs = SELECT + groupTable + '.' + ID + - FROM + groupTable + - INNER_JOIN + UsersTable.TABLE_NAME + " u on u." + UsersTable.USER_UUID + "=" + groupTable + "." + ExtensionGroupsTable.USER_UUID + - INNER_JOIN + providerTable + " on " + providerTable + '.' + ID + '=' + groupTable + '.' + ExtensionGroupsTable.PROVIDER_ID + - LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled - " on (" + // Join when uuid and plugin_id match and condition for the group provider is satisfied - "u." + UsersTable.ID + "=q1.user_id" + - AND + ExtensionProviderTable.CONDITION + - "=q1." + ExtensionProviderTable.PROVIDED_CONDITION + - AND + providerTable + '.' + ExtensionProviderTable.PLUGIN_ID + - "=q1." + ExtensionProviderTable.PLUGIN_ID + - ')' + - WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query - AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition - - // Nested query here is required because MySQL limits update statements with nested queries: - // The nested query creates a temporary table that bypasses the same table query-update limit. - // Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception. - String deleteValuesSQL = DELETE_FROM + groupTable + - WHERE + ID + " IN (" + SELECT + ID + FROM + '(' + selectUnsatisfiedIDs + ") as ids)"; - - return new ExecStatement(deleteValuesSQL) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setBoolean(1, true); // Select provided conditions with 'true' value - statement.setBoolean(2, false); // Select negated conditions with 'false' value - } - }; - } -} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalServerResultsTransaction.java b/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalServerResultsTransaction.java deleted file mode 100644 index 666b6c9e9..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/extension/implementation/storage/transactions/results/RemoveUnsatisfiedConditionalServerResultsTransaction.java +++ /dev/null @@ -1,152 +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.extension.implementation.storage.transactions.results; - -import com.djrapitops.plan.storage.database.DBType; -import com.djrapitops.plan.storage.database.sql.tables.extension.ExtensionProviderTable; -import com.djrapitops.plan.storage.database.sql.tables.extension.ExtensionServerTableValueTable; -import com.djrapitops.plan.storage.database.sql.tables.extension.ExtensionServerValueTable; -import com.djrapitops.plan.storage.database.sql.tables.extension.ExtensionTableProviderTable; -import com.djrapitops.plan.storage.database.transactions.ExecStatement; -import com.djrapitops.plan.storage.database.transactions.Executable; -import com.djrapitops.plan.storage.database.transactions.ThrowawayTransaction; - -import java.sql.PreparedStatement; -import java.sql.SQLException; - -import static com.djrapitops.plan.storage.database.sql.building.Sql.*; - -/** - * Transaction to remove older results that violate an updated condition value. - *

- * How it works: - * - Select all fulfilled conditions for all servers (conditionName when true and not_conditionName when false) - * - Left join with server value and provider tables when plugin_ids match, and when condition matches a condition in the - * query above. (plugin_ids can be linked to servers) - * - Filter the join query for values where the condition did not match any provided condition in the join (Is null) - * - Delete all server values with IDs that are returned by the left join query after filtering - * - * @author AuroraLS3 - * @deprecated Cleanup is now done in {@link StoreServerBooleanResultTransaction}. - */ -@Deprecated(since = "2024-03-02") -public class RemoveUnsatisfiedConditionalServerResultsTransaction extends ThrowawayTransaction { - - private final String providerTable; - private final String serverValueTable; - private final String serverTableValueTable; - private final String tableTable; - - public RemoveUnsatisfiedConditionalServerResultsTransaction() { - providerTable = ExtensionProviderTable.TABLE_NAME; - serverValueTable = ExtensionServerValueTable.TABLE_NAME; - tableTable = ExtensionTableProviderTable.TABLE_NAME; - serverTableValueTable = ExtensionServerTableValueTable.TABLE_NAME; - } - - @Override - protected void performOperations() { - String selectSatisfiedConditions = getSatisfiedConditionsSQL(); - execute(deleteUnsatisfiedValues(selectSatisfiedConditions)); - execute(deleteUnsatisfiedTableValues(selectSatisfiedConditions)); - } - - private Executable deleteUnsatisfiedValues(String selectSatisfiedConditions) { - // Query contents: - // id | provider_id | q1.provider_id | condition | q1.provided_condition - // -- | ----------- | -------------- | --------- | --------------------- - // 1 | ... | ... | A | A Satisfied condition - // 2 | ... | ... | not_B | not_B Satisfied condition - // 3 | ... | ... | NULL | NULL Satisfied condition - // 4 | ... | ... | B | NULL Unsatisfied condition, filtered to these in WHERE clause. - // 5 | ... | ... | not_C | NULL Unsatisfied condition - String selectUnsatisfiedValueIDs = SELECT + serverValueTable + '.' + ExtensionServerValueTable.ID + - FROM + providerTable + - INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID + - LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled - " on (" + - ExtensionProviderTable.CONDITION + "=q1." + ExtensionProviderTable.PROVIDED_CONDITION + - AND + providerTable + '.' + ExtensionProviderTable.PLUGIN_ID + "=q1." + ExtensionProviderTable.PLUGIN_ID + - ')' + - WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query - AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition - - // Nested query here is required because MySQL limits update statements with nested queries: - // The nested query creates a temporary table that bypasses the same table query-update limit. - // Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception. - String sql = DELETE_FROM + serverValueTable + - WHERE + ExtensionServerValueTable.ID + " IN (" + SELECT + ExtensionServerValueTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)"; - - return new ExecStatement(sql) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setBoolean(1, true); // Select provided conditions with 'true' value - statement.setBoolean(2, false); // Select negated conditions with 'false' value - } - }; - } - - private String getSatisfiedConditionsSQL() { - String reversedCondition = dbType == DBType.SQLITE ? "'not_' || " + ExtensionProviderTable.PROVIDED_CONDITION : "CONCAT('not_'," + ExtensionProviderTable.PROVIDED_CONDITION + ')'; - - String selectSatisfiedPositiveConditions = SELECT + - ExtensionProviderTable.PROVIDED_CONDITION + ',' + - ExtensionProviderTable.PLUGIN_ID + - FROM + providerTable + - INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID + - WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" + - AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL; - String selectSatisfiedNegativeConditions = SELECT + - reversedCondition + " as " + ExtensionProviderTable.PROVIDED_CONDITION + ',' + - ExtensionProviderTable.PLUGIN_ID + - FROM + providerTable + - INNER_JOIN + serverValueTable + " on " + providerTable + '.' + ExtensionProviderTable.ID + "=" + ExtensionServerValueTable.PROVIDER_ID + - WHERE + ExtensionServerValueTable.BOOLEAN_VALUE + "=?" + - AND + ExtensionProviderTable.PROVIDED_CONDITION + IS_NOT_NULL; - - // Query contents: Set of provided_conditions - return '(' + selectSatisfiedPositiveConditions + " UNION " + selectSatisfiedNegativeConditions + ") q1"; - } - - private Executable deleteUnsatisfiedTableValues(String selectSatisfiedConditions) { - String selectUnsatisfiedValueIDs = SELECT + ExtensionTableProviderTable.ID + - FROM + tableTable + - LEFT_JOIN + selectSatisfiedConditions + // Left join to preserve values that don't have their condition fulfilled - " on (" + - tableTable + '.' + ExtensionTableProviderTable.CONDITION + - "=q1." + ExtensionProviderTable.PROVIDED_CONDITION + - AND + tableTable + '.' + ExtensionTableProviderTable.PLUGIN_ID + - "=q1." + ExtensionProviderTable.PLUGIN_ID + - ')' + - WHERE + "q1." + ExtensionProviderTable.PROVIDED_CONDITION + IS_NULL + // Conditions that were not in the satisfied condition query - AND + ExtensionProviderTable.CONDITION + IS_NOT_NULL; // Ignore values that don't need condition - - // Nested query here is required because MySQL limits update statements with nested queries: - // The nested query creates a temporary table that bypasses the same table query-update limit. - // Note: MySQL versions 5.6.7+ might optimize this nested query away leading to an exception. - String deleteValuesSQL = DELETE_FROM + serverTableValueTable + - WHERE + ExtensionServerTableValueTable.TABLE_ID + " IN (" + SELECT + ExtensionTableProviderTable.ID + FROM + '(' + selectUnsatisfiedValueIDs + ") as ids)"; - - return new ExecStatement(deleteValuesSQL) { - @Override - public void prepare(PreparedStatement statement) throws SQLException { - statement.setBoolean(1, true); // Select provided conditions with 'true' value - statement.setBoolean(2, false); // Select negated conditions with 'false' value - } - }; - } -} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/gathering/geolocation/GeoLite2Geolocator.java b/Plan/common/src/main/java/com/djrapitops/plan/gathering/geolocation/GeoLite2Geolocator.java index 90aa9f6dc..d795b43f1 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/gathering/geolocation/GeoLite2Geolocator.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/gathering/geolocation/GeoLite2Geolocator.java @@ -26,7 +26,7 @@ import com.maxmind.geoip2.model.CountryResponse; import com.maxmind.geoip2.record.Country; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; import javax.inject.Inject; import javax.inject.Singleton; @@ -119,7 +119,7 @@ public class GeoLite2Geolocator implements Geolocator { private void findAndCopyFromTar(TarArchiveInputStream tarIn, FileOutputStream fos) throws IOException { // Breadth first search Queue entries = new ArrayDeque<>(); - entries.add(tarIn.getNextTarEntry()); + entries.add(tarIn.getNextEntry()); while (!entries.isEmpty()) { TarArchiveEntry entry = entries.poll(); if (entry.isDirectory()) { @@ -132,7 +132,7 @@ public class GeoLite2Geolocator implements Geolocator { break; // Found it } - TarArchiveEntry next = tarIn.getNextTarEntry(); + TarArchiveEntry next = tarIn.getNextEntry(); if (next != null) entries.add(next); } } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/JarResource.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/JarResource.java index 8f02f3d82..7ab4f98f5 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/JarResource.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/JarResource.java @@ -16,7 +16,7 @@ */ package com.djrapitops.plan.storage.file; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/upkeep/DBCleanTask.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/upkeep/DBCleanTask.java index ed9568e98..fcc84619b 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/upkeep/DBCleanTask.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/upkeep/DBCleanTask.java @@ -110,8 +110,6 @@ public class DBCleanTask extends TaskSystem.Task { config.get(TimeSettings.DELETE_PING_DATA_AFTER) )); database.executeTransaction(new RemoveDuplicateUserInfoTransaction()); -// database.executeTransaction(new RemoveUnsatisfiedConditionalPlayerResultsTransaction()); -// database.executeTransaction(new RemoveUnsatisfiedConditionalServerResultsTransaction()); int removed = cleanOldPlayers(database); if (removed > 0) { logger.info(locale.getString(PluginLang.DB_NOTIFY_CLEAN, removed)); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/commands/subcommands/RegistrationCommandsTest.java b/Plan/common/src/test/java/com/djrapitops/plan/commands/subcommands/RegistrationCommandsTest.java index 6975d638f..865dbfacc 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/commands/subcommands/RegistrationCommandsTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/commands/subcommands/RegistrationCommandsTest.java @@ -33,7 +33,7 @@ import com.djrapitops.plan.storage.database.transactions.commands.StoreWebUserTr import com.djrapitops.plan.utilities.PassEncryptUtil; import com.google.gson.Gson; import extension.FullSystemExtension; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java index f210f5fe3..28156c95f 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/AccessControlTest.java @@ -31,7 +31,7 @@ import com.djrapitops.plan.storage.database.transactions.commands.StoreWebUserTr import com.djrapitops.plan.storage.database.transactions.events.PlayerRegisterTransaction; import com.djrapitops.plan.storage.database.transactions.webuser.StoreWebGroupTransaction; import com.djrapitops.plan.utilities.PassEncryptUtil; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -201,7 +201,7 @@ class AccessControlTest { address, TestConstants.VERSION))); - Caller caller = system.getExtensionService().register(new ExtensionsDatabaseTest.PlayerExtension()) + Caller caller = system.getApiServices().getExtensionService().register(new ExtensionsDatabaseTest.PlayerExtension()) .orElseThrow(AssertionError::new); caller.updatePlayerData(TestConstants.PLAYER_ONE_UUID, TestConstants.PLAYER_ONE_NAME); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpAccessControlTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpAccessControlTest.java index 48404f9e2..c0d989a76 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpAccessControlTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpAccessControlTest.java @@ -70,7 +70,7 @@ class HttpAccessControlTest { ADDRESS, TestConstants.VERSION))); - Caller caller = system.getExtensionService().register(new ExtensionsDatabaseTest.PlayerExtension()) + Caller caller = system.getApiServices().getExtensionService().register(new ExtensionsDatabaseTest.PlayerExtension()) .orElseThrow(AssertionError::new); caller.updatePlayerData(TestConstants.PLAYER_ONE_UUID, TestConstants.PLAYER_ONE_NAME); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpsServerTest.java b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpsServerTest.java index 0b7676ece..a44ce8e49 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpsServerTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/delivery/webserver/HttpsServerTest.java @@ -17,7 +17,7 @@ package com.djrapitops.plan.delivery.webserver; import com.djrapitops.plan.delivery.webserver.http.WebServer; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import utilities.HTTPConnector; @@ -73,13 +73,13 @@ interface HttpsServerTest { default -> throw new IllegalStateException(address + "| Wrong response code " + responseCode); } } finally { - connection.disconnect(); + if (connection != null) connection.disconnect(); } } default String login(String address) throws IOException, KeyManagementException, NoSuchAlgorithmException { HttpURLConnection connection = null; - String cookie = ""; + String cookie; try { connection = connector.getConnection("POST", address + "/auth/login"); connection.setDoOutput(true); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/DatabaseTestPreparer.java b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/DatabaseTestPreparer.java index d180ac0d8..9765a05be 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/DatabaseTestPreparer.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/DatabaseTestPreparer.java @@ -64,9 +64,9 @@ public interface DatabaseTestPreparer { return system().getDeliveryUtilities(); } - default ExtensionSvc extensionService() {return system().getExtensionService();} + default ExtensionSvc extensionService() {return system().getApiServices().getExtensionService();} - default ComponentSvc componentService() {return system().getComponentService();} + default ComponentSvc componentService() {return system().getApiServices().getComponentService();} QueryFilters queryFilters(); diff --git a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/queries/ExtensionsDatabaseTest.java b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/queries/ExtensionsDatabaseTest.java index 77dc4e9c2..4df3d3d8a 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/queries/ExtensionsDatabaseTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/queries/ExtensionsDatabaseTest.java @@ -223,8 +223,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer { ConditionalExtension.condition = false; extensionService.updatePlayerValues(playerUUID, TestConstants.PLAYER_ONE_NAME, CallEvents.MANUAL); -// db().executeTransaction(new RemoveUnsatisfiedConditionalPlayerResultsTransaction()); - // Check that the wanted data exists checkThatPlayerDataExists(ConditionalExtension.condition); @@ -232,8 +230,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer { ConditionalExtension.condition = false; extensionService.updatePlayerValues(playerUUID, TestConstants.PLAYER_ONE_NAME, CallEvents.MANUAL); -// db().executeTransaction(new RemoveUnsatisfiedConditionalPlayerResultsTransaction()); - // Check that the wanted data exists checkThatPlayerDataExists(ConditionalExtension.condition); } @@ -276,8 +272,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer { ConditionalExtension.condition = false; extensionService.updateServerValues(CallEvents.MANUAL); -// db().executeTransaction(new RemoveUnsatisfiedConditionalServerResultsTransaction()); - // Check that the wanted data exists checkThatServerDataExists(ConditionalExtension.condition); @@ -285,8 +279,6 @@ public interface ExtensionsDatabaseTest extends DatabaseTestPreparer { ConditionalExtension.condition = false; extensionService.updatePlayerValues(playerUUID, TestConstants.PLAYER_ONE_NAME, CallEvents.MANUAL); -// db().executeTransaction(new RemoveUnsatisfiedConditionalServerResultsTransaction()); - // Check that the wanted data exists checkThatServerDataExists(ConditionalExtension.condition); }