diff --git a/src/main/java/net/szum123321/textile_backup/Globals.java b/src/main/java/net/szum123321/textile_backup/Globals.java new file mode 100644 index 0000000..7172c2d --- /dev/null +++ b/src/main/java/net/szum123321/textile_backup/Globals.java @@ -0,0 +1,108 @@ +/* + * A simple backup mod for Fabric + * Copyright (C) 2022 Szum123321 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package net.szum123321.textile_backup; + +import net.minecraft.server.MinecraftServer; +import net.szum123321.textile_backup.core.Utilities; +import net.szum123321.textile_backup.core.create.MakeBackupRunnable; +import net.szum123321.textile_backup.core.restore.AwaitThread; +import org.apache.commons.io.FileUtils; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.format.DateTimeFormatter; +import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +public class Globals { + public static final Globals INSTANCE = new Globals(); + public final static DateTimeFormatter defaultDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss"); + + private final static TextileLogger log = new TextileLogger(TextileBackup.MOD_NAME); + + private ExecutorService executorService = Executors.newSingleThreadExecutor(); + public final AtomicBoolean globalShutdownBackupFlag = new AtomicBoolean(true); + + public boolean disableWatchdog = false; + private boolean disableTMPFiles = false; + + private AwaitThread restoreAwaitThread = null; + private Path lockedPath = null; + + private Globals() {} + + public ExecutorService getQueueExecutor() { return executorService; } + + public void resetQueueExecutor() { + if(!executorService.isShutdown()) return; + executorService = Executors.newSingleThreadExecutor(); + } + + public void shutdownQueueExecutor(long timeout) { + if(executorService.isShutdown()) return; + executorService.shutdown(); + + try { + if(!executorService.awaitTermination(timeout, TimeUnit.MICROSECONDS)) { + log.error("Timeout occurred while waiting for currently running backups to finish!"); + executorService.shutdownNow().stream() + .filter(r -> r instanceof MakeBackupRunnable) + .map(r -> (MakeBackupRunnable)r) + .forEach(r -> log.error("Dropping: {}", r.toString())); + if(!executorService.awaitTermination(1000, TimeUnit.MICROSECONDS)) + log.error("Couldn't shut down the executor!"); + } + } catch (InterruptedException e) { + log.error("An exception occurred!", e); + } + + } + + public Optional getAwaitThread() { return Optional.ofNullable(restoreAwaitThread); } + + public void setAwaitThread(AwaitThread th) { restoreAwaitThread = th; } + + + public Optional getLockedFile() { return Optional.ofNullable(lockedPath); } + public void setLockedFile(Path p) { lockedPath = p; } + + public boolean disableTMPFS() { return disableTMPFiles; } + public void updateTMPFSFlag(MinecraftServer server) { + disableTMPFiles = false; + Path tmp_dir = Path.of(System.getProperty("java.io.tmpdir")); + if( + FileUtils.sizeOfDirectory(Utilities.getWorldFolder(server).toFile()) >= + tmp_dir.toFile().getUsableSpace() + ) { + log.error("Not enough space left in TMP directory! ({})", tmp_dir); + disableTMPFiles = true; + } + + if(!Files.isWritable(tmp_dir)) { + log.error("TMP filesystem ({}) is read-only!", tmp_dir); + disableTMPFiles = true; + } + + if(disableTMPFiles) log.error("Might cause: https://github.com/Szum123321/textile_backup/wiki/ZIP-Problems"); + } +} diff --git a/src/main/java/net/szum123321/textile_backup/Statics.java b/src/main/java/net/szum123321/textile_backup/Statics.java deleted file mode 100644 index 9a98ebb..0000000 --- a/src/main/java/net/szum123321/textile_backup/Statics.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * A simple backup mod for Fabric - * Copyright (C) 2020 Szum123321 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package net.szum123321.textile_backup; - -import net.szum123321.textile_backup.core.restore.AwaitThread; - -import java.nio.file.Path; -import java.time.format.DateTimeFormatter; -import java.util.Optional; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; - -public class Statics { - public final static DateTimeFormatter defaultDateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH.mm.ss"); - - public static ExecutorService executorService = Executors.newSingleThreadExecutor(); - - public static final AtomicBoolean globalShutdownBackupFlag = new AtomicBoolean(true); - public static boolean disableWatchdog = false; - public static AwaitThread restoreAwaitThread = null; - public static Optional untouchableFile = Optional.empty(); - public static boolean disableTMPFiles = false; -} diff --git a/src/main/java/net/szum123321/textile_backup/TextileBackup.java b/src/main/java/net/szum123321/textile_backup/TextileBackup.java index f609182..d2c40e2 100644 --- a/src/main/java/net/szum123321/textile_backup/TextileBackup.java +++ b/src/main/java/net/szum123321/textile_backup/TextileBackup.java @@ -38,13 +38,10 @@ import net.szum123321.textile_backup.commands.restore.RestoreBackupCommand; import net.szum123321.textile_backup.config.ConfigHelper; import net.szum123321.textile_backup.config.ConfigPOJO; import net.szum123321.textile_backup.core.ActionInitiator; -import net.szum123321.textile_backup.core.Utilities; import net.szum123321.textile_backup.core.create.BackupContext; import net.szum123321.textile_backup.core.create.BackupHelper; import net.szum123321.textile_backup.core.create.BackupScheduler; -import java.util.concurrent.Executors; - public class TextileBackup implements ModInitializer { public static final String MOD_NAME = "Textile Backup"; public static final String MOD_ID = "textile_backup"; @@ -62,15 +59,14 @@ public class TextileBackup implements ModInitializer { //Restart Executor Service in single-player ServerLifecycleEvents.SERVER_STARTING.register(server -> { - if(Statics.executorService.isShutdown()) Statics.executorService = Executors.newSingleThreadExecutor(); - - Utilities.updateTMPFSFlag(server); + Globals.INSTANCE.resetQueueExecutor(); + Globals.INSTANCE.updateTMPFSFlag(server); }); ServerLifecycleEvents.SERVER_STOPPED.register(server -> { - Statics.executorService.shutdown(); + Globals.INSTANCE.shutdownQueueExecutor(60000); - if (config.get().shutdownBackup && Statics.globalShutdownBackupFlag.get()) { + if (config.get().shutdownBackup && Globals.INSTANCE.globalShutdownBackupFlag.get()) { BackupHelper.create( BackupContext.Builder .newBackupContextBuilder() diff --git a/src/main/java/net/szum123321/textile_backup/commands/FileSuggestionProvider.java b/src/main/java/net/szum123321/textile_backup/commands/FileSuggestionProvider.java index 9ebaaf1..7cfa439 100644 --- a/src/main/java/net/szum123321/textile_backup/commands/FileSuggestionProvider.java +++ b/src/main/java/net/szum123321/textile_backup/commands/FileSuggestionProvider.java @@ -25,7 +25,7 @@ import com.mojang.brigadier.suggestion.SuggestionProvider; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.server.command.ServerCommandSource; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.core.Utilities; import net.szum123321.textile_backup.core.restore.RestoreHelper; @@ -39,11 +39,11 @@ public final class FileSuggestionProvider implements SuggestionProvider getSuggestions(CommandContext ctx, SuggestionsBuilder builder) throws CommandSyntaxException { + public CompletableFuture getSuggestions(CommandContext ctx, SuggestionsBuilder builder) { String remaining = builder.getRemaining(); for (RestoreHelper.RestoreableFile file : RestoreHelper.getAvailableBackups(ctx.getSource().getServer())) { - String formattedCreationTime = file.getCreationTime().format(Statics.defaultDateTimeFormatter); + String formattedCreationTime = file.getCreationTime().format(Globals.defaultDateTimeFormatter); if (formattedCreationTime.startsWith(remaining)) { if (Utilities.wasSentByPlayer(ctx.getSource())) { //was typed by player diff --git a/src/main/java/net/szum123321/textile_backup/commands/create/StartBackupCommand.java b/src/main/java/net/szum123321/textile_backup/commands/create/StartBackupCommand.java index f7cafe0..cf5f58e 100644 --- a/src/main/java/net/szum123321/textile_backup/commands/create/StartBackupCommand.java +++ b/src/main/java/net/szum123321/textile_backup/commands/create/StartBackupCommand.java @@ -22,7 +22,7 @@ import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.core.create.BackupContext; @@ -41,23 +41,21 @@ public class StartBackupCommand { } private static int execute(ServerCommandSource source, @Nullable String comment) { - if(!Statics.executorService.isShutdown()) { - try { - Statics.executorService.submit( - BackupHelper.create( - BackupContext.Builder - .newBackupContextBuilder() - .setCommandSource(source) - .setComment(comment) - .guessInitiator() - .saveServer() - .build() - ) - ); - } catch (Exception e) { - log.error("Something went wrong while executing command!", e); - throw e; - } + try { + Globals.INSTANCE.getQueueExecutor().submit( + BackupHelper.create( + BackupContext.Builder + .newBackupContextBuilder() + .setCommandSource(source) + .setComment(comment) + .guessInitiator() + .saveServer() + .build() + ) + ); + } catch (Exception e) { + log.error("Something went wrong while executing command!", e); + throw e; } return 1; diff --git a/src/main/java/net/szum123321/textile_backup/commands/manage/DeleteCommand.java b/src/main/java/net/szum123321/textile_backup/commands/manage/DeleteCommand.java index c41d1cf..7b03810 100644 --- a/src/main/java/net/szum123321/textile_backup/commands/manage/DeleteCommand.java +++ b/src/main/java/net/szum123321/textile_backup/commands/manage/DeleteCommand.java @@ -23,10 +23,10 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.commands.CommandExceptions; -import net.szum123321.textile_backup.Statics; import net.szum123321.textile_backup.commands.FileSuggestionProvider; import net.szum123321.textile_backup.core.Utilities; @@ -52,7 +52,7 @@ public class DeleteCommand { LocalDateTime dateTime; try { - dateTime = LocalDateTime.from(Statics.defaultDateTimeFormatter.parse(fileName)); + dateTime = LocalDateTime.from(Globals.defaultDateTimeFormatter.parse(fileName)); } catch (DateTimeParseException e) { throw CommandExceptions.DATE_TIME_PARSE_COMMAND_EXCEPTION_TYPE.create(e); } @@ -63,7 +63,7 @@ public class DeleteCommand { stream.filter(Utilities::isValidBackup) .filter(file -> Utilities.getFileCreationTime(file).orElse(LocalDateTime.MIN).equals(dateTime)) .findFirst().ifPresent(file -> { - if(Statics.untouchableFile.isEmpty() || !Statics.untouchableFile.get().equals(file)) { + if(Globals.INSTANCE.getLockedFile().filter(p -> p == file).isEmpty()) { try { Files.delete(file); log.sendInfo(source, "File {} successfully deleted!", file); diff --git a/src/main/java/net/szum123321/textile_backup/commands/restore/KillRestoreCommand.java b/src/main/java/net/szum123321/textile_backup/commands/restore/KillRestoreCommand.java index e764d62..f0578a0 100644 --- a/src/main/java/net/szum123321/textile_backup/commands/restore/KillRestoreCommand.java +++ b/src/main/java/net/szum123321/textile_backup/commands/restore/KillRestoreCommand.java @@ -21,33 +21,36 @@ package net.szum123321.textile_backup.commands.restore; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.core.Utilities; - -import java.util.Optional; +import net.szum123321.textile_backup.core.restore.AwaitThread; public class KillRestoreCommand { private final static TextileLogger log = new TextileLogger(TextileBackup.MOD_NAME); public static LiteralArgumentBuilder register() { return CommandManager.literal("killR") .executes(ctx -> { - if(Statics.restoreAwaitThread != null && Statics.restoreAwaitThread.isAlive()) { - Statics.restoreAwaitThread.interrupt(); - Statics.globalShutdownBackupFlag.set(true); - Statics.untouchableFile = Optional.empty(); - - log.info("{} cancelled backup restoration.", Utilities.wasSentByPlayer(ctx.getSource()) ? - "Player: " + ctx.getSource().getName() : - "SERVER" - ); - - if(Utilities.wasSentByPlayer(ctx.getSource())) - log.sendInfo(ctx.getSource(), "Backup restoration successfully stopped."); - } else { + if(Globals.INSTANCE.getAwaitThread().filter(Thread::isAlive).isEmpty()) { log.sendInfo(ctx.getSource(), "Failed to stop backup restoration"); + return -1; } + + AwaitThread thread = Globals.INSTANCE.getAwaitThread().get(); + + thread.interrupt(); + Globals.INSTANCE.globalShutdownBackupFlag.set(true); + Globals.INSTANCE.setLockedFile(null); + + log.info("{} cancelled backup restoration.", Utilities.wasSentByPlayer(ctx.getSource()) ? + "Player: " + ctx.getSource().getName() : + "SERVER" + ); + + if(Utilities.wasSentByPlayer(ctx.getSource())) + log.sendInfo(ctx.getSource(), "Backup restoration successfully stopped."); + return 1; }); } diff --git a/src/main/java/net/szum123321/textile_backup/commands/restore/RestoreBackupCommand.java b/src/main/java/net/szum123321/textile_backup/commands/restore/RestoreBackupCommand.java index 85d984b..a339735 100644 --- a/src/main/java/net/szum123321/textile_backup/commands/restore/RestoreBackupCommand.java +++ b/src/main/java/net/szum123321/textile_backup/commands/restore/RestoreBackupCommand.java @@ -24,10 +24,10 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.commands.CommandExceptions; -import net.szum123321.textile_backup.Statics; import net.szum123321.textile_backup.commands.FileSuggestionProvider; import net.szum123321.textile_backup.core.restore.RestoreContext; import net.szum123321.textile_backup.core.restore.RestoreHelper; @@ -70,41 +70,42 @@ public class RestoreBackupCommand { } private static int execute(String file, @Nullable String comment, ServerCommandSource source) throws CommandSyntaxException { - if(Statics.restoreAwaitThread == null || (Statics.restoreAwaitThread != null && !Statics.restoreAwaitThread.isAlive())) { - LocalDateTime dateTime; - - try { - dateTime = LocalDateTime.from(Statics.defaultDateTimeFormatter.parse(file)); - } catch (DateTimeParseException e) { - throw CommandExceptions.DATE_TIME_PARSE_COMMAND_EXCEPTION_TYPE.create(e); - } - - Optional backupFile = RestoreHelper.findFileAndLockIfPresent(dateTime, source.getServer()); - - if(backupFile.isPresent()) { - log.info("Found file to restore {}", backupFile.get().getFile().getFileName().toString()); - } else { - log.sendInfo(source, "No file created on {} was found!", dateTime.format(Statics.defaultDateTimeFormatter)); - - return 0; - } - - Statics.restoreAwaitThread = RestoreHelper.create( - RestoreContext.Builder.newRestoreContextBuilder() - .setCommandSource(source) - .setFile(backupFile.get()) - .setComment(comment) - .build() - ); - - Statics.restoreAwaitThread.start(); - - return 1; - } else { + if(Globals.INSTANCE.getAwaitThread().filter(Thread::isAlive).isPresent()) { log.sendInfo(source, "Someone has already started another restoration."); - return 0; + return -1; } + + LocalDateTime dateTime; + + try { + dateTime = LocalDateTime.from(Globals.defaultDateTimeFormatter.parse(file)); + } catch (DateTimeParseException e) { + throw CommandExceptions.DATE_TIME_PARSE_COMMAND_EXCEPTION_TYPE.create(e); + } + + Optional backupFile = RestoreHelper.findFileAndLockIfPresent(dateTime, source.getServer()); + + if(backupFile.isPresent()) { + log.info("Found file to restore {}", backupFile.get().getFile().getFileName().toString()); + } else { + log.sendInfo(source, "No file created on {} was found!", dateTime.format(Globals.defaultDateTimeFormatter)); + return -1; + } + + Globals.INSTANCE.setAwaitThread( + RestoreHelper.create( + RestoreContext.Builder.newRestoreContextBuilder() + .setCommandSource(source) + .setFile(backupFile.get()) + .setComment(comment) + .build() + ) + ); + + Globals.INSTANCE.getAwaitThread().get().start(); + + return 1; } } diff --git a/src/main/java/net/szum123321/textile_backup/core/Utilities.java b/src/main/java/net/szum123321/textile_backup/core/Utilities.java index 5913e04..c38304d 100644 --- a/src/main/java/net/szum123321/textile_backup/core/Utilities.java +++ b/src/main/java/net/szum123321/textile_backup/core/Utilities.java @@ -25,13 +25,12 @@ import net.minecraft.text.MutableText; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.world.World; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.config.ConfigHelper; import net.szum123321.textile_backup.config.ConfigPOJO; -import net.szum123321.textile_backup.Statics; import net.szum123321.textile_backup.mixin.MinecraftServerSessionAccessor; -import org.apache.commons.io.FileUtils; import org.apache.commons.io.file.SimplePathVisitor; import org.jetbrains.annotations.NotNull; @@ -75,7 +74,7 @@ public class Utilities { } public static Path getBackupRootPath(String worldName) { - Path path = Path.of(config.get().path).toAbsolutePath(); + Path path = Path.of(config.get().backupDirectoryPath).toAbsolutePath(); if (config.get().perWorldBackup) path = path.resolve(worldName); @@ -104,25 +103,6 @@ public class Utilities { }); } - public static void updateTMPFSFlag(MinecraftServer server) { - boolean flag = false; - Path tmp_dir = Path.of(System.getProperty("java.io.tmpdir")); - if( - FileUtils.sizeOfDirectory(Utilities.getWorldFolder(server).toFile()) >= - tmp_dir.toFile().getUsableSpace() - ) { - log.error("Not enough space left in TMP directory! ({})", tmp_dir); - flag = true; - } - //!Files.isWritable(tmp_dir.resolve("test_txb_file_2137")) - Unsure why this was resolving to a file that isn't being created (at least not in Windows) - if(!Files.isWritable(tmp_dir)) { - log.error("TMP filesystem ({}) is read-only!", tmp_dir); - flag = true; - } - - if((Statics.disableTMPFiles = flag)) log.error("Might cause: https://github.com/Szum123321/textile_backup/wiki/ZIP-Problems"); - } - public static void disableWorldSaving(MinecraftServer server) { for (ServerWorld serverWorld : server.getWorlds()) { if (serverWorld != null && !serverWorld.savingDisabled) @@ -181,7 +161,7 @@ public class Utilities { try { return Optional.of( LocalDateTime.from( - Utilities.getBackupDateTimeFormatter().parse( + Globals.defaultDateTimeFormatter.parse( file.getFileName().toString().split(fileExtension)[0].split("#")[0] ))); } catch (Exception ignored) {} @@ -205,10 +185,6 @@ public class Utilities { return DateTimeFormatter.ofPattern(config.get().dateTimeFormat); } - public static DateTimeFormatter getBackupDateTimeFormatter() { - return Statics.defaultDateTimeFormatter; - } - public static String formatDuration(Duration duration) { DateTimeFormatter formatter; diff --git a/src/main/java/net/szum123321/textile_backup/core/create/BackupHelper.java b/src/main/java/net/szum123321/textile_backup/core/create/BackupHelper.java index 04d54ea..a61fdd2 100644 --- a/src/main/java/net/szum123321/textile_backup/core/create/BackupHelper.java +++ b/src/main/java/net/szum123321/textile_backup/core/create/BackupHelper.java @@ -19,7 +19,7 @@ package net.szum123321.textile_backup.core.create; import net.minecraft.server.command.ServerCommandSource; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.config.ConfigHelper; @@ -172,7 +172,7 @@ public class BackupHelper { //1 -> ok, 0 -> err private static int deleteFile(Path f, ServerCommandSource ctx) { - if(Statics.untouchableFile.isEmpty()|| !Statics.untouchableFile.get().equals(f)) { + if(Globals.INSTANCE.getLockedFile().filter(p -> p == f).isEmpty()) { try { Files.delete(f); log.sendInfoAL(ctx, "Deleting: {}", f); diff --git a/src/main/java/net/szum123321/textile_backup/core/create/BackupScheduler.java b/src/main/java/net/szum123321/textile_backup/core/create/BackupScheduler.java index b2ca19e..10d1be3 100644 --- a/src/main/java/net/szum123321/textile_backup/core/create/BackupScheduler.java +++ b/src/main/java/net/szum123321/textile_backup/core/create/BackupScheduler.java @@ -19,7 +19,7 @@ package net.szum123321.textile_backup.core.create; import net.minecraft.server.MinecraftServer; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.config.ConfigHelper; import net.szum123321.textile_backup.core.ActionInitiator; @@ -43,7 +43,7 @@ public class BackupScheduler { if(config.get().doBackupsOnEmptyServer || server.getPlayerManager().getCurrentPlayerCount() > 0) { if(scheduled) { if(nextBackup <= now) { - Statics.executorService.submit( + Globals.INSTANCE.getQueueExecutor().submit( BackupHelper.create( BackupContext.Builder .newBackupContextBuilder() @@ -62,7 +62,7 @@ public class BackupScheduler { } } else if(!config.get().doBackupsOnEmptyServer && server.getPlayerManager().getCurrentPlayerCount() == 0) { if(scheduled && nextBackup <= now) { - Statics.executorService.submit( + Globals.INSTANCE.getQueueExecutor().submit( BackupHelper.create( BackupContext.Builder .newBackupContextBuilder() diff --git a/src/main/java/net/szum123321/textile_backup/core/create/MakeBackupRunnable.java b/src/main/java/net/szum123321/textile_backup/core/create/MakeBackupRunnable.java index 9ad6aa8..beba9b8 100644 --- a/src/main/java/net/szum123321/textile_backup/core/create/MakeBackupRunnable.java +++ b/src/main/java/net/szum123321/textile_backup/core/create/MakeBackupRunnable.java @@ -18,7 +18,7 @@ package net.szum123321.textile_backup.core.create; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.config.ConfigHelper; @@ -42,7 +42,7 @@ public class MakeBackupRunnable implements Runnable { private final BackupContext context; - public MakeBackupRunnable(BackupContext context){ + public MakeBackupRunnable(BackupContext context) { this.context = context; } @@ -50,9 +50,9 @@ public class MakeBackupRunnable implements Runnable { public void run() { try { Utilities.disableWorldSaving(context.server()); - Statics.disableWatchdog = true; + Globals.INSTANCE.disableWatchdog = true; - Utilities.updateTMPFSFlag(context.server()); + Globals.INSTANCE.updateTMPFSFlag(context.server()); log.sendInfoAL(context, "Starting backup"); @@ -90,7 +90,7 @@ public class MakeBackupRunnable implements Runnable { switch (config.get().format) { case ZIP -> { - if (coreCount > 1 && !Statics.disableTMPFiles) { + if (coreCount > 1 && !Globals.INSTANCE.disableTMPFS()) { ParallelZipCompressor.getInstance().createArchive(world, outFile, context, coreCount); log.trace("Using PARALLEL Zip Compressor. Threads: {}", coreCount); } else { @@ -120,7 +120,7 @@ public class MakeBackupRunnable implements Runnable { } } finally { Utilities.enableWorldSaving(context.server()); - Statics.disableWatchdog = false; + Globals.INSTANCE.disableWatchdog = false; } } diff --git a/src/main/java/net/szum123321/textile_backup/core/restore/RestoreBackupRunnable.java b/src/main/java/net/szum123321/textile_backup/core/restore/RestoreBackupRunnable.java index a803d93..7de61ef 100644 --- a/src/main/java/net/szum123321/textile_backup/core/restore/RestoreBackupRunnable.java +++ b/src/main/java/net/szum123321/textile_backup/core/restore/RestoreBackupRunnable.java @@ -18,13 +18,13 @@ package net.szum123321.textile_backup.core.restore; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.config.ConfigHelper; import net.szum123321.textile_backup.config.ConfigPOJO; import net.szum123321.textile_backup.core.ActionInitiator; import net.szum123321.textile_backup.core.LivingServer; -import net.szum123321.textile_backup.Statics; import net.szum123321.textile_backup.core.Utilities; import net.szum123321.textile_backup.core.create.BackupContext; import net.szum123321.textile_backup.core.create.BackupHelper; @@ -47,7 +47,7 @@ public class RestoreBackupRunnable implements Runnable { @Override public void run() { - Statics.globalShutdownBackupFlag.set(false); + Globals.INSTANCE.globalShutdownBackupFlag.set(false); log.info("Shutting down server..."); @@ -95,7 +95,7 @@ public class RestoreBackupRunnable implements Runnable { } //in case we're playing on client - Statics.globalShutdownBackupFlag.set(true); + Globals.INSTANCE.globalShutdownBackupFlag.set(true); log.info("Done!"); } diff --git a/src/main/java/net/szum123321/textile_backup/core/restore/RestoreHelper.java b/src/main/java/net/szum123321/textile_backup/core/restore/RestoreHelper.java index 856f692..085dc6d 100644 --- a/src/main/java/net/szum123321/textile_backup/core/restore/RestoreHelper.java +++ b/src/main/java/net/szum123321/textile_backup/core/restore/RestoreHelper.java @@ -19,11 +19,11 @@ package net.szum123321.textile_backup.core.restore; import net.minecraft.server.MinecraftServer; +import net.szum123321.textile_backup.Globals; import net.szum123321.textile_backup.TextileBackup; import net.szum123321.textile_backup.TextileLogger; import net.szum123321.textile_backup.config.ConfigHelper; import net.szum123321.textile_backup.config.ConfigPOJO; -import net.szum123321.textile_backup.Statics; import net.szum123321.textile_backup.core.ActionInitiator; import net.szum123321.textile_backup.core.Utilities; import org.jetbrains.annotations.NotNull; @@ -45,7 +45,7 @@ public class RestoreHelper { Optional optionalFile; try (Stream stream = Files.list(root)) { - optionalFile = stream + optionalFile = stream .map(RestoreableFile::newInstance) .flatMap(Optional::stream) .filter(rf -> rf.getCreationTime().equals(backupTime)) @@ -54,7 +54,7 @@ public class RestoreHelper { throw new RuntimeException(e); } - Statics.untouchableFile = optionalFile.map(RestoreableFile::getFile); + optionalFile.ifPresent(r -> Globals.INSTANCE.setLockedFile(r.getFile())); return optionalFile; } @@ -138,7 +138,7 @@ public class RestoreHelper { } public String toString() { - return this.getCreationTime().format(Statics.defaultDateTimeFormatter) + (comment != null ? "#" + comment : ""); + return this.getCreationTime().format(Globals.defaultDateTimeFormatter) + (comment != null ? "#" + comment : ""); } } } \ No newline at end of file diff --git a/src/main/java/net/szum123321/textile_backup/mixin/DedicatedServerWatchdogMixin.java b/src/main/java/net/szum123321/textile_backup/mixin/DedicatedServerWatchdogMixin.java index d6b37ac..2b9f0bb 100644 --- a/src/main/java/net/szum123321/textile_backup/mixin/DedicatedServerWatchdogMixin.java +++ b/src/main/java/net/szum123321/textile_backup/mixin/DedicatedServerWatchdogMixin.java @@ -20,7 +20,7 @@ package net.szum123321.textile_backup.mixin; import net.minecraft.server.dedicated.DedicatedServerWatchdog; import net.minecraft.util.Util; -import net.szum123321.textile_backup.Statics; +import net.szum123321.textile_backup.Globals; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; @@ -30,6 +30,6 @@ public class DedicatedServerWatchdogMixin { @ModifyVariable(method = "run()V", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/util/Util;getMeasuringTimeMs()J"), ordinal = 0, name = "l") private long redirectedCall(long original) { - return Statics.disableWatchdog ? Util.getMeasuringTimeMs() : original; + return Globals.INSTANCE.disableWatchdog ? Util.getMeasuringTimeMs() : original; } }