MigrationData class
Пакет: com.hypixel.hytale.server.core.universe.world.storage.provider
Файл: com/hypixel/hytale/server/core/universe/world/storage/provider/MigrationChunkStorageProvider.java
Поля (2)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private Object[] |
loaderData |
|
private Object |
saverData |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe.world.storage.provider;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Store;
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 com.hypixel.hytale.server.core.universe.world.storage.IChunkSaver;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
class="kw">import it.unimi.dsi.fastutil.longs.LongArrayList;
class="kw">import it.unimi.dsi.fastutil.longs.LongList;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import java.io.IOException;
class="kw">import java.util.Arrays;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.checkerframework.checker.nullness.compatqual.NonNullDecl;
class="kw">public class MigrationChunkStorageProvider class="kw">implements IChunkStorageProvider<MigrationChunkStorageProvider.MigrationData> {
class="kw">public class="kw">static class="kw">final String ID = "Migration";
@Nonnull
class="kw">public class="kw">static class="kw">final BuilderCodec<MigrationChunkStorageProvider> CODEC = BuilderCodec.<MigrationChunkStorageProvider>builder(
MigrationChunkStorageProvider.class, MigrationChunkStorageProvider::new
)
.documentation(
"A provider that combines multiple storage providers in a chain to assist with migrating worlds between storage formats.\n\nCan also be used to set storage to load chunks but block saving them if combined with the **Empty** storage provider"
)
.<IChunkStorageProvider<?>[]>append(
new KeyedCodec<>("Loaders", new ArrayCodec<>(IChunkStorageProvider.CODEC, IChunkStorageProvider[]::new)),
(var0, var1) -> var0.from = var1,
var0 -> var0.from
)
.documentation(
"A list of storage providers to use as chunk loaders.\n\nEach loader will be tried in order to load a chunk, returning the chunk if found otherwise trying the next loaded until found or none are left."
)
.add()
.<IChunkStorageProvider<?>>append(new KeyedCodec<>("Saver", IChunkStorageProvider.CODEC), (var0, var1) -> var0.to = var1, var0 -> var0.to)
.documentation("The storage provider to use to save chunks.")
.add()
.build();
class="kw">private IChunkStorageProvider<?>[] from;
class="kw">private IChunkStorageProvider<?> to;
class="kw">public MigrationChunkStorageProvider() {
}
class="kw">public MigrationChunkStorageProvider(@Nonnull IChunkStorageProvider[] var1, @Nonnull IChunkStorageProvider var2) {
this.from = var1;
this.to = var2;
}
class="kw">public MigrationChunkStorageProvider.MigrationData initialize(@NonNullDecl Store<ChunkStore> var1) class="kw">throws IOException {
MigrationChunkStorageProvider.MigrationData var2 = new MigrationChunkStorageProvider.MigrationData();
var2.loaderData = new Object[this.from.length];
for (int var3 = 0; var3 < this.from.length; var3++) {
var2.loaderData[var3] = this.from[var3].initialize(var1);
}
var2.saverData = this.to.initialize(var1);
class="kw">return var2;
}
class="kw">public void delete(@Nonnull MigrationChunkStorageProvider.MigrationData var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException {
for (int var3 = 0; var3 < this.from.length; var3++) {
((IChunkStorageProvider<Object>)this.from[var3]).delete(var1.loaderData[var3], var2);
}
((IChunkStorageProvider<Object>)this.to).delete(var1.saverData, var2);
}
class="kw">public void close(@NonNullDecl MigrationChunkStorageProvider.MigrationData var1, @NonNullDecl Store<ChunkStore> var2) class="kw">throws IOException {
for (int var3 = 0; var3 < this.from.length; var3++) {
((IChunkStorageProvider<Object>)this.from[var3]).close(var1.loaderData[var3], var2);
}
((IChunkStorageProvider<Object>)this.to).close(var1.saverData, var2);
}
@Nonnull
class="kw">public IChunkLoader getLoader(@Nonnull MigrationChunkStorageProvider.MigrationData var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException {
IChunkLoader[] var3 = new IChunkLoader[this.from.length];
for (int var4 = 0; var4 < this.from.length; var4++) {
var3[var4] = ((IChunkStorageProvider<Object>)this.from[var4]).getLoader(var1.loaderData[var4], var2);
}
class="kw">return new MigrationChunkStorageProvider.MigrationChunkLoader(var3);
}
@Nonnull
class="kw">public IChunkSaver getSaver(@Nonnull MigrationChunkStorageProvider.MigrationData var1, @Nonnull Store<ChunkStore> var2) class="kw">throws IOException {
class="kw">return ((IChunkStorageProvider<Object>)this.to).getSaver(var1.saverData, var2);
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "MigrationChunkStorageProvider{from=" + Arrays.toString(this.from) + ", to=" + this.to + "}";
}
class="kw">public class="kw">static class MigrationChunkLoader class="kw">implements IChunkLoader {
@Nonnull
class="kw">private class="kw">final IChunkLoader[] loaders;
class="kw">public MigrationChunkLoader(@Nonnull IChunkLoader... var1) {
this.loaders = var1;
}
@Override
class="kw">public void close() class="kw">throws IOException {
IOException var1 = null;
for (IChunkLoader var5 : this.loaders) {
try {
var5.close();
} catch (Exception var7) {
if (var1 == null) {
var1 = new IOException("Failed to close one or more loaders!");
}
var1.addSuppressed(var7);
}
}
if (var1 != null) {
throw var1;
}
}
@Nonnull
@Override
class="kw">public CompletableFuture<Holder<ChunkStore>> loadHolder(int var1, int var2) {
CompletableFuture var3 = this.loaders[0].loadHolder(var1, var2);
for (int var4 = 1; var4 < this.loaders.length; var4++) {
IChunkLoader var5 = this.loaders[var4];
CompletableFuture var6 = var3;
var3 = var6.<CompletableFuture<Holder<ChunkStore>>>handle((var4x, var5x) -> {
if (var5x != null) {
class="kw">return var5.loadHolder(var1, var2).exceptionally(var1x -> {
var1x.addSuppressed(var5x);
throw SneakyThrow.sneakyThrow(var1x);
});
} else {
class="kw">return var4x == null ? var5.loadHolder(var1, var2) : var6;
}
}).thenCompose(Function.identity());
}
class="kw">return var3;
}
@Nonnull
@Override
class="kw">public LongList getIndexes() class="kw">throws IOException {
LongOpenHashSet var1 = new LongOpenHashSet();
for (IChunkLoader var5 : this.loaders) {
var1.addAll(var5.getIndexes());
}
class="kw">return new LongArrayList(var1);
}
}
class="kw">public class="kw">static class MigrationData {
class="kw">private Object[] loaderData;
class="kw">private Object saverData;
class="kw">public MigrationData() {
}
}
}