SchemaGenerator class
Пакет: com.hypixel.hytale.server.core.schema
Файл: com/hypixel/hytale/server/core/schema/SchemaGenerator.java
Поля (45)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
SchemaGenerator.GenerationResult |
var0 |
|
LinkedHashMap |
var1 |
|
SchemaContext |
var1 |
|
LinkedHashMap |
var10 |
|
String |
var10 |
|
LinkedHashMap |
var11 |
|
String |
var11 |
|
ArrayList |
var12 |
|
AssetCodec |
var12 |
|
Schema |
var13 |
|
Schema.HytaleMetadata |
var14 |
|
Class |
var15 |
|
List |
var16 |
|
String[] |
var17 |
|
Object |
var19 |
|
SchemaGenerator.GenerationResult |
var2 |
|
AssetStore[] |
var2 |
|
BsonDocument |
var2 |
|
Object |
var20 |
|
LinkedHashMap |
var22 |
|
ArrayList |
var23 |
|
LinkedHashMap |
var25 |
|
ArrayList |
var27 |
|
boolean |
var3 |
|
BsonArray |
var3 |
|
LinkedHashMap |
var30 |
|
ArrayList |
var32 |
|
Schema |
var33 |
|
LinkedHashMap |
var35 |
|
String |
var36 |
|
Schema |
var38 |
|
ObjectSchema |
var39 |
|
Path |
var4 |
|
BsonDocument |
var4 |
|
BsonDocument |
var4 |
|
Schema |
var40 |
|
String |
var41 |
|
Schema.HytaleMetadata |
var42 |
|
LinkedHashMap |
var5 |
|
ArrayList |
var6 |
|
String |
var7 |
|
Path |
var8 |
|
Path |
var9 |
|
Class |
var9 |
Методы (35)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
private |
record |
AssetSchemaRegistrationrecord AssetSchemaRegistration(@Nonnull String fileName, @Nonnull Function<SchemaContext, Schema> factory, @Nullable List<String> fileMatchPatterns, @Nullable String extension) |
private |
record |
ConfigRegistrationrecord ConfigRegistration(@Nonnull String name, @Nonnull BuilderCodec<?> codec, @Nullable String virtualPath, @Nullable List<String> fileMatchPatterns) |
private |
record |
GenerationResultrecord GenerationResult(LinkedHashMap<String, Schema> assetSchemas,
LinkedHashMap<String, Schema> customAssetSchemas,
LinkedHashMap<String, Schema> configSchemas,
LinkedHashMap<String, Schema> sharedSchemas,
List<SchemaGenerator.VsCodeEntry> assetVsCodeEntries,
List<SchemaGenerator.VsCodeEntry> customAssetVsCodeEntries,
List<SchemaGenerator.VsCodeEntry> configVsCodeEntries) |
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException("Schema generation failed", var7) |
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException("Failed to prepare schema directory: " + var0, var6) |
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException("Failed to write .vscode/settings.json", var7) |
private |
record |
VsCodeEntryrecord VsCodeEntry(String schemaFileName, List<String> fileMatchPatterns, @Nullable String extension) |
static |
void |
addVsCodeSchemaLinkvoid addVsCodeSchemaLink(@Nonnull BsonDocument var0, @Nonnull String var1, @Nonnull List<String> var2, @Nullable String var3) |
static |
void |
cleanAndCreateSchemaDirvoid cleanAndCreateSchemaDir(@Nonnull Path var0) |
abstract |
|
cleanAndCreateSchemaDir cleanAndCreateSchemaDir(var4) |
abstract |
|
cleanAndCreateSchemaDir cleanAndCreateSchemaDir(var8) |
abstract |
|
cleanAndCreateSchemaDir cleanAndCreateSchemaDir(var9) |
static |
SchemaGenerator.GenerationResult |
collectSchemasSchemaGenerator.GenerationResult collectSchemas(boolean var0) |
|
|
for for(AssetStore var6 : var2) |
|
|
for for(AssetStore var8 : var2) |
|
|
for for(SchemaGenerator.AssetSchemaRegistration var31 : assetSchemaRegistrations) |
|
|
for for(SchemaGenerator.ConfigRegistration var37 : configRegistrations) |
|
|
for for(SchemaGenerator.VsCodeEntry var6 : var1) |
abstract |
|
for for(int var18 = 0; var18 < var16.size() |
static |
void |
generatevoid generate(@Nullable Path var0, @Nullable Path var1) |
|
|
if if(var3) |
|
|
if if(var0 != null) |
|
|
if if(var1 != null) |
|
|
if if(var12 instanceof AssetCodecMapCodec) |
|
|
if if(var15 != null) |
|
|
if if(var0) |
static |
void |
registerAssetSchemavoid registerAssetSchema(@Nonnull String var0, @Nonnull Function<SchemaContext, Schema> var1, @Nullable List<String> var2, @Nullable String var3) |
static |
void |
registerConfigvoid registerConfig(@Nonnull String var0, @Nonnull BuilderCodec<?> var1, @Nullable String var2, @Nullable List<String> var3) |
static |
void |
writeSchemasvoid writeSchemas(@Nonnull Map<String, Schema> var0, @Nonnull Path var1) |
abstract |
|
writeSchemas writeSchemas(var5, var4) |
abstract |
|
writeSchemas writeSchemas(var10, var8) |
abstract |
|
writeSchemas writeSchemas(var11, var9) |
static |
void |
writeVsCodeSettingsvoid writeVsCodeSettings(@Nonnull Path var0, @Nonnull List<SchemaGenerator.VsCodeEntry> var1) |
abstract |
|
writeVsCodeSettings writeVsCodeSettings(var0, var6) |
abstract |
|
writeVsCodeSettings writeVsCodeSettings(var0, var12) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.schema;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.AssetStore;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetCodec;
class="kw">import com.hypixel.hytale.assetstore.codec.AssetCodecMapCodec;
class="kw">import com.hypixel.hytale.codec.EmptyExtraInfo;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.schema.SchemaContext;
class="kw">import com.hypixel.hytale.codec.schema.config.ObjectSchema;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.util.BsonUtil;
class="kw">import com.hypixel.hytale.sneakythrow.SneakyThrow;
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.Arrays;
class="kw">import java.util.Comparator;
class="kw">import java.util.LinkedHashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CopyOnWriteArrayList;
class="kw">import java.util.function.Function;
class="kw">import java.util.logging.Level;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.bson.BsonArray;
class="kw">import org.bson.BsonDocument;
class="kw">import org.bson.BsonInt32;
class="kw">import org.bson.BsonString;
class="kw">public class SchemaGenerator {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final List<SchemaGenerator.ConfigRegistration> configRegistrations = new CopyOnWriteArrayList<>();
class="kw">private class="kw">static class="kw">final List<SchemaGenerator.AssetSchemaRegistration> assetSchemaRegistrations = new CopyOnWriteArrayList<>();
class="kw">public SchemaGenerator() {
}
class="kw">public class="kw">static void registerConfig(@Nonnull String var0, @Nonnull BuilderCodec<?> var1, @Nullable String var2, @Nullable List<String> var3) {
configRegistrations.add(new SchemaGenerator.ConfigRegistration(var0, var1, var2, var3));
}
class="kw">public class="kw">static void registerAssetSchema(
@Nonnull String var0, @Nonnull Function<SchemaContext, Schema> var1, @Nullable List<String> var2, @Nullable String var3
) {
assetSchemaRegistrations.add(new SchemaGenerator.AssetSchemaRegistration(var0, var1, var2, var3));
}
@Nonnull
class="kw">public class="kw">static Map<String, Schema> generateAssetSchemas() {
SchemaGenerator.GenerationResult var0 = collectSchemas(false);
LinkedHashMap var1 = new LinkedHashMap<>();
var1.putAll(var0.assetSchemas());
var1.putAll(var0.customAssetSchemas());
var1.putAll(var0.sharedSchemas());
class="kw">return var1;
}
class="kw">public class="kw">static void generate(@Nullable Path var0, @Nullable Path var1) {
try {
SchemaGenerator.GenerationResult var2 = collectSchemas(var1 != null);
boolean var3 = var0 != null && var1 != null && var0.toAbsolutePath().normalize().equals(var1.toAbsolutePath().normalize());
if (var3) {
Path var4 = var0.resolve("Schema");
cleanAndCreateSchemaDir(var4);
LinkedHashMap var5 = new LinkedHashMap<>();
var5.putAll(var2.assetSchemas());
var5.putAll(var2.customAssetSchemas());
var5.putAll(var2.configSchemas());
var5.putAll(var2.sharedSchemas());
writeSchemas(var5, var4);
ArrayList var6 = new ArrayList<>();
var6.addAll(var2.assetVsCodeEntries());
var6.addAll(var2.customAssetVsCodeEntries());
var6.addAll(var2.configVsCodeEntries());
writeVsCodeSettings(var0, var6);
} else {
if (var0 != null) {
Path var8 = var0.resolve("Schema");
cleanAndCreateSchemaDir(var8);
LinkedHashMap var10 = new LinkedHashMap<>();
var10.putAll(var2.assetSchemas());
var10.putAll(var2.customAssetSchemas());
var10.putAll(var2.sharedSchemas());
writeSchemas(var10, var8);
ArrayList var12 = new ArrayList<>();
var12.addAll(var2.assetVsCodeEntries());
var12.addAll(var2.customAssetVsCodeEntries());
writeVsCodeSettings(var0, var12);
}
if (var1 != null) {
Path var9 = var1.resolve("Schema");
cleanAndCreateSchemaDir(var9);
LinkedHashMap var11 = new LinkedHashMap<>();
var11.putAll(var2.configSchemas());
var11.putAll(var2.sharedSchemas());
writeSchemas(var11, var9);
writeVsCodeSettings(var1, var2.configVsCodeEntries());
}
}
} catch (Throwable var7) {
((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var7)).log("Schema generation failed");
throw new RuntimeException("Schema generation failed", var7);
}
}
class="kw">private class="kw">static SchemaGenerator.GenerationResult collectSchemas(boolean var0) {
SchemaContext var1 = new SchemaContext();
AssetStore[] var2 = AssetRegistry.getStoreMap().values().toArray(AssetStore[]::new);
Arrays.sort(var2, Comparator.comparing(var0x -> var0x.getAssetClass().getSimpleName()));
for (AssetStore var6 : var2) {
String var7 = var6.getAssetClass().getSimpleName();
var1.addFileReference(var7 + ".json", var6.getCodec());
}
LinkedHashMap var22 = new LinkedHashMap<>();
ArrayList var23 = new ArrayList<>();
for (AssetStore var8 : var2) {
Class var9 = var8.getAssetClass();
String var10 = var8.getPath();
String var11 = var9.getSimpleName();
AssetCodec var12 = var8.getCodec();
Schema var13 = var12.toSchema(var1);
if (var12 class="kw">instanceof AssetCodecMapCodec) {
var13.setTitle(var11);
}
var13.setId(var11 + ".json");
Schema.HytaleMetadata var14 = var13.getHytale();
var14.setPath(var10);
var14.setExtension(var8.getExtension());
Class var15 = var8.getIdProvider();
if (var15 != null) {
var14.setIdProvider(var15.getSimpleName());
}
List var16 = var8.getPreAddedAssets();
if (var16 != null && !var16.isEmpty()) {
String[] var17 = new String[var16.size()];
for (int var18 = 0; var18 < var16.size(); var18++) {
Object var19 = var16.get(var18);
Object var20 = var8.getKeyFunction().apply(var19);
var17[var18] = var20.toString();
}
var14.setInternalKeys(var17);
}
var22.put(var11 + ".json", var13);
var23.add(
new SchemaGenerator.VsCodeEntry(
var11 + ".json",
List.of("/Server/" + var10 + "/*" + var8.getExtension(), "/Server/" + var10 + "/**/*" + var8.getExtension()),
var8.getExtension()
)
);
}
LinkedHashMap var25 = new LinkedHashMap<>();
ArrayList var27 = new ArrayList<>();
for (SchemaGenerator.AssetSchemaRegistration var31 : assetSchemaRegistrations) {
Schema var33 = var31.factory().apply(var1);
var25.put(var31.fileName(), var33);
if (var31.fileMatchPatterns() != null && !var31.fileMatchPatterns().isEmpty()) {
String var36 = var31.extension() != null ? var31.extension() : ".json";
var27.add(new SchemaGenerator.VsCodeEntry(var31.fileName(), var31.fileMatchPatterns().stream().map(var0x -> "/Server/" + var0x).toList(), var36));
}
}
LinkedHashMap var30 = new LinkedHashMap<>();
ArrayList var32 = new ArrayList<>();
if (var0) {
for (SchemaGenerator.ConfigRegistration var37 : configRegistrations) {
try {
ObjectSchema var39 = var37.codec().toSchema(var1);
var39.setTitle(var37.name());
String var41 = toFileName(var37.name());
var39.setId(var41);
Schema.HytaleMetadata var42 = var39.getHytale();
if (var37.virtualPath() != null) {
var42.setVirtualPath(var37.virtualPath());
}
var30.put(var41, var39);
if (var37.fileMatchPatterns() != null && !var37.fileMatchPatterns().isEmpty()) {
var32.add(new SchemaGenerator.VsCodeEntry(var41, var37.fileMatchPatterns(), null));
}
} catch (Throwable var21) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var21)).log("Failed to generate config schema for '%s', skipping", var37.name());
}
}
}
LinkedHashMap var35 = new LinkedHashMap<>();
Schema var38 = new Schema();
var38.setDefinitions(var1.getDefinitions());
var38.setId("common.json");
var35.put("common.json", var38);
Schema var40 = new Schema();
var40.setDefinitions(var1.getOtherDefinitions());
var40.setId("other.json");
var35.put("other.json", var40);
class="kw">return new SchemaGenerator.GenerationResult(var22, var25, var30, var35, var23, var27, var32);
}
class="kw">private class="kw">static void cleanAndCreateSchemaDir(@Nonnull Path var0) {
try {
Files.createDirectories(var0);
try (Stream var1 = Files.walk(var0, 1)) {
var1.filter(var0x -> var0x.toString().endsWith(".json")).forEach(SneakyThrow.sneakyConsumer(Files::delete));
}
} catch (Exception var6) {
throw new RuntimeException("Failed to prepare schema directory: " + var0, var6);
}
}
class="kw">private class="kw">static void writeVsCodeSettings(@Nonnull Path var0, @Nonnull List<SchemaGenerator.VsCodeEntry> var1) {
try {
BsonDocument var2 = new BsonDocument();
BsonArray var3 = new BsonArray();
BsonDocument var4 = new BsonDocument();
var2.put("json.schemas", var3);
var2.put("files.associations", var4);
var2.put("editor.tabSize", new BsonInt32(2));
for (SchemaGenerator.VsCodeEntry var6 : var1) {
addVsCodeSchemaLink(var2, var6.schemaFileName(), var6.fileMatchPatterns(), var6.extension());
}
Files.createDirectories(var0.resolve(".vscode"));
BsonUtil.writeDocument(var0.resolve(".vscode/settings.json"), var2, false).join();
} catch (Exception var7) {
throw new RuntimeException("Failed to write .vscode/settings.json", var7);
}
}
@Nonnull
class="kw">public class="kw">static String toFileName(@Nonnull String var0) {
class="kw">return var0.replace(':', '.') + ".json";
}
class="kw">public class="kw">static void writeSchemas(@Nonnull Map<String, Schema> var0, @Nonnull Path var1) {
for (Entry var3 : var0.entrySet()) {
BsonUtil.writeDocument(var1.resolve(var3.getKey()), Schema.CODEC.encode(var3.getValue(), EmptyExtraInfo.EMPTY).asDocument(), false).join();
}
}
class="kw">public class="kw">static void addVsCodeSchemaLink(@Nonnull BsonDocument var0, @Nonnull String var1, @Nonnull List<String> var2, @Nullable String var3) {
BsonDocument var4 = new BsonDocument();
var4.put("fileMatch", new BsonArray(var2.stream().map(BsonString::new).toList()));
var4.put("url", new BsonString("./Schema/" + var1));
var0.getArray("json.schemas").add(var4);
if (var3 != null && !var3.equals(".json")) {
var0.getDocument("files.associations").put("*" + var3, new BsonString("json"));
}
}
class="kw">private record AssetSchemaRegistration(
@Nonnull String fileName, @Nonnull Function<SchemaContext, Schema> factory, @Nullable List<String> fileMatchPatterns, @Nullable String extension
) {
class="kw">private AssetSchemaRegistration {
}
}
class="kw">private record ConfigRegistration(
@Nonnull String name, @Nonnull BuilderCodec<?> codec, @Nullable String virtualPath, @Nullable List<String> fileMatchPatterns
) {
class="kw">private ConfigRegistration {
}
}
class="kw">private record GenerationResult(
LinkedHashMap<String, Schema> assetSchemas,
LinkedHashMap<String, Schema> customAssetSchemas,
LinkedHashMap<String, Schema> configSchemas,
LinkedHashMap<String, Schema> sharedSchemas,
List<SchemaGenerator.VsCodeEntry> assetVsCodeEntries,
List<SchemaGenerator.VsCodeEntry> customAssetVsCodeEntries,
List<SchemaGenerator.VsCodeEntry> configVsCodeEntries
) {
class="kw">private GenerationResult {
}
}
class="kw">private record VsCodeEntry(String schemaFileName, List<String> fileMatchPatterns, @Nullable String extension) {
class="kw">private VsCodeEntry {
}
}
}