1061 lines
43 KiB
Java
1061 lines
43 KiB
Java
package com.hypixel.hytale.codec.schema.config;
|
|
|
|
import com.hypixel.hytale.codec.Codec;
|
|
import com.hypixel.hytale.codec.ExtraInfo;
|
|
import com.hypixel.hytale.codec.KeyedCodec;
|
|
import com.hypixel.hytale.codec.builder.BuilderCodec;
|
|
import com.hypixel.hytale.codec.codecs.EnumCodec;
|
|
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
|
|
import com.hypixel.hytale.codec.codecs.map.MapCodec;
|
|
import com.hypixel.hytale.codec.lookup.ObjectCodecMapCodec;
|
|
import com.hypixel.hytale.codec.lookup.Priority;
|
|
import com.hypixel.hytale.codec.schema.SchemaContext;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIButton;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIDisplayMode;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIEditor;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIEditorFeatures;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIEditorPreview;
|
|
import com.hypixel.hytale.codec.schema.metadata.ui.UIRebuildCaches;
|
|
import com.hypixel.hytale.codec.util.Documentation;
|
|
import java.util.Arrays;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import javax.annotation.Nonnull;
|
|
import javax.annotation.Nullable;
|
|
import org.bson.BsonArray;
|
|
import org.bson.BsonDocument;
|
|
import org.bson.BsonNull;
|
|
import org.bson.BsonValue;
|
|
|
|
public class Schema {
|
|
public static final ObjectCodecMapCodec<String, Schema> CODEC = new ObjectCodecMapCodec<>("type", new Schema.StringOrBlank(), true, false);
|
|
public static final ArrayCodec<Schema> ARRAY_CODEC = new ArrayCodec<>(CODEC, Schema[]::new);
|
|
public static final BuilderCodec<Schema> BASE_CODEC = BuilderCodec.builder(Schema.class, Schema::new)
|
|
.addField(new KeyedCodec<>("$id", Codec.STRING, false, true), (o, i) -> o.id = i, o -> o.id)
|
|
.addField(new KeyedCodec<>("type", new Schema.ArrayOrNull(), false, true), (o, i) -> o.types = i, o -> o.types)
|
|
.addField(new KeyedCodec<>("title", Codec.STRING, false, true), (o, i) -> o.title = i, o -> o.title)
|
|
.addField(new KeyedCodec<>("description", Codec.STRING, false, true), (o, i) -> o.description = i, o -> o.description)
|
|
.addField(new KeyedCodec<>("markdownDescription", Codec.STRING, false, true), (o, i) -> o.markdownDescription = i, o -> o.markdownDescription)
|
|
.addField(new KeyedCodec<>("enumDescriptions", Codec.STRING_ARRAY, false, true), (o, i) -> o.enumDescriptions = i, o -> {
|
|
if (o.enumDescriptions == null && o.markdownEnumDescriptions != null) {
|
|
String[] enumDescriptions = new String[o.markdownEnumDescriptions.length];
|
|
|
|
for (int i = 0; i < enumDescriptions.length; i++) {
|
|
enumDescriptions[i] = Documentation.stripMarkdown(o.markdownEnumDescriptions[i]);
|
|
}
|
|
|
|
return enumDescriptions;
|
|
} else {
|
|
return o.enumDescriptions;
|
|
}
|
|
})
|
|
.addField(
|
|
new KeyedCodec<>("markdownEnumDescriptions", Codec.STRING_ARRAY, false, true),
|
|
(o, i) -> o.markdownEnumDescriptions = i,
|
|
o -> o.markdownEnumDescriptions
|
|
)
|
|
.addField(new KeyedCodec<>("anyOf", ARRAY_CODEC, false, true), (o, i) -> o.anyOf = i, o -> o.anyOf)
|
|
.addField(new KeyedCodec<>("oneOf", ARRAY_CODEC, false, true), (o, i) -> o.oneOf = i, o -> o.oneOf)
|
|
.addField(new KeyedCodec<>("allOf", ARRAY_CODEC, false, true), (o, i) -> o.allOf = i, o -> o.allOf)
|
|
.addField(new KeyedCodec<>("not", CODEC, false, true), (o, i) -> o.not = i, o -> o.not)
|
|
.addField(new KeyedCodec<>("if", CODEC, false, true), (o, i) -> o.if_ = i, o -> o.if_)
|
|
.addField(new KeyedCodec<>("then", CODEC, false, true), (o, i) -> o.then = i, o -> o.then)
|
|
.addField(new KeyedCodec<>("else", new Schema.BooleanOrSchema(), false, true), (o, i) -> o.else_ = i, o -> o.else_)
|
|
.addField(new KeyedCodec<>("required", Codec.STRING_ARRAY, false, true), (o, i) -> o.required = i, o -> o.required)
|
|
.addField(new KeyedCodec<>("default", Codec.BSON_DOCUMENT, false, true), (o, i) -> o.default_ = i, o -> o.default_)
|
|
.addField(new KeyedCodec<>("definitions", new MapCodec<>(CODEC, HashMap::new), false, true), (o, i) -> o.definitions = i, o -> o.definitions)
|
|
.addField(new KeyedCodec<>("$ref", Codec.STRING, false, true), (o, i) -> o.ref = i, o -> o.ref)
|
|
.addField(new KeyedCodec<>("$data", Codec.STRING, false, true), (o, i) -> o.data = i, o -> o.data)
|
|
.addField(new KeyedCodec<>("doNotSuggest", Codec.BOOLEAN, false, true), (o, i) -> o.doNotSuggest = i, o -> o.doNotSuggest)
|
|
.addField(new KeyedCodec<>("hytaleAssetRef", Codec.STRING, false, true), (o, i) -> o.hytaleAssetRef = i, o -> o.hytaleAssetRef)
|
|
.addField(new KeyedCodec<>("hytaleCustomAssetRef", Codec.STRING, false, true), (o, i) -> o.hytaleCustomAssetRef = i, o -> o.hytaleCustomAssetRef)
|
|
.addField(new KeyedCodec<>("hytaleParent", Schema.InheritSettings.CODEC, false, true), (o, i) -> o.hytaleParent = i, o -> o.hytaleParent)
|
|
.addField(
|
|
new KeyedCodec<>("hytaleSchemaTypeField", Schema.SchemaTypeField.CODEC, false, true),
|
|
(o, i) -> o.hytaleSchemaTypeField = i,
|
|
o -> o.hytaleSchemaTypeField
|
|
)
|
|
.addField(new KeyedCodec<>("hytale", Schema.HytaleMetadata.CODEC, false, true), (o, i) -> {
|
|
if (i.type == null) {
|
|
i.type = CODEC.getIdFor((Class<? extends Schema>)o.getClass());
|
|
}
|
|
|
|
o.hytale = i;
|
|
}, o -> o.hytale)
|
|
.build();
|
|
private String id;
|
|
private String[] types;
|
|
private String title;
|
|
private String description;
|
|
private String markdownDescription;
|
|
private Schema[] anyOf;
|
|
private Schema[] oneOf;
|
|
private Schema[] allOf;
|
|
private Schema not;
|
|
private String[] required;
|
|
private String[] enumDescriptions;
|
|
private String[] markdownEnumDescriptions;
|
|
private Map<String, Schema> definitions;
|
|
private String ref;
|
|
private String data;
|
|
private BsonDocument default_;
|
|
private Schema if_;
|
|
private Schema then;
|
|
private Object else_;
|
|
private Schema.HytaleMetadata hytale;
|
|
private Schema.InheritSettings hytaleParent;
|
|
private Schema.SchemaTypeField hytaleSchemaTypeField;
|
|
private String hytaleAssetRef;
|
|
private String hytaleCustomAssetRef;
|
|
private Boolean doNotSuggest;
|
|
|
|
public Schema() {
|
|
String id = CODEC.getIdFor((Class<? extends Schema>)this.getClass());
|
|
if (id != null && !id.isBlank()) {
|
|
this.hytale = new Schema.HytaleMetadata(id);
|
|
}
|
|
}
|
|
|
|
public String getId() {
|
|
return this.id;
|
|
}
|
|
|
|
public void setId(String id) {
|
|
this.id = id;
|
|
}
|
|
|
|
public String[] getTypes() {
|
|
return this.types;
|
|
}
|
|
|
|
public void setTypes(String[] types) {
|
|
this.types = types;
|
|
}
|
|
|
|
public String getTitle() {
|
|
return this.title;
|
|
}
|
|
|
|
public void setTitle(String title) {
|
|
this.title = title;
|
|
}
|
|
|
|
public String getDescription() {
|
|
return this.description;
|
|
}
|
|
|
|
public void setDescription(String description) {
|
|
this.description = description;
|
|
}
|
|
|
|
public String getMarkdownDescription() {
|
|
return this.markdownDescription;
|
|
}
|
|
|
|
public void setMarkdownDescription(String markdownDescription) {
|
|
this.markdownDescription = markdownDescription;
|
|
}
|
|
|
|
public String[] getEnumDescriptions() {
|
|
return this.enumDescriptions;
|
|
}
|
|
|
|
public void setEnumDescriptions(String[] enumDescriptions) {
|
|
this.enumDescriptions = enumDescriptions;
|
|
}
|
|
|
|
public String[] getMarkdownEnumDescriptions() {
|
|
return this.markdownEnumDescriptions;
|
|
}
|
|
|
|
public void setMarkdownEnumDescriptions(String[] markdownEnumDescriptions) {
|
|
this.markdownEnumDescriptions = markdownEnumDescriptions;
|
|
}
|
|
|
|
public Schema[] getAnyOf() {
|
|
return this.anyOf;
|
|
}
|
|
|
|
public void setAnyOf(Schema... anyOf) {
|
|
this.anyOf = anyOf;
|
|
}
|
|
|
|
public Schema[] getOneOf() {
|
|
return this.oneOf;
|
|
}
|
|
|
|
public void setOneOf(Schema... oneOf) {
|
|
this.oneOf = oneOf;
|
|
}
|
|
|
|
public Schema[] getAllOf() {
|
|
return this.allOf;
|
|
}
|
|
|
|
public void setAllOf(Schema... allOf) {
|
|
this.allOf = allOf;
|
|
}
|
|
|
|
public String[] getRequired() {
|
|
return this.required;
|
|
}
|
|
|
|
public void setRequired(String... required) {
|
|
this.required = required;
|
|
}
|
|
|
|
public BsonDocument getDefaultRaw() {
|
|
return this.default_;
|
|
}
|
|
|
|
public void setDefaultRaw(BsonDocument default_) {
|
|
this.default_ = default_;
|
|
}
|
|
|
|
public Map<String, Schema> getDefinitions() {
|
|
return this.definitions;
|
|
}
|
|
|
|
public void setDefinitions(Map<String, Schema> definitions) {
|
|
this.definitions = definitions;
|
|
}
|
|
|
|
public String getRef() {
|
|
return this.ref;
|
|
}
|
|
|
|
public void setRef(String ref) {
|
|
this.ref = ref;
|
|
}
|
|
|
|
public String getData() {
|
|
return this.data;
|
|
}
|
|
|
|
public void setData(String data) {
|
|
this.data = data;
|
|
}
|
|
|
|
public Schema getIf() {
|
|
return this.if_;
|
|
}
|
|
|
|
public void setIf(Schema if_) {
|
|
this.if_ = if_;
|
|
}
|
|
|
|
public Schema getThen() {
|
|
return this.then;
|
|
}
|
|
|
|
public void setThen(Schema then) {
|
|
this.then = then;
|
|
}
|
|
|
|
public Schema getElse() {
|
|
return (Schema)this.else_;
|
|
}
|
|
|
|
public void setElse(Schema else_) {
|
|
this.else_ = else_;
|
|
}
|
|
|
|
public void setElse(boolean else_) {
|
|
this.else_ = else_;
|
|
}
|
|
|
|
public Boolean isDoNotSuggest() {
|
|
return this.doNotSuggest;
|
|
}
|
|
|
|
public void setDoNotSuggest(boolean doNotSuggest) {
|
|
this.doNotSuggest = doNotSuggest;
|
|
}
|
|
|
|
@Nullable
|
|
public Schema.HytaleMetadata getHytale() {
|
|
return this.getHytale(true);
|
|
}
|
|
|
|
@Nullable
|
|
public Schema.HytaleMetadata getHytale(boolean createInstance) {
|
|
if (createInstance && this.hytale == null) {
|
|
this.hytale = new Schema.HytaleMetadata();
|
|
this.hytale.type = CODEC.getIdFor((Class<? extends Schema>)this.getClass());
|
|
}
|
|
|
|
return this.hytale;
|
|
}
|
|
|
|
public String getHytaleAssetRef() {
|
|
return this.hytaleAssetRef;
|
|
}
|
|
|
|
public void setHytaleAssetRef(String hytaleAssetRef) {
|
|
this.hytaleAssetRef = hytaleAssetRef;
|
|
}
|
|
|
|
public Schema.InheritSettings getHytaleParent() {
|
|
return this.hytaleParent;
|
|
}
|
|
|
|
public void setHytaleParent(Schema.InheritSettings hytaleParent) {
|
|
this.hytaleParent = hytaleParent;
|
|
}
|
|
|
|
public Schema.SchemaTypeField getHytaleSchemaTypeField() {
|
|
return this.hytaleSchemaTypeField;
|
|
}
|
|
|
|
public void setHytaleSchemaTypeField(Schema.SchemaTypeField hytaleSchemaTypeField) {
|
|
this.hytaleSchemaTypeField = hytaleSchemaTypeField;
|
|
}
|
|
|
|
public String getHytaleCustomAssetRef() {
|
|
return this.hytaleCustomAssetRef;
|
|
}
|
|
|
|
public void setHytaleCustomAssetRef(String hytaleCustomAssetRef) {
|
|
this.hytaleCustomAssetRef = hytaleCustomAssetRef;
|
|
}
|
|
|
|
@Nonnull
|
|
public static Schema ref(String file) {
|
|
Schema s = new Schema();
|
|
s.setRef(file);
|
|
return s;
|
|
}
|
|
|
|
@Nonnull
|
|
public static Schema data(String file) {
|
|
Schema s = new Schema();
|
|
s.setData(file);
|
|
return s;
|
|
}
|
|
|
|
@Nonnull
|
|
public static Schema anyOf(Schema... anyOf) {
|
|
Schema s = new Schema();
|
|
s.anyOf = anyOf;
|
|
return s;
|
|
}
|
|
|
|
@Nonnull
|
|
public static Schema not(Schema not) {
|
|
Schema s = new Schema();
|
|
s.not = not;
|
|
return s;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(@Nullable Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
} else if (o != null && this.getClass() == o.getClass()) {
|
|
Schema schema = (Schema)o;
|
|
if (this.id != null ? this.id.equals(schema.id) : schema.id == null) {
|
|
if (!Arrays.equals((Object[])this.types, (Object[])schema.types)) {
|
|
return false;
|
|
} else if (this.title != null ? this.title.equals(schema.title) : schema.title == null) {
|
|
if (this.description != null ? this.description.equals(schema.description) : schema.description == null) {
|
|
if (this.markdownDescription != null ? this.markdownDescription.equals(schema.markdownDescription) : schema.markdownDescription == null) {
|
|
if (!Arrays.equals((Object[])this.anyOf, (Object[])schema.anyOf)) {
|
|
return false;
|
|
} else if (!Arrays.equals((Object[])this.oneOf, (Object[])schema.oneOf)) {
|
|
return false;
|
|
} else if (!Arrays.equals((Object[])this.allOf, (Object[])schema.allOf)) {
|
|
return false;
|
|
} else if (this.not != null ? this.not.equals(schema.not) : schema.not == null) {
|
|
if (!Arrays.equals((Object[])this.required, (Object[])schema.required)) {
|
|
return false;
|
|
} else if (!Arrays.equals((Object[])this.enumDescriptions, (Object[])schema.enumDescriptions)) {
|
|
return false;
|
|
} else if (!Arrays.equals((Object[])this.markdownEnumDescriptions, (Object[])schema.markdownEnumDescriptions)) {
|
|
return false;
|
|
} else if (this.definitions != null ? this.definitions.equals(schema.definitions) : schema.definitions == null) {
|
|
if (this.ref != null ? this.ref.equals(schema.ref) : schema.ref == null) {
|
|
if (this.data != null ? this.data.equals(schema.data) : schema.data == null) {
|
|
if (this.default_ != null ? this.default_.equals(schema.default_) : schema.default_ == null) {
|
|
if (this.hytale != null ? this.hytale.equals(schema.hytale) : schema.hytale == null) {
|
|
if (this.hytaleParent != null ? this.hytaleParent.equals(schema.hytaleParent) : schema.hytaleParent == null) {
|
|
if (this.hytaleSchemaTypeField != null
|
|
? this.hytaleSchemaTypeField.equals(schema.hytaleSchemaTypeField)
|
|
: schema.hytaleSchemaTypeField == null) {
|
|
if (this.hytaleAssetRef != null
|
|
? this.hytaleAssetRef.equals(schema.hytaleAssetRef)
|
|
: schema.hytaleAssetRef == null) {
|
|
return this.hytaleCustomAssetRef != null
|
|
? this.hytaleCustomAssetRef.equals(schema.hytaleCustomAssetRef)
|
|
: schema.hytaleCustomAssetRef == null;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int result = this.id != null ? this.id.hashCode() : 0;
|
|
result = 31 * result + Arrays.hashCode((Object[])this.types);
|
|
result = 31 * result + (this.title != null ? this.title.hashCode() : 0);
|
|
result = 31 * result + (this.description != null ? this.description.hashCode() : 0);
|
|
result = 31 * result + (this.markdownDescription != null ? this.markdownDescription.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.anyOf);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.oneOf);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.allOf);
|
|
result = 31 * result + (this.not != null ? this.not.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.required);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.enumDescriptions);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.markdownEnumDescriptions);
|
|
result = 31 * result + (this.definitions != null ? this.definitions.hashCode() : 0);
|
|
result = 31 * result + (this.ref != null ? this.ref.hashCode() : 0);
|
|
result = 31 * result + (this.data != null ? this.data.hashCode() : 0);
|
|
result = 31 * result + (this.default_ != null ? this.default_.hashCode() : 0);
|
|
result = 31 * result + (this.hytale != null ? this.hytale.hashCode() : 0);
|
|
result = 31 * result + (this.hytaleParent != null ? this.hytaleParent.hashCode() : 0);
|
|
result = 31 * result + (this.hytaleSchemaTypeField != null ? this.hytaleSchemaTypeField.hashCode() : 0);
|
|
result = 31 * result + (this.hytaleAssetRef != null ? this.hytaleAssetRef.hashCode() : 0);
|
|
return 31 * result + (this.hytaleCustomAssetRef != null ? this.hytaleCustomAssetRef.hashCode() : 0);
|
|
}
|
|
|
|
public static void init() {
|
|
CODEC.register(Priority.DEFAULT, "", Schema.class, BASE_CODEC);
|
|
CODEC.register("null", NullSchema.class, NullSchema.CODEC);
|
|
CODEC.register("string", StringSchema.class, StringSchema.CODEC);
|
|
CODEC.register("number", NumberSchema.class, NumberSchema.CODEC);
|
|
CODEC.register("integer", IntegerSchema.class, IntegerSchema.CODEC);
|
|
CODEC.register("array", ArraySchema.class, ArraySchema.CODEC);
|
|
CODEC.register("boolean", BooleanSchema.class, BooleanSchema.CODEC);
|
|
CODEC.register("object", ObjectSchema.class, ObjectSchema.CODEC);
|
|
UIEditor.init();
|
|
}
|
|
|
|
@Deprecated
|
|
private static class ArrayOrNull implements Codec<String[]> {
|
|
@Nullable
|
|
public String[] decode(@Nonnull BsonValue bsonValue, @Nonnull ExtraInfo extraInfo) {
|
|
return bsonValue.isArray() ? Codec.STRING_ARRAY.decode(bsonValue, extraInfo) : null;
|
|
}
|
|
|
|
@Nonnull
|
|
public BsonValue encode(@Nullable String[] o, ExtraInfo extraInfo) {
|
|
return (BsonValue)(o != null ? Codec.STRING_ARRAY.encode(o, extraInfo) : new BsonNull());
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public Schema toSchema(@Nonnull SchemaContext context) {
|
|
return Schema.anyOf(new ArraySchema(), new NullSchema());
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
protected static class BooleanOrSchema implements Codec<Object> {
|
|
@Override
|
|
public Object decode(@Nonnull BsonValue bsonValue, ExtraInfo extraInfo) {
|
|
return bsonValue.isBoolean() ? Codec.BOOLEAN.decode(bsonValue, extraInfo) : Schema.CODEC.decode(bsonValue, extraInfo);
|
|
}
|
|
|
|
@Override
|
|
public BsonValue encode(Object o, ExtraInfo extraInfo) {
|
|
return o instanceof Boolean ? Codec.BOOLEAN.encode((Boolean)o, extraInfo) : Schema.CODEC.encode((Schema)o, extraInfo);
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public Schema toSchema(@Nonnull SchemaContext context) {
|
|
return Schema.anyOf(new BooleanSchema(), Schema.CODEC.toSchema(context));
|
|
}
|
|
}
|
|
|
|
public static class HytaleMetadata {
|
|
public static final BuilderCodec<Schema.HytaleMetadata> CODEC = BuilderCodec.builder(Schema.HytaleMetadata.class, Schema.HytaleMetadata::new)
|
|
.addField(new KeyedCodec<>("type", Codec.STRING, false, true), (o, i) -> o.type = i, o -> o.type != null && o.type.isEmpty() ? null : o.type)
|
|
.addField(new KeyedCodec<>("internalKeys", Codec.STRING_ARRAY, false, true), (o, i) -> o.internalKeys = i, o -> o.internalKeys)
|
|
.addField(new KeyedCodec<>("path", Codec.STRING, false, true), (o, i) -> o.path = i, o -> o.path)
|
|
.addField(new KeyedCodec<>("virtualPath", Codec.STRING, false, true), (o, i) -> o.virtualPath = i, o -> o.virtualPath)
|
|
.addField(new KeyedCodec<>("extension", Codec.STRING, false, true), (o, i) -> o.extension = i, o -> o.extension)
|
|
.addField(new KeyedCodec<>("idProvider", Codec.STRING, false, true), (o, i) -> o.idProvider = i, o -> o.idProvider)
|
|
.addField(new KeyedCodec<>("inheritsProperty", Codec.BOOLEAN, false, true), (o, i) -> o.inheritsProperty = i, o -> o.inheritsProperty)
|
|
.addField(new KeyedCodec<>("mergesProperties", Codec.BOOLEAN, false, true), (o, i) -> o.mergesProperties = i, o -> o.mergesProperties)
|
|
.addField(
|
|
new KeyedCodec<>("uiDisplayMode", new EnumCodec<>(UIDisplayMode.DisplayMode.class), false, true),
|
|
(o, i) -> o.uiDisplayMode = i,
|
|
o -> o.uiDisplayMode
|
|
)
|
|
.addField(new KeyedCodec<>("uiEditorComponent", UIEditor.CODEC, false, true), (o, i) -> o.uiEditorComponent = i, o -> o.uiEditorComponent)
|
|
.addField(new KeyedCodec<>("allowEmptyObject", Codec.BOOLEAN, false, true), (o, i) -> o.allowEmptyObject = i, o -> o.allowEmptyObject)
|
|
.addField(new KeyedCodec<>("uiEditorIgnore", Codec.BOOLEAN, false, true), (o, i) -> o.uiEditorIgnore = i, o -> o.uiEditorIgnore)
|
|
.addField(
|
|
new KeyedCodec<>(
|
|
"uiEditorFeatures", new ArrayCodec<>(new EnumCodec<>(UIEditorFeatures.EditorFeature.class), UIEditorFeatures.EditorFeature[]::new), false, true
|
|
),
|
|
(o, i) -> o.uiEditorFeatures = i,
|
|
o -> o.uiEditorFeatures
|
|
)
|
|
.addField(
|
|
new KeyedCodec<>("uiEditorPreview", new EnumCodec<>(UIEditorPreview.PreviewType.class), false, true),
|
|
(o, i) -> o.uiEditorPreview = i,
|
|
o -> o.uiEditorPreview
|
|
)
|
|
.addField(new KeyedCodec<>("uiTypeIcon", Codec.STRING, false, true), (o, i) -> o.uiTypeIcon = i, o -> o.uiTypeIcon)
|
|
.addField(new KeyedCodec<>("uiPropertyTitle", Codec.STRING, false, true), (o, i) -> o.uiPropertyTitle = i, o -> o.uiPropertyTitle)
|
|
.addField(new KeyedCodec<>("uiSectionStart", Codec.STRING, false, true), (o, i) -> o.uiSectionStart = i, o -> o.uiSectionStart)
|
|
.addField(
|
|
new KeyedCodec<>(
|
|
"uiRebuildCaches", new ArrayCodec<>(new EnumCodec<>(UIRebuildCaches.ClientCache.class), UIRebuildCaches.ClientCache[]::new), false, true
|
|
),
|
|
(o, i) -> o.uiRebuildCaches = i,
|
|
o -> o.uiRebuildCaches
|
|
)
|
|
.addField(
|
|
new KeyedCodec<>("uiSidebarButtons", new ArrayCodec<>(UIButton.CODEC, UIButton[]::new), false, true),
|
|
(o, i) -> o.uiSidebarButtons = i,
|
|
o -> o.uiSidebarButtons
|
|
)
|
|
.addField(
|
|
new KeyedCodec<>("uiRebuildCachesForChildProperties", Codec.BOOLEAN, false, true),
|
|
(o, i) -> o.uiRebuildCachesForChildProperties = i,
|
|
o -> o.uiRebuildCachesForChildProperties
|
|
)
|
|
.addField(new KeyedCodec<>("uiCollapsedByDefault", Codec.BOOLEAN, false, true), (o, i) -> o.uiCollapsedByDefault = i, o -> o.uiCollapsedByDefault)
|
|
.addField(
|
|
new KeyedCodec<>("uiCreateButtons", new ArrayCodec<>(UIButton.CODEC, UIButton[]::new), false, true),
|
|
(o, i) -> o.uiCreateButtons = i,
|
|
o -> o.uiCreateButtons
|
|
)
|
|
.build();
|
|
private String type;
|
|
private String path;
|
|
private String virtualPath;
|
|
private String extension;
|
|
private String idProvider;
|
|
private String[] internalKeys;
|
|
private Boolean inheritsProperty;
|
|
private Boolean mergesProperties;
|
|
private UIEditorFeatures.EditorFeature[] uiEditorFeatures;
|
|
private UIEditorPreview.PreviewType uiEditorPreview;
|
|
private String uiTypeIcon;
|
|
private Boolean uiEditorIgnore;
|
|
private Boolean allowEmptyObject;
|
|
private UIDisplayMode.DisplayMode uiDisplayMode;
|
|
private UIEditor.EditorComponent uiEditorComponent;
|
|
private String uiPropertyTitle;
|
|
private String uiSectionStart;
|
|
private UIRebuildCaches.ClientCache[] uiRebuildCaches;
|
|
private Boolean uiRebuildCachesForChildProperties;
|
|
private UIButton[] uiSidebarButtons;
|
|
private Boolean uiCollapsedByDefault;
|
|
private UIButton[] uiCreateButtons;
|
|
|
|
public HytaleMetadata(String type) {
|
|
this.type = type;
|
|
}
|
|
|
|
public HytaleMetadata() {
|
|
}
|
|
|
|
public String getType() {
|
|
return this.type;
|
|
}
|
|
|
|
public void setType(String type) {
|
|
this.type = type;
|
|
}
|
|
|
|
public String getPath() {
|
|
return this.path;
|
|
}
|
|
|
|
public void setPath(String path) {
|
|
this.path = path;
|
|
}
|
|
|
|
public String getVirtualPath() {
|
|
return this.virtualPath;
|
|
}
|
|
|
|
public void setVirtualPath(String virtualPath) {
|
|
this.virtualPath = virtualPath;
|
|
}
|
|
|
|
public String getExtension() {
|
|
return this.extension;
|
|
}
|
|
|
|
public void setExtension(String extension) {
|
|
this.extension = extension;
|
|
}
|
|
|
|
public String getIdProvider() {
|
|
return this.idProvider;
|
|
}
|
|
|
|
public void setIdProvider(String idProvider) {
|
|
this.idProvider = idProvider;
|
|
}
|
|
|
|
public String[] getInternalKeys() {
|
|
return this.internalKeys;
|
|
}
|
|
|
|
public void setInternalKeys(String[] internalKeys) {
|
|
this.internalKeys = internalKeys;
|
|
}
|
|
|
|
public UIDisplayMode.DisplayMode getUiDisplayMode() {
|
|
return this.uiDisplayMode;
|
|
}
|
|
|
|
public void setUiDisplayMode(UIDisplayMode.DisplayMode uiDisplayMode) {
|
|
this.uiDisplayMode = uiDisplayMode;
|
|
}
|
|
|
|
public UIEditor.EditorComponent getUiEditorComponent() {
|
|
return this.uiEditorComponent;
|
|
}
|
|
|
|
public void setUiEditorComponent(UIEditor.EditorComponent uiEditorComponent) {
|
|
this.uiEditorComponent = uiEditorComponent;
|
|
}
|
|
|
|
public UIEditorFeatures.EditorFeature[] getUiEditorFeatures() {
|
|
return this.uiEditorFeatures;
|
|
}
|
|
|
|
public void setUiEditorFeatures(UIEditorFeatures.EditorFeature[] uiEditorFeatures) {
|
|
this.uiEditorFeatures = uiEditorFeatures;
|
|
}
|
|
|
|
public UIEditorPreview.PreviewType getUiEditorPreview() {
|
|
return this.uiEditorPreview;
|
|
}
|
|
|
|
public void setUiEditorPreview(UIEditorPreview.PreviewType uiEditorPreview) {
|
|
this.uiEditorPreview = uiEditorPreview;
|
|
}
|
|
|
|
public String getUiTypeIcon() {
|
|
return this.uiTypeIcon;
|
|
}
|
|
|
|
public void setUiTypeIcon(String uiTypeIcon) {
|
|
this.uiTypeIcon = uiTypeIcon;
|
|
}
|
|
|
|
public Boolean getUiEditorIgnore() {
|
|
return this.uiEditorIgnore;
|
|
}
|
|
|
|
public void setUiEditorIgnore(Boolean uiEditorIgnore) {
|
|
this.uiEditorIgnore = uiEditorIgnore;
|
|
}
|
|
|
|
public Boolean getAllowEmptyObject() {
|
|
return this.allowEmptyObject;
|
|
}
|
|
|
|
public void setAllowEmptyObject(Boolean allowEmptyObject) {
|
|
this.allowEmptyObject = allowEmptyObject;
|
|
}
|
|
|
|
public String getUiPropertyTitle() {
|
|
return this.uiPropertyTitle;
|
|
}
|
|
|
|
public void setUiPropertyTitle(String uiPropertyTitle) {
|
|
this.uiPropertyTitle = uiPropertyTitle;
|
|
}
|
|
|
|
public String getUiSectionStart() {
|
|
return this.uiSectionStart;
|
|
}
|
|
|
|
public void setUiSectionStart(String uiSectionStart) {
|
|
this.uiSectionStart = uiSectionStart;
|
|
}
|
|
|
|
public boolean isInheritsProperty() {
|
|
return this.inheritsProperty;
|
|
}
|
|
|
|
public void setInheritsProperty(boolean inheritsProperty) {
|
|
this.inheritsProperty = inheritsProperty;
|
|
}
|
|
|
|
public boolean getMergesProperties() {
|
|
return this.mergesProperties;
|
|
}
|
|
|
|
public void setMergesProperties(boolean mergesProperties) {
|
|
this.mergesProperties = mergesProperties;
|
|
}
|
|
|
|
public UIRebuildCaches.ClientCache[] getUiRebuildCaches() {
|
|
return this.uiRebuildCaches;
|
|
}
|
|
|
|
public void setUiRebuildCaches(UIRebuildCaches.ClientCache[] uiRebuildCaches) {
|
|
this.uiRebuildCaches = uiRebuildCaches;
|
|
}
|
|
|
|
public Boolean getUiRebuildCachesForChildProperties() {
|
|
return this.uiRebuildCachesForChildProperties;
|
|
}
|
|
|
|
public void setUiRebuildCachesForChildProperties(Boolean uiRebuildCachesForChildProperties) {
|
|
this.uiRebuildCachesForChildProperties = uiRebuildCachesForChildProperties;
|
|
}
|
|
|
|
public UIButton[] getUiSidebarButtons() {
|
|
return this.uiSidebarButtons;
|
|
}
|
|
|
|
public void setUiSidebarButtons(UIButton[] uiSidebarButtons) {
|
|
this.uiSidebarButtons = uiSidebarButtons;
|
|
}
|
|
|
|
public Boolean getUiCollapsedByDefault() {
|
|
return this.uiCollapsedByDefault;
|
|
}
|
|
|
|
public void setUiCollapsedByDefault(Boolean uiCollapsedByDefault) {
|
|
this.uiCollapsedByDefault = uiCollapsedByDefault;
|
|
}
|
|
|
|
public UIButton[] getUiCreateButtons() {
|
|
return this.uiCreateButtons;
|
|
}
|
|
|
|
public void setUiCreateButtons(UIButton[] uiCreateButtons) {
|
|
this.uiCreateButtons = uiCreateButtons;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(@Nullable Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
} else if (o != null && this.getClass() == o.getClass()) {
|
|
Schema.HytaleMetadata that = (Schema.HytaleMetadata)o;
|
|
if (this.type != null ? this.type.equals(that.type) : that.type == null) {
|
|
if (this.path != null ? this.path.equals(that.path) : that.path == null) {
|
|
if (this.virtualPath != null ? this.virtualPath.equals(that.virtualPath) : that.virtualPath == null) {
|
|
if (this.extension != null ? this.extension.equals(that.extension) : that.extension == null) {
|
|
if (this.idProvider != null ? this.idProvider.equals(that.idProvider) : that.idProvider == null) {
|
|
if (!Arrays.equals((Object[])this.internalKeys, (Object[])that.internalKeys)) {
|
|
return false;
|
|
} else if (this.inheritsProperty != null ? this.inheritsProperty.equals(that.inheritsProperty) : that.inheritsProperty == null) {
|
|
if (this.mergesProperties != null ? this.mergesProperties.equals(that.mergesProperties) : that.mergesProperties == null) {
|
|
if (!Arrays.equals((Object[])this.uiEditorFeatures, (Object[])that.uiEditorFeatures)) {
|
|
return false;
|
|
} else if (this.uiEditorPreview != that.uiEditorPreview) {
|
|
return false;
|
|
} else if (this.uiTypeIcon != null ? this.uiTypeIcon.equals(that.uiTypeIcon) : that.uiTypeIcon == null) {
|
|
if (this.uiEditorIgnore != null ? this.uiEditorIgnore.equals(that.uiEditorIgnore) : that.uiEditorIgnore == null) {
|
|
if (this.allowEmptyObject != null ? this.allowEmptyObject.equals(that.allowEmptyObject) : that.allowEmptyObject == null) {
|
|
if (this.uiDisplayMode != that.uiDisplayMode) {
|
|
return false;
|
|
} else if (this.uiEditorComponent != null
|
|
? this.uiEditorComponent.equals(that.uiEditorComponent)
|
|
: that.uiEditorComponent == null) {
|
|
if (this.uiPropertyTitle != null
|
|
? this.uiPropertyTitle.equals(that.uiPropertyTitle)
|
|
: that.uiPropertyTitle == null) {
|
|
if (this.uiSectionStart != null ? this.uiSectionStart.equals(that.uiSectionStart) : that.uiSectionStart == null
|
|
)
|
|
{
|
|
if (!Arrays.equals((Object[])this.uiRebuildCaches, (Object[])that.uiRebuildCaches)) {
|
|
return false;
|
|
} else if (this.uiRebuildCachesForChildProperties != null
|
|
? this.uiRebuildCachesForChildProperties.equals(that.uiRebuildCachesForChildProperties)
|
|
: that.uiRebuildCachesForChildProperties == null) {
|
|
if (!Arrays.equals((Object[])this.uiSidebarButtons, (Object[])that.uiSidebarButtons)) {
|
|
return false;
|
|
} else {
|
|
return (
|
|
this.uiCollapsedByDefault != null
|
|
? this.uiCollapsedByDefault.equals(that.uiCollapsedByDefault)
|
|
: that.uiCollapsedByDefault == null
|
|
)
|
|
? Arrays.equals((Object[])this.uiCreateButtons, (Object[])that.uiCreateButtons)
|
|
: false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int result = this.type != null ? this.type.hashCode() : 0;
|
|
result = 31 * result + (this.path != null ? this.path.hashCode() : 0);
|
|
result = 31 * result + (this.virtualPath != null ? this.virtualPath.hashCode() : 0);
|
|
result = 31 * result + (this.extension != null ? this.extension.hashCode() : 0);
|
|
result = 31 * result + (this.idProvider != null ? this.idProvider.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.internalKeys);
|
|
result = 31 * result + (this.inheritsProperty != null ? this.inheritsProperty.hashCode() : 0);
|
|
result = 31 * result + (this.mergesProperties != null ? this.mergesProperties.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.uiEditorFeatures);
|
|
result = 31 * result + (this.uiEditorPreview != null ? this.uiEditorPreview.hashCode() : 0);
|
|
result = 31 * result + (this.uiTypeIcon != null ? this.uiTypeIcon.hashCode() : 0);
|
|
result = 31 * result + (this.uiEditorIgnore != null ? this.uiEditorIgnore.hashCode() : 0);
|
|
result = 31 * result + (this.allowEmptyObject != null ? this.allowEmptyObject.hashCode() : 0);
|
|
result = 31 * result + (this.uiDisplayMode != null ? this.uiDisplayMode.hashCode() : 0);
|
|
result = 31 * result + (this.uiEditorComponent != null ? this.uiEditorComponent.hashCode() : 0);
|
|
result = 31 * result + (this.uiPropertyTitle != null ? this.uiPropertyTitle.hashCode() : 0);
|
|
result = 31 * result + (this.uiSectionStart != null ? this.uiSectionStart.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.uiRebuildCaches);
|
|
result = 31 * result + (this.uiRebuildCachesForChildProperties != null ? this.uiRebuildCachesForChildProperties.hashCode() : 0);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.uiSidebarButtons);
|
|
result = 31 * result + (this.uiCollapsedByDefault != null ? this.uiCollapsedByDefault.hashCode() : 0);
|
|
return 31 * result + Arrays.hashCode((Object[])this.uiCreateButtons);
|
|
}
|
|
}
|
|
|
|
public static class InheritSettings {
|
|
public static final BuilderCodec<Schema.InheritSettings> CODEC = BuilderCodec.builder(Schema.InheritSettings.class, Schema.InheritSettings::new)
|
|
.addField(new KeyedCodec<>("type", Codec.STRING, false, true), (o, i) -> o.type = i, o -> o.type)
|
|
.addField(new KeyedCodec<>("mapKey", Codec.STRING, false, true), (o, i) -> o.mapKey = i, o -> o.mapKey)
|
|
.addField(new KeyedCodec<>("mapKeyValue", Codec.STRING, false, true), (o, i) -> o.mapKeyValue = i, o -> o.mapKeyValue)
|
|
.build();
|
|
private String type;
|
|
private String mapKey;
|
|
private String mapKeyValue;
|
|
|
|
public InheritSettings(String type) {
|
|
this.type = type;
|
|
}
|
|
|
|
protected InheritSettings() {
|
|
}
|
|
|
|
public String getType() {
|
|
return this.type;
|
|
}
|
|
|
|
public void setType(String type) {
|
|
this.type = type;
|
|
}
|
|
|
|
public String getMapKey() {
|
|
return this.mapKey;
|
|
}
|
|
|
|
public void setMapKey(String mapKey) {
|
|
this.mapKey = mapKey;
|
|
}
|
|
|
|
public String getMapKeyValue() {
|
|
return this.mapKeyValue;
|
|
}
|
|
|
|
public void setMapKeyValue(String mapKeyValue) {
|
|
this.mapKeyValue = mapKeyValue;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(@Nullable Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
} else if (o != null && this.getClass() == o.getClass()) {
|
|
Schema.InheritSettings that = (Schema.InheritSettings)o;
|
|
if (this.type != null ? this.type.equals(that.type) : that.type == null) {
|
|
if (this.mapKey != null ? this.mapKey.equals(that.mapKey) : that.mapKey == null) {
|
|
return this.mapKeyValue != null ? this.mapKeyValue.equals(that.mapKeyValue) : that.mapKeyValue == null;
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int result = this.type != null ? this.type.hashCode() : 0;
|
|
result = 31 * result + (this.mapKey != null ? this.mapKey.hashCode() : 0);
|
|
return 31 * result + (this.mapKeyValue != null ? this.mapKeyValue.hashCode() : 0);
|
|
}
|
|
}
|
|
|
|
public static class SchemaTypeField {
|
|
public static final BuilderCodec<Schema.SchemaTypeField> CODEC = BuilderCodec.builder(Schema.SchemaTypeField.class, Schema.SchemaTypeField::new)
|
|
.addField(new KeyedCodec<>("property", Codec.STRING, false, true), (o, i) -> o.property = i, o -> o.property)
|
|
.addField(new KeyedCodec<>("defaultValue", Codec.STRING, false, true), (o, i) -> o.defaultValue = i, o -> o.defaultValue)
|
|
.addField(new KeyedCodec<>("values", Codec.STRING_ARRAY, false, true), (o, i) -> o.values = i, o -> o.values)
|
|
.addField(new KeyedCodec<>("parentPropertyKey", Codec.STRING, false, true), (o, i) -> o.parentPropertyKey = i, o -> o.parentPropertyKey)
|
|
.build();
|
|
private String property;
|
|
private String defaultValue;
|
|
private String[] values;
|
|
private String parentPropertyKey;
|
|
|
|
public SchemaTypeField(String property, String defaultValue, String... values) {
|
|
this.property = property;
|
|
this.defaultValue = defaultValue;
|
|
this.values = values;
|
|
}
|
|
|
|
protected SchemaTypeField() {
|
|
}
|
|
|
|
public String getProperty() {
|
|
return this.property;
|
|
}
|
|
|
|
public String getDefaultValue() {
|
|
return this.defaultValue;
|
|
}
|
|
|
|
public String[] getValues() {
|
|
return this.values;
|
|
}
|
|
|
|
public String getParentPropertyKey() {
|
|
return this.parentPropertyKey;
|
|
}
|
|
|
|
public void setParentPropertyKey(String parentPropertyKey) {
|
|
this.parentPropertyKey = parentPropertyKey;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object o) {
|
|
if (o != null && this.getClass() == o.getClass()) {
|
|
Schema.SchemaTypeField that = (Schema.SchemaTypeField)o;
|
|
return Objects.equals(this.property, that.property)
|
|
&& Objects.equals(this.defaultValue, that.defaultValue)
|
|
&& Arrays.deepEquals(this.values, that.values)
|
|
&& Objects.equals(this.parentPropertyKey, that.parentPropertyKey);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
int result = Objects.hashCode(this.property);
|
|
result = 31 * result + Objects.hashCode(this.defaultValue);
|
|
result = 31 * result + Arrays.hashCode((Object[])this.values);
|
|
return 31 * result + Objects.hashCode(this.parentPropertyKey);
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
private static class StringOrBlank implements Codec<String> {
|
|
public String decode(@Nonnull BsonValue bsonValue, ExtraInfo extraInfo) {
|
|
if (bsonValue.isString()) {
|
|
return Codec.STRING.decode(bsonValue, extraInfo);
|
|
} else if (bsonValue.isArray()) {
|
|
BsonArray arr = bsonValue.asArray();
|
|
|
|
for (int i = 0; i < arr.size(); i++) {
|
|
BsonValue val = arr.get(i);
|
|
if (!val.asString().getValue().equals("null")) {
|
|
return Codec.STRING.decode(val, extraInfo);
|
|
}
|
|
}
|
|
|
|
throw new IllegalArgumentException("Unknown type (in array)");
|
|
} else {
|
|
return "";
|
|
}
|
|
}
|
|
|
|
@Nonnull
|
|
public BsonValue encode(@Nonnull String o, ExtraInfo extraInfo) {
|
|
return Codec.STRING.encode(o, extraInfo);
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public Schema toSchema(@Nonnull SchemaContext context) {
|
|
return Schema.anyOf(new ArraySchema(), new StringSchema());
|
|
}
|
|
}
|
|
}
|