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;
}
}
}
}