BackupTask class

Пакет: com.hypixel.hytale.server.core.util.backup

Файл: com/hypixel/hytale/server/core/util/backup/BackupTask.java

Поля (20)

МодификаторыТипИмя
final DateTimeFormatter BACKUP_FILE_DATE_FORMATTER
BackupConfig var1
FileTime var1
var1
Path var1x
BackupTask var2
BackupConfig var2
int var2
String var2x
Path var3
int var3
List var3
Path var4
List var4
var4
Path var5
FileTime var5
FileTime var6
FileTime var7
boolean var8

Методы (10)

МодификаторыВозвратСигнатура
static void cleanOldArchivesvoid cleanOldArchives(@Nonnull Path var0)
static void cleanOrArchiveOldBackupsvoid cleanOrArchiveOldBackups(@Nonnull Path var0, @Nonnull Path var1)
for for(Path var10 : var4)
for for(Path var5 : var3)
for for(Path var4 : var2)
if if(var3 >= 1)
if if(var8)
if if(var2 >= 1)
public void runpublic void run()
static CompletableFuture<Void> startCompletableFuture<Void> start(@Nonnull Path var0, @Nonnull Path var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.util.backup;

class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.config.BackupConfig;
class="kw">import java.io.IOException;
class="kw">import java.nio.file.DirectoryStream;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.nio.file.StandardCopyOption;
class="kw">import java.nio.file.attribute.FileTime;
class="kw">import java.time.Duration;
class="kw">import java.time.LocalDateTime;
class="kw">import java.time.ZoneId;
class="kw">import java.time.format.DateTimeFormatter;
class="kw">import java.time.temporal.ChronoUnit;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class BackupTask {
   class="kw">private class="kw">static class="kw">final DateTimeFormatter BACKUP_FILE_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm-ss");
   class="kw">private class="kw">static class="kw">final Duration BACKUP_ARCHIVE_FREQUENCY = Duration.of(12L, ChronoUnit.HOURS);
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nonnull
   class="kw">private class="kw">final CompletableFuture<Void> completion = new CompletableFuture<>();

   class="kw">public class="kw">static CompletableFuture<Void> start(@Nonnull Path var0, @Nonnull Path var1) {
      BackupTask var2 = new BackupTask(var0, var1);
      class="kw">return var2.completion;
   }

   class="kw">private BackupTask(@Nonnull class="kw">final Path var1, @Nonnull class="kw">final Path var2) {
      (new Thread("Backup Runner") {
         {
            this.setDaemon(false);
         }

         @Override
         class="kw">public void run() {
            BackupUtil.broadcastBackupStatus(true);

            try {
               Path var1x = var2.resolve("archive");
               Files.createDirectories(var2);
               Files.createDirectories(var1x);
               BackupTask.cleanOrArchiveOldBackups(var2, var1x);
               BackupTask.cleanOldArchives(var1x);
               String var2x = BackupTask.BACKUP_FILE_DATE_FORMATTER.format(LocalDateTime.now(ZoneId.systemDefault())) + ".zip";
               Path var3 = var2.resolve(var2x + ".tmp");
               BackupUtil.walkFileTreeAndZip(var1, var3);
               Path var4 = var2.resolve(var2x);
               Files.move(var3, var4, StandardCopyOption.REPLACE_EXISTING);
               BackupTask.LOGGER.at(Level.INFO).log("Successfully created backup %s", var4);
               BackupTask.this.completion.complete(null);
            } catch (Throwable var8) {
               ((HytaleLogger.Api)BackupTask.LOGGER.at(Level.SEVERE).withCause(var8)).log("Backup failed with exception");
               BackupUtil.broadcastBackupError(var8);
               BackupTask.this.completion.completeExceptionally(var8);
            } class="kw">finally {
               BackupUtil.broadcastBackupStatus(false);
            }
         }
      }).start();
   }

   class="kw">private class="kw">static void cleanOrArchiveOldBackups(@Nonnull Path var0, @Nonnull Path var1) class="kw">throws IOException {
      BackupConfig var2 = HytaleServer.get().getConfig().getBackupConfig();
      int var3 = var2.getMaxCount();
      if (var3 >= 1) {
         List var4 = BackupUtil.findOldBackups(var0, var3);
         if (var4 != null && !var4.isEmpty()) {
            Path var5 = var4.getFirst();
            FileTime var6 = Files.getLastModifiedTime(var5);
            FileTime var7 = getMostRecentArchive(var1);
            boolean var8 = var7 == null || Duration.between(var7.toInstant(), var6.toInstant()).compareTo(BACKUP_ARCHIVE_FREQUENCY) > 0;
            if (var8) {
               var4 = var4.subList(1, var4.size());
               Files.move(var5, var1.resolve(var5.getFileName()), StandardCopyOption.REPLACE_EXISTING);
               LOGGER.at(Level.INFO).log("Archived old backup: %s", var5);
            }

            for (Path var10 : var4) {
               LOGGER.at(Level.INFO).log("Clearing old backup: %s", var10);
               Files.deleteIfExists(var10);
            }
         }
      }
   }

   class="kw">private class="kw">static void cleanOldArchives(@Nonnull Path var0) class="kw">throws IOException {
      BackupConfig var1 = HytaleServer.get().getConfig().getBackupConfig();
      int var2 = var1.getArchiveMaxCount();
      if (var2 >= 1) {
         List var3 = BackupUtil.findOldBackups(var0, var2);
         if (var3 != null && !var3.isEmpty()) {
            for (Path var5 : var3) {
               LOGGER.at(Level.INFO).log("Clearing old archive backup: %s", var5);
               Files.deleteIfExists(var5);
            }
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static FileTime getMostRecentArchive(@Nonnull Path var0) class="kw">throws IOException {
      FileTime var1 = null;

      try (DirectoryStream var2 = Files.newDirectoryStream(var0)) {
         for (Path var4 : var2) {
            if (Files.isRegularFile(var4)) {
               FileTime var5 = Files.getLastModifiedTime(var4);
               if (var1 == null || var5.compareTo(var1) > 0) {
                  var1 = var5;
               }
            }
         }
      }

      class="kw">return var1;
   }
}