From a637f01d8b0393b8c8b09850d02f7ee125a676b8 Mon Sep 17 00:00:00 2001 From: Alexander Staeding Date: Tue, 10 Sep 2019 01:42:11 +0200 Subject: [PATCH] Finishing touches for 0.5.1. Optimization task improvments --- README.md | 2 +- sponge/gradle.properties | 2 +- .../msdatasync/MSDataSyncPluginInfo.java | 2 +- .../msdatasync/PluginPermissions.java | 18 ++-- .../commands/SyncCommandManager.java | 46 +++++---- .../msdatasync/commands/SyncHelpCommand.java | 16 ++++ .../msdatasync/commands/SyncInfoCommand.java | 27 ++++++ .../optimize/OptimizeInfoCommand.java | 14 ++- .../optimize/OptimizeStartCommand.java | 12 +-- ...tCommand.java => SnapshotViewCommand.java} | 4 +- .../msdatasync/misc/CommandUtils.java | 27 ++++++ .../misc/SnapshotOptimizationService.java | 93 ++++++++++++------- .../ApiSpongeSerializationTaskService.java | 7 +- .../msdatasync/tests/ExampleTests.java | 24 +---- 14 files changed, 195 insertions(+), 99 deletions(-) create mode 100644 sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncInfoCommand.java rename sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/{SnapshotEditCommand.java => SnapshotViewCommand.java} (98%) diff --git a/README.md b/README.md index a968ac3d..5668b57b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Do you run a multi server network where every server needs to share inventories ### Look no further -_MSDataSync_ is an advanced player data backup plugin that let's you store, manage, edit and rollback player data! +_MSDataSync_ is an advanced player data backup plugin that lets you store, manage, edit and rollback player data! (Compatible with forge and vanilla) diff --git a/sponge/gradle.properties b/sponge/gradle.properties index 382a39e2..8572bd1a 100644 --- a/sponge/gradle.properties +++ b/sponge/gradle.properties @@ -1,3 +1,3 @@ modGroup=rocks.milspecsg -modVersion=0.5.1-SNAPSHOT +modVersion=0.5.1 modBaseName=MSDataSync diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/MSDataSyncPluginInfo.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/MSDataSyncPluginInfo.java index d9449def..a2192926 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/MSDataSyncPluginInfo.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/MSDataSyncPluginInfo.java @@ -10,7 +10,7 @@ public final class MSDataSyncPluginInfo implements SpongePluginInfo { public static final String id = "msdatasync"; public static final String name = "MSDataSync"; - public static final String version = "0.5.1-SNAPSHOT"; + public static final String version = "0.5.1"; public static final String description = "A plugin to synchronize player inventories with a database"; public static final String url = "https://milspecsg.rocks"; public static final String authors = "Cableguy20"; diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/PluginPermissions.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/PluginPermissions.java index 6dc8189d..5ba78912 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/PluginPermissions.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/PluginPermissions.java @@ -1,12 +1,14 @@ package rocks.milspecsg.msdatasync; public abstract class PluginPermissions { - - public static final String MANUAL_OPTIMIZATION = "msdatasync.command.optimize.base"; - public static final String MANUAL_OPTIMIZATION_ALL = "msdatasync.command.optimize.all"; - public static final String EDIT_SNAPSHOTS = "msdatasync.command.snapshot.edit"; - public static final String VIEW_SNAPSHOTS = "msdatasync.command.snapshot.base"; - public static final String LOCK_COMMAND = "msdatasync.command.lock"; - public static final String RELOAD_COMMAND = "msdatasync.command.reload"; - public static final String MANUAL_SYNC_COMMAND = "msdatasync.command.sync"; + public static final String LOCK_COMMAND = "msdatasync.lock"; + public static final String RELOAD_COMMAND = "msdatasync.reload"; + public static final String SNAPSHOT_BASE = "msdatasync.snapshot.base"; + public static final String SNAPSHOT_CREATE = "msdatasync.snapshot.create"; + public static final String SNAPSHOT_DELETE = "msdatasync.snapshot.delete"; + public static final String SNAPSHOT_RESTORE = "msdatasync.snapshot.restore"; + public static final String SNAPSHOT_VIEW_EDIT = "msdatasync.snapshot.view.edit"; + public static final String SNAPSHOT_VIEW_BASE = "msdatasync.snapshot.view.base"; + public static final String MANUAL_OPTIMIZATION_ALL = "msdatasync.optimize.all"; + public static final String MANUAL_OPTIMIZATION_BASE = "msdatasync.optimize.base"; } diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncCommandManager.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncCommandManager.java index bc1cb60f..fd7cd4db 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncCommandManager.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncCommandManager.java @@ -19,6 +19,9 @@ public class SyncCommandManager implements CommandManager { @Inject SyncHelpCommand syncHelpCommand; + @Inject + SyncInfoCommand syncInfoCommand; + @Inject UploadStartCommand uploadStartCommand; @@ -37,9 +40,6 @@ public class SyncCommandManager implements CommandManager { @Inject SnapshotHelpCommand snapshotHelpCommand; - @Inject - SnapshotEditCommand snapshotEditCommand; - @Inject SnapshotInfoCommand snapshotInfoCommand; @@ -49,6 +49,9 @@ public class SyncCommandManager implements CommandManager { @Inject SnapshotRestoreCommand snapshotRestoreCommand; + @Inject + SnapshotViewCommand snapshotViewCommand; + @Inject OptimizeHelpCommand optimizeHelpCommand; @@ -73,7 +76,7 @@ public void register(Object plugin) { snapshotSubCommands.put(Arrays.asList("create", "c", "upload", "up"), CommandSpec.builder() .description(Text.of("Creates a manual snapshot for user and uploads it to DB.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_CREATE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))) ) @@ -83,7 +86,7 @@ public void register(Object plugin) { snapshotSubCommands.put(Collections.singletonList("delete"), CommandSpec.builder() .description(Text.of("Deletes snapshot for user.")) - .permission(PluginPermissions.EDIT_SNAPSHOTS) + .permission(PluginPermissions.SNAPSHOT_DELETE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))), GenericArguments.string(Text.of("date")) @@ -94,25 +97,25 @@ public void register(Object plugin) { snapshotSubCommands.put(Arrays.asList("edit", "e", "view"), CommandSpec.builder() .description(Text.of("Edit/view snapshot for user from DB. If no date is provided, latest snapshot is selected.")) - .permission(PluginPermissions.VIEW_SNAPSHOTS) + .permission(PluginPermissions.SNAPSHOT_VIEW_BASE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))), GenericArguments.optional(GenericArguments.string(Text.of("date"))) ) - .executor(snapshotEditCommand) + .executor(snapshotViewCommand) .build() ); snapshotSubCommands.put(Collections.singletonList("help"), CommandSpec.builder() .description(Text.of("Shows this help page.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_BASE) .executor(snapshotHelpCommand) .build() ); snapshotSubCommands.put(Arrays.asList("info", "i"), CommandSpec.builder() .description(Text.of("More info for snapshot for user from DB. If no date is provided, latest snapshot is selected.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_BASE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))), GenericArguments.optional(GenericArguments.string(Text.of("date"))) @@ -123,7 +126,7 @@ public void register(Object plugin) { snapshotSubCommands.put(Arrays.asList("list", "l"), CommandSpec.builder() .description(Text.of("Lists available snapshots for user.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_BASE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))) ) @@ -133,7 +136,7 @@ public void register(Object plugin) { snapshotSubCommands.put(Arrays.asList("restore", "r", "download", "down"), CommandSpec.builder() .description(Text.of("Manually restores snapshot from DB. If no date is selected, latest snapshot is restored.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_RESTORE) .arguments( GenericArguments.onlyOne(GenericArguments.user(Text.of("user"))), GenericArguments.optional(GenericArguments.string(Text.of("date"))) @@ -144,7 +147,7 @@ public void register(Object plugin) { subCommands.put(Arrays.asList("snapshot", "snap", "s"), CommandSpec.builder() .description(Text.of("Snapshot base command.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_BASE) .executor(snapshotHelpCommand) .children(snapshotSubCommands) .build()); @@ -156,7 +159,7 @@ public void register(Object plugin) { optimizeSubCommands.put(Arrays.asList("start", "s"), CommandSpec.builder() .description(Text.of("Starts manual optimization, deletes old snapshots.")) - .permission(PluginPermissions.MANUAL_OPTIMIZATION) + .permission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) .arguments( GenericArguments.choices(Text.of("mode"), optimizeStartChoices), GenericArguments.optional(GenericArguments.user(Text.of("user"))) @@ -166,25 +169,25 @@ public void register(Object plugin) { optimizeSubCommands.put(Arrays.asList("info", "i"), CommandSpec.builder() .description(Text.of("Gets info on current manual optimization.")) - .permission(PluginPermissions.MANUAL_OPTIMIZATION) + .permission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) .executor(optimizeInfoCommand) .build()); optimizeSubCommands.put(Collections.singletonList("stop"), CommandSpec.builder() .description(Text.of("Stops current manual optimization.")) - .permission(PluginPermissions.MANUAL_OPTIMIZATION) + .permission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) .executor(optimizeStopCommand) .build()); optimizeSubCommands.put(Collections.singletonList("help"), CommandSpec.builder() .description(Text.of("Shows this help page.")) - .permission(PluginPermissions.MANUAL_OPTIMIZATION) + .permission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) .executor(optimizeHelpCommand) .build()); subCommands.put(Arrays.asList("optimize", "opt", "o"), CommandSpec.builder() .description(Text.of("Optimize base command. (To delete old snapshots)")) - .permission(PluginPermissions.MANUAL_OPTIMIZATION) + .permission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) .executor(optimizeHelpCommand) .children(optimizeSubCommands) .build()); @@ -211,20 +214,23 @@ public void register(Object plugin) { subCommands.put(Arrays.asList("upload", "up"), CommandSpec.builder() .description(Text.of("Uploads all players on server.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) + .permission(PluginPermissions.SNAPSHOT_CREATE) .executor(uploadStartCommand) .build()); subCommands.put(Collections.singletonList("help"), CommandSpec.builder() .description(Text.of("Shows this help page.")) - .permission(PluginPermissions.MANUAL_SYNC_COMMAND) .executor(syncHelpCommand) .build()); + subCommands.put(Collections.singletonList("info"), CommandSpec.builder() + .description(Text.of("Shows plugin info.")) + .executor(syncInfoCommand) + .build()); //Build all commands CommandSpec mainCommand = CommandSpec.builder() - .description(Text.of("Displays all available sync subcommands.")) + .description(Text.of("Displays all available sync sub commands.")) .executor(syncHelpCommand) .children(subCommands) .build(); diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncHelpCommand.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncHelpCommand.java index 8ba63229..39222282 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncHelpCommand.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncHelpCommand.java @@ -9,12 +9,18 @@ import org.spongepowered.api.command.args.CommandContext; import org.spongepowered.api.command.spec.CommandExecutor; import org.spongepowered.api.command.spec.CommandSpec; +import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.service.pagination.PaginationList; import org.spongepowered.api.service.pagination.PaginationService; import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.action.TextActions; import org.spongepowered.api.text.format.TextColors; +import rocks.milspecsg.msdatasync.MSDataSyncPluginInfo; +import rocks.milspecsg.msdatasync.PluginPermissions; import rocks.milspecsg.msdatasync.misc.CommandUtils; +import java.net.MalformedURLException; +import java.net.URL; import java.util.List; import java.util.Map; import java.util.Optional; @@ -26,6 +32,16 @@ public class SyncHelpCommand implements CommandExecutor { @Override public CommandResult execute(CommandSource source, CommandContext context) { + + if (source instanceof Player && !source.hasPermission(PluginPermissions.SNAPSHOT_BASE) + && !source.hasPermission(PluginPermissions.MANUAL_OPTIMIZATION_BASE) + && !source.hasPermission(PluginPermissions.LOCK_COMMAND) + && !source.hasPermission(PluginPermissions.RELOAD_COMMAND)) { + commandUtils.createInfoPage(source); + source.sendMessage(Text.of(TextColors.RED, "You do not have permission for any sub commands")); + return CommandResult.success(); + } + commandUtils.createHelpPage(source, SyncCommandManager.subCommands, ""); return CommandResult.success(); } diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncInfoCommand.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncInfoCommand.java new file mode 100644 index 00000000..182cfc84 --- /dev/null +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/SyncInfoCommand.java @@ -0,0 +1,27 @@ +package rocks.milspecsg.msdatasync.commands; + +import org.spongepowered.api.command.CommandException; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.command.args.CommandContext; +import org.spongepowered.api.command.spec.CommandExecutor; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.action.TextActions; +import org.spongepowered.api.text.format.TextColors; +import rocks.milspecsg.msdatasync.MSDataSyncPluginInfo; +import rocks.milspecsg.msdatasync.misc.CommandUtils; + +import javax.inject.Inject; +import java.net.MalformedURLException; +import java.net.URL; + +public class SyncInfoCommand implements CommandExecutor { + + @Inject + CommandUtils commandUtils; + @Override + public CommandResult execute(CommandSource source, CommandContext context) throws CommandException { + commandUtils.createInfoPage(source); + return CommandResult.success(); + } +} diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeInfoCommand.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeInfoCommand.java index 44eb842a..62aa0966 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeInfoCommand.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeInfoCommand.java @@ -10,15 +10,20 @@ import rocks.milspecsg.msdatasync.misc.SnapshotOptimizationService; import javax.inject.Inject; +import java.text.DecimalFormat; +import java.text.NumberFormat; public class OptimizeInfoCommand implements CommandExecutor { @Inject SnapshotOptimizationService snapshotOptimizationService; + private static NumberFormat formatter = new DecimalFormat("#0.00"); + @Override public CommandResult execute(CommandSource source, CommandContext context) { + int deleted = snapshotOptimizationService.getSnapshotsDeleted(); int completed = snapshotOptimizationService.getMembersCompleted(); int total = snapshotOptimizationService.getTotalMembers(); @@ -27,9 +32,12 @@ public CommandResult execute(CommandSource source, CommandContext context) { source.sendMessage( Text.of( MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, - "Optimization task: Completed ", completed, - " out of ", total, " ", TextColors.GOLD, - "( ", (completed * 100) / total, "% )")); + "Optimization task:\n", + TextColors.GRAY, "Snapshots deleted: ", TextColors.YELLOW, deleted, "\n", + TextColors.GRAY, "Members processed: ", TextColors.YELLOW, completed, "/", total, "\n", + TextColors.GRAY, "Progress: ", TextColors.YELLOW, formatter.format((double) completed * 100d / (double) total), "%" + ) + ); } else { source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "There is currently no optimization task running")); } diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeStartCommand.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeStartCommand.java index 07f6af59..90f04a59 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeStartCommand.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/optimize/OptimizeStartCommand.java @@ -36,21 +36,21 @@ public CommandResult execute(CommandSource source, CommandContext context) throw if (optionalMode.get().equals("all")) { if (!source.hasPermission(PluginPermissions.MANUAL_OPTIMIZATION_ALL)) { - source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.RED, "You do not have permission to start optimization task: all")); - } - if (snapshotOptimizationService.startOptimizeAll(source)) { + throw new CommandException(Text.of(MSDataSyncPluginInfo.pluginPrefix, "You do not have permission to start optimization task: all")); + } else if (snapshotOptimizationService.startOptimizeAll(source)) { source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Successfully started optimization task: all")); } else { throw new CommandException(Text.of(MSDataSyncPluginInfo.pluginPrefix, "Optimizer already running! Use /sync optimize info")); } snapshotOptimizationService.startOptimizeAll(source); } else { - if (!users.isEmpty()) { + if (users.isEmpty()) { + throw new CommandException(Text.of(MSDataSyncPluginInfo.pluginPrefix, "No users were selected by your query")); + } else if (snapshotOptimizationService.optimize(users, source, "Manual")) { source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Successfully started optimization task: user")); } else { - throw new CommandException(Text.of(MSDataSyncPluginInfo.pluginPrefix, "No users were affected")); + throw new CommandException(Text.of(MSDataSyncPluginInfo.pluginPrefix, "Optimizer already running! Use /sync optimize info")); } - snapshotOptimizationService.optimize(users, source, "Manual"); } return CommandResult.success(); diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotEditCommand.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotViewCommand.java similarity index 98% rename from sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotEditCommand.java rename to sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotViewCommand.java index 1db6ef97..88edd230 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotEditCommand.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/commands/snapshot/SnapshotViewCommand.java @@ -32,7 +32,7 @@ import java.util.Optional; import java.util.function.Consumer; -public class SnapshotEditCommand implements CommandExecutor { +public class SnapshotViewCommand implements CommandExecutor { @Inject SnapshotRepository snapshotRepository; @@ -80,7 +80,7 @@ public CommandResult execute(CommandSource source, CommandContext context) throw Snapshot snapshot = optionalSnapshot.get(); source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Editing snapshot ", TextColors.GOLD, dateFormatService.format(optionalSnapshot.get().getId().getDate()))); final boolean[] closeData = new boolean[]{false}; - final boolean permissionToEdit = player.hasPermission(PluginPermissions.EDIT_SNAPSHOTS); + final boolean permissionToEdit = player.hasPermission(PluginPermissions.SNAPSHOT_VIEW_EDIT); Inventory inventory = Inventory.builder().of(inventoryArchetype).listener(InteractInventoryEvent.Close.class, e -> { if (closeData[0] || !permissionToEdit) { source.sendMessage( diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/CommandUtils.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/CommandUtils.java index c0985615..010a194a 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/CommandUtils.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/CommandUtils.java @@ -20,6 +20,8 @@ import rocks.milspecsg.msdatasync.model.core.Member; import rocks.milspecsg.msdatasync.model.core.Snapshot; +import java.net.MalformedURLException; +import java.net.URL; import java.text.ParseException; import java.util.Date; import java.util.List; @@ -109,4 +111,29 @@ public void createHelpPage(final CommandSource source, final Map, C paginationBuilder.build().sendTo(source); } + public void createInfoPage(final CommandSource source) { + try { + source.sendMessage( + Text.of( + MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Running version ", + TextColors.GOLD, MSDataSyncPluginInfo.version, "\n", + TextColors.YELLOW, "This plugin was written by Cableguy20 from MilSpecSG\n", + Text.builder() + .append(Text.of(TextColors.AQUA, "[ Plugin Page ]")) + .onHover(TextActions.showText(Text.of(TextColors.AQUA, "https://github.com/MilSpecSG/MSDataSync"))) + .onClick(TextActions.openUrl(new URL("https://github.com/MilSpecSG/MSDataSync"))) + .build(), + " ", + Text.builder() + .append(Text.of(TextColors.AQUA, "[ MilSpecSG ]")) + .onHover(TextActions.showText(Text.of(TextColors.AQUA, "https://www.milspecsg.rocks/"))) + .onClick(TextActions.openUrl(new URL("https://www.milspecsg.rocks/"))) + .build() + ) + ); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + } + } diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/SnapshotOptimizationService.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/SnapshotOptimizationService.java index a803aafa..948840cf 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/SnapshotOptimizationService.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/misc/SnapshotOptimizationService.java @@ -22,6 +22,7 @@ import javax.inject.Singleton; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.FutureTask; import java.util.stream.Collectors; @Singleton @@ -43,7 +44,8 @@ public class SnapshotOptimizationService { private ConfigurationService configurationService; - private volatile CompletableFuture currentOptimizeAllTask = null; + private volatile boolean optimizationTaskRunning = false; + private volatile boolean requestCancelOptimizationTask = false; private volatile int total = 0; private volatile int membersCompleted = 0; @@ -53,6 +55,10 @@ private synchronized void incrementCompleted() { membersCompleted++; } + private synchronized void incrementDeleted() { + snapshotsDeleted++; + } + private synchronized void setTotal(final int total) { this.total = total; } @@ -71,19 +77,21 @@ public int getMembersCompleted() { return membersCompleted; } + public int getSnapshotsDeleted() { + return snapshotsDeleted; + } + public boolean isOptimizationTaskRunning() { - return currentOptimizeAllTask != null; + return optimizationTaskRunning; } public boolean stopOptimizationTask() { if (!isOptimizationTaskRunning()) { return false; } - if (!currentOptimizeAllTask.isDone()){ - currentOptimizeAllTask.complete(null); - } resetCounters(); - currentOptimizeAllTask = null; + optimizationTaskRunning = false; + requestCancelOptimizationTask = false; return true; } @@ -99,29 +107,6 @@ private void configLoaded(Object plugin) { optimizationStrategy = optional.orElse(null); } - public CompletableFuture optimize(final Collection users, final CommandSource source, final String name) { - return CompletableFuture.supplyAsync(() -> { - boolean deletedAnything = false; - for (User user : users) { - if (optimize(user, source, name).join()) { - deletedAnything = true; - } - } - return deletedAnything; - }); - } - - public CompletableFuture optimize(final User user, final CommandSource source, final String name) { - return memberRepository.getSnapshotIds(user.getUniqueId()).thenApplyAsync(snapshotIds -> { - if (!optimizeFull(snapshotIds, user.getUniqueId(), source, name).join()) { - source.sendMessage( - Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Successfully ran optimization for ", user.getName(), " but no snapshots were deleted!") - ); - return true; - } else return false; - }); - } - /** * @return true if something was deleted */ @@ -167,9 +152,10 @@ public CompletableFuture optimizeFull(final List snapshotIds, memberRepository.deleteSnapshot(userUUID, objectId).thenAcceptAsync(success -> { if (success) { deletedAnything[0] = true; - source.sendMessage( - Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Successfully removed snapshot ", dateFormatService.format(objectId.getDate()), " from " + optionalUser.get().getName()) - ); + incrementDeleted(); +// source.sendMessage( +// Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Successfully removed snapshot ", dateFormatService.format(objectId.getDate()), " from " + optionalUser.get().getName()) +// ); } else { source.sendMessage( Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.RED, "There was an error removing snapshot ", dateFormatService.format(objectId.getDate()), " from " + optionalUser.get().getName()) @@ -181,11 +167,38 @@ public CompletableFuture optimizeFull(final List snapshotIds, }); } + public boolean optimize(final Collection users, final CommandSource source, final String name) { + if (isOptimizationTaskRunning()) { + return false; + } + CompletableFuture.supplyAsync(() -> { + for (User user : users) { + optimize(user, source, name).join(); + incrementCompleted(); + + if (requestCancelOptimizationTask) { + break; + } + } + return null; + }).thenAcceptAsync(v -> { + printOptimizationFinished(source, snapshotsDeleted, membersCompleted); + resetCounters(); + stopOptimizationTask(); + }); + return true; + } + + public CompletableFuture optimize(final User user, final CommandSource source, final String name) { + return memberRepository.getSnapshotIds(user.getUniqueId()).thenApplyAsync(snapshotIds -> optimizeFull(snapshotIds, user.getUniqueId(), source, name).join()); + } + public boolean startOptimizeAll(final CommandSource source) { - if (currentOptimizeAllTask != null) { + if (optimizationTaskRunning) { return false; } - this.currentOptimizeAllTask = CompletableFuture.supplyAsync(() -> { + optimizationTaskRunning = true; + CompletableFuture.supplyAsync(() -> { List memberIds = memberRepository.getAllIds().join(); setTotal(memberIds.size()); for (ObjectId memberId : memberIds) { @@ -194,16 +207,26 @@ public boolean startOptimizeAll(final CommandSource source) { Member member = optionalMember.get(); optimizeFull(member.snapshotIds, member.userUUID, source, "Manual").join(); incrementCompleted(); + + if (requestCancelOptimizationTask) { + break; + } } return null; }).thenAcceptAsync(v -> { - source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Optimization complete!")); + printOptimizationFinished(source, snapshotsDeleted, membersCompleted); resetCounters(); stopOptimizationTask(); }); return true; } + private static void printOptimizationFinished(final CommandSource source, final int snapshotsDeleted, final int membersCompleted) { + String snapshotString = snapshotsDeleted == 1 ? " snapshot from " : " snapshots from "; + String memberString = membersCompleted == 1 ? " user!" : " users!"; + source.sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.YELLOW, "Optimization complete! Removed ", snapshotsDeleted, snapshotString, membersCompleted, memberString)); + } + private static boolean within(ObjectId id, int minutes) { return System.currentTimeMillis() <= ((id.getTimestamp() & 0xFFFFFFFFL) * 1000L) + (minutes * 60000L); } diff --git a/sponge/src/main/java/rocks/milspecsg/msdatasync/service/implementation/tasks/ApiSpongeSerializationTaskService.java b/sponge/src/main/java/rocks/milspecsg/msdatasync/service/implementation/tasks/ApiSpongeSerializationTaskService.java index e349ee4d..26e00c4a 100644 --- a/sponge/src/main/java/rocks/milspecsg/msdatasync/service/implementation/tasks/ApiSpongeSerializationTaskService.java +++ b/sponge/src/main/java/rocks/milspecsg/msdatasync/service/implementation/tasks/ApiSpongeSerializationTaskService.java @@ -71,9 +71,10 @@ public void stopSerializationTask() { @Override public Runnable getSerializationTask() { return () -> { - Collection players = Sponge.getServer().getOnlinePlayers(); - for (Player player : players) { - snapshotOptimizationService.optimize(player, Sponge.getServer().getConsole(), "Auto"); + if (snapshotOptimizationService.isOptimizationTaskRunning()) { + Sponge.getServer().getConsole().sendMessage(Text.of(MSDataSyncPluginInfo.pluginPrefix, TextColors.RED, "Optimization task already running! Task will skip")); + } else { + snapshotOptimizationService.optimize(Sponge.getServer().getOnlinePlayers(), Sponge.getServer().getConsole(), "Auto"); } }; } diff --git a/sponge/src/test/java/rocks/milspecsg/msdatasync/tests/ExampleTests.java b/sponge/src/test/java/rocks/milspecsg/msdatasync/tests/ExampleTests.java index 0fc1de22..3db2ec50 100644 --- a/sponge/src/test/java/rocks/milspecsg/msdatasync/tests/ExampleTests.java +++ b/sponge/src/test/java/rocks/milspecsg/msdatasync/tests/ExampleTests.java @@ -6,25 +6,11 @@ public class ExampleTests { - @Nested - @TestInstance(TestInstance.Lifecycle.PER_CLASS) - @DisplayName("Basic Serialization") - class Basic_Serialization { + @DisplayName("Test serializing") + @Test + void test_serializing() { + System.out.println("Starting serializer test..."); - @DisplayName("Test serializing") - @Test - @Order(1) - void test_serializing() { - System.out.println("Starting serializer test..."); - - - - - - - - - System.out.println("Finished!"); - } + System.out.println("Finished!"); } }