BackupChunkLoader class

Пакет: com.hypixel.hytale.server.core.universe.world.storage.provider

Файл: com/hypixel/hytale/server/core/universe/world/storage/provider/BackupChunkLoader.java

implements: IChunkLoader

Поля (20)

МодификаторыТипИмя
final List<IChunkLoader> loaders
Path var10
var10
var10
FileSystem var11
Path var12
Path var13
Path var14
Enumeration var16
ZipEntry var17
String var18
String var19
Path var20
IChunkLoader var28
IChunkStorageProvider var3
Path var4
IChunkLoader var4
Path var7
String var8
String var9

Методы (7)

МодификаторыВозвратСигнатура
abstract throw new RuntimeExceptionthrow new RuntimeException("Recovery of individual chunks from backups not supported by storage type. Please restore instead.")
for for(Path var6 : var2)
for for(IChunkLoader var2 : this.loaders)
for for(FileSystem var10 : this.fileSystems)
for for(Path var11 : this.tempDirs)
if if(var28 == null)
private CompletableFuture<Holder<ChunkStore>> loadChunkNextCompletableFuture<Holder<ChunkStore>> loadChunkNext(Iterator<IChunkLoader> var1, int var2, int var3)

Исходный код

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

class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.IChunkLoader;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import java.io.IOException;
class="kw">import java.io.InputStream;
class="kw">import java.nio.file.FileSystem;
class="kw">import java.nio.file.FileSystems;
class="kw">import java.nio.file.Files;
class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Comparator;
class="kw">import java.util.Enumeration;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.stream.Stream;
class="kw">import java.util.zip.ZipEntry;
class="kw">import java.util.zip.ZipFile;
class="kw">import javax.annotation.Nonnull;

class="kw">public class BackupChunkLoader class="kw">implements IChunkLoader {
   class="kw">private class="kw">final List<IChunkLoader> loaders = new ArrayList<>();
   class="kw">private class="kw">final List<FileSystem> fileSystems = new ArrayList<>();
   class="kw">private class="kw">final List<Path> tempDirs = new ArrayList<>();

   class="kw">public BackupChunkLoader(ChunkStore var1, List<Path> var2) class="kw">throws IOException {
      IChunkStorageProvider var3 = var1.getWorld().getWorldConfig().getChunkStorageProvider();
      Path var4 = Universe.get().getWorldsPath();

      for (Path var6 : var2) {
         Path var7 = var1.getWorld().getSavePath();
         String var8 = var4.relativize(var7).toString().replace('\\', '/');
         String var9 = "worlds/" + var8 + "/chunks/";
         FileSystem var11 = FileSystems.newFileSystem(var6);
         Path var12 = var11.getPath("worlds", var4.relativize(var7).toString());
         Path var10;
         if (Files.exists(var12)) {
            this.fileSystems.add(var11);
            var10 = var12;
         } else {
            var11.close();
            Path var13 = Files.createTempDirectory("hytale-backup-recovery-");
            this.tempDirs.add(var13);
            Path var14 = var13.resolve("chunks");
            Files.createDirectory(var14);

            try (ZipFile var15 = new ZipFile(var6.toFile())) {
               Enumeration var16 = var15.entries();

               while (var16.hasMoreElements()) {
                  ZipEntry var17 = var16.nextElement();
                  String var18 = var17.getName().replace('\\', '/');
                  if (!var17.isDirectory() && var18.startsWith(var9)) {
                     String var19 = var18.substring(var9.length());
                     if (!var19.contains("/")) {
                        Path var20 = var14.resolve(var19);

                        try (InputStream var21 = var15.getInputStream(var17)) {
                           Files.copy(var21, var20);
                        }
                     }
                  }
               }
            }

            var10 = var13;
         }

         IChunkLoader var28 = var3.getRecoveryLoader(var1.getStore(), var10);
         if (var28 == null) {
            throw new RuntimeException("Recovery of individual chunks from backups not supported by storage type. Please restore instead.");
         }

         this.loaders.add(var28);
      }
   }

   @Nonnull
   @Override
   class="kw">public CompletableFuture<Holder<ChunkStore>> loadHolder(int var1, int var2) {
      class="kw">return this.loadChunkNext(this.loaders.iterator(), var1, var2);
   }

   class="kw">private CompletableFuture<Holder<ChunkStore>> loadChunkNext(Iterator<IChunkLoader> var1, int var2, int var3) {
      if (!var1.hasNext()) {
         class="kw">return CompletableFuture.completedFuture(null);
      }

      IChunkLoader var4 = var1.next();
      class="kw">return var4.loadHolder(var2, var3)
         .thenCompose(var4x -> var4x != null ? CompletableFuture.completedFuture((Holder<ChunkStore>)var4x) : this.loadChunkNext(var1, var2, var3))
         .exceptionallyCompose(var4x -> this.loadChunkNext(var1, var2, var3));
   }

   @Nonnull
   @Override
   class="kw">public LongList getIndexes() class="kw">throws IOException {
      class="kw">return LongList.of();
   }

   @Override
   class="kw">public void close() class="kw">throws IOException {
      for (IChunkLoader var2 : this.loaders) {
         var2.close();
      }

      for (FileSystem var10 : this.fileSystems) {
         var10.close();
      }

      for (Path var11 : this.tempDirs) {
         try (Stream var3 = Files.walk(var11)) {
            var3.sorted(Comparator.reverseOrder()).forEach(var0 -> {
               try {
                  Files.deleteIfExists(var0);
               } catch (IOException var2x) {
               }
            });
         }
      }
   }
}