DiskUniverseResourceStorageProvider class

Пакет: com.hypixel.hytale.server.core.universe.resources

Файл: com/hypixel/hytale/server/core/universe/resources/DiskUniverseResourceStorageProvider.java

implements: IUniverseResourceStorageProvider

Поля (14)

МодификаторыТипИмя
public static final String FILE_EXTENSION
final String ID
private static final HytaleLogger LOGGER
private final boolean createFiles
private final Path path
private final StorageManager storageManager
Map var2
Object var2
HashSet var2
Path var2
Path var3
BsonDocument var4
var4
ExtraInfo var5

Методы (13)

МодификаторыВозвратСигнатура
public DiskUniverseResourceStoragepublic DiskUniverseResourceStorage(@Nonnull Path var1, @Nonnull StorageManager var2, boolean var3)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Universe resource storage path must be within a trusted directory: " + this.path)
abstract throw new RuntimeExceptionthrow new RuntimeException("Failed to create universe resources directory", var5)
for for(UniverseResourceType var4 : var1)
for for(UniverseResourceType var4 : var1)
for for(Path var5 : var9)
if if(var3)
if if(var2 == null)
private <T> T loadResourceprivate <T> T loadResource(@Nonnull UniverseResourceType<T> var1)
private Path resolveFileprivate Path resolveFile(@Nonnull UniverseResourceType<?> var1)
public <T> CompletableFuture<Void> savepublic <T> CompletableFuture<Void> save(@Nonnull UniverseResourceType<T> var1, @Nonnull T var2)
private void warnAboutUnknownFilesprivate void warnAboutUnknownFiles(@Nonnull Collection<? extends UniverseResourceType<?>> var1)
private <T> CompletableFuture<Void> writeResourceprivate <T> CompletableFuture<Void> writeResource(@Nonnull UniverseResourceType<T> var1, @Nonnull T var2, @Nonnull Path var3)

Исходный код

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

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.ExtraInfo;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.util.RawJsonReader;
class="kw">import com.hypixel.hytale.common.util.PathUtil;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.Constants;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.universe.StorageManager;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
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.util.Collection;
class="kw">import java.util.HashMap;
class="kw">import java.util.HashSet;
class="kw">import java.util.Map;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.bson.BsonDocument;

class="kw">public class DiskUniverseResourceStorageProvider class="kw">implements IUniverseResourceStorageProvider {
   class="kw">public class="kw">static class="kw">final String ID = "Disk";
   class="kw">public class="kw">static class="kw">final BuilderCodec<DiskUniverseResourceStorageProvider> CODEC = BuilderCodec.builder(
         DiskUniverseResourceStorageProvider.class, DiskUniverseResourceStorageProvider::new
      )
      .append(new KeyedCodec<>("Path", Codec.STRING), (var0, var1) -> var0.path = Path.of(var1), var0 -> var0.path.toString())
      .add()
      .build();
   @Nonnull
   class="kw">private Path path = Constants.UNIVERSE_PATH.resolve("resources");

   class="kw">public DiskUniverseResourceStorageProvider() {
   }

   @Nonnull
   class="kw">public Path getPath() {
      class="kw">return this.path;
   }

   @Nonnull
   @Override
   class="kw">public IUniverseResourceStorage getResourceStorage() {
      if (!PathUtil.isInTrustedRoot(this.path)) {
         throw new IllegalStateException("Universe resource storage path must be within a trusted directory: " + this.path);
      } else {
         class="kw">return new DiskUniverseResourceStorageProvider.DiskUniverseResourceStorage(this.path, Universe.get().getStorageManager(), !Options.isBare());
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "DiskUniverseResourceStorageProvider{path=" + this.path + "}";
   }

   class="kw">public class="kw">static class DiskUniverseResourceStorage class="kw">implements IUniverseResourceStorage {
      class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
      class="kw">public class="kw">static class="kw">final String FILE_EXTENSION = ".json";
      @Nonnull
      class="kw">private class="kw">final Path path;
      @Nonnull
      class="kw">private class="kw">final StorageManager storageManager;
      class="kw">private class="kw">final boolean createFiles;

      class="kw">public DiskUniverseResourceStorage(@Nonnull Path var1, @Nonnull StorageManager var2, boolean var3) {
         this.path = var1;
         this.storageManager = var2;
         this.createFiles = var3;
         if (var3) {
            try {
               Files.createDirectories(var1);
            } catch (IOException var5) {
               throw new RuntimeException("Failed to create universe resources directory", var5);
            }
         }
      }

      @Nonnull
      @Override
      class="kw">public Map<UniverseResourceType<?>, Object> loadAll(@Nonnull Collection<? class="kw">extends UniverseResourceType<?>> var1) {
         Map var2 = new HashMap<>();

         for (UniverseResourceType var4 : var1) {
            var2.put(var4, this.loadResource(var4));
         }

         this.warnAboutUnknownFiles(var1);
         class="kw">return var2;
      }

      @Nonnull
      @Override
      class="kw">public <T> CompletableFuture<Void> save(@Nonnull UniverseResourceType<T> var1, @Nonnull T var2) {
         Path var3 = this.resolveFile(var1);
         class="kw">return !this.createFiles && !Files.isRegularFile(var3)
            ? CompletableFuture.completedFuture(null)
            : this.storageManager.doSave(var3, () -> this.writeResource(var1, var2, var3));
      }

      @Nonnull
      class="kw">private <T> T loadResource(@Nonnull UniverseResourceType<T> var1) {
         Object var2 = RawJsonReader.readSyncWithBak(this.resolveFile(var1), var1.getCodec(), LOGGER);
         class="kw">return var2 != null ? var2 : var1.getCodec().getDefaultValue();
      }

      class="kw">private void warnAboutUnknownFiles(@Nonnull Collection<? class="kw">extends UniverseResourceType<?>> var1) {
         HashSet var2 = new HashSet<>();

         for (UniverseResourceType var4 : var1) {
            var2.add(var4.getId() + ".json");
         }

         try (DirectoryStream var9 = Files.newDirectoryStream(this.path, "*.json")) {
            for (Path var5 : var9) {
               if (!var2.contains(var5.getFileName().toString())) {
                  LOGGER.at(Level.WARNING).log("Ignoring unknown universe resource file %s", var5);
               }
            }
         } catch (IOException var8) {
            ((HytaleLogger.Api)LOGGER.at(Level.FINE).withCause(var8)).log("Failed to list universe resources directory %s", this.path);
         }
      }

      @Nonnull
      class="kw">private <T> CompletableFuture<Void> writeResource(@Nonnull UniverseResourceType<T> var1, @Nonnull T var2, @Nonnull Path var3) {
         BsonDocument var4;
         try {
            ExtraInfo var5 = ExtraInfo.THREAD_LOCAL.get();
            var4 = var1.getCodec().encode(var2, var5).asDocument();
            var5.getValidationResults().logOrThrowValidatorExceptions(LOGGER);
         } catch (Exception var6) {
            class="kw">return CompletableFuture.failedFuture(var6);
         }

         class="kw">return BsonUtil.writeDocument(var3, var4);
      }

      @Nonnull
      class="kw">private Path resolveFile(@Nonnull UniverseResourceType<?> var1) {
         Path var2 = PathUtil.resolveName(this.path, var1.getId() + ".json");
         if (var2 == null) {
            throw new IllegalStateException("Universe resource id resolves outside the resources directory: " + var1.getId());
         } else {
            class="kw">return var2;
         }
      }
   }
}