From d3d1dc71a9a12e5bd56eaef863789ba299345f78 Mon Sep 17 00:00:00 2001 From: phoshp Date: Thu, 13 Jun 2024 01:09:51 +0300 Subject: [PATCH] 2 years old --- .gitignore | 4 +- .../java/com/bedrockk/packs/PackHelper.java | 32 +++++++++++++-- .../packs/annotation/JsonConverter.java | 5 ++- .../feature/OreFeatureDefinition.java | 11 ++---- .../item/EntityPlacerDefinition.java | 11 ++---- .../item/RenderOffsetsDefinition.java | 14 ------- .../item/UseDurationDefinition.java | 4 +- .../function/SetBannerDetailsFunction.java | 12 ++---- .../block/BlockDestroyTimeDescription.java | 11 ++---- .../block/BlockExplodeableDescription.java | 12 ++---- .../block/BlockFrictionDescription.java | 11 ++---- .../BlockLightAbsorptionDescription.java | 11 ++---- .../block/BlockLightEmissionDescription.java | 11 ++---- .../block/BlockLootDescription.java | 11 ++---- .../block/BlockMapColorDescription.java | 24 ++++++++---- .../packs/json/NamedTypeDeserializer.java | 15 +++---- .../packs/json/PackDeserializers.java | 6 +-- .../bedrockk/packs/json/VersionConverter.java | 22 ++++------- .../json/VersionConverterDeserializer.java | 39 +++++++++++++++---- .../com/bedrockk/packs/DeserializeTest.java | 2 +- src/test/resources/test_block.json | 6 ++- 21 files changed, 133 insertions(+), 141 deletions(-) diff --git a/.gitignore b/.gitignore index 227e45f..bce8d75 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ .idea *.iml +.project +.settings .gradle **/build/ @@ -12,4 +14,4 @@ gradle-app.setting !gradle-wrapper.jar # Cache of project -.gradletasknamecache \ No newline at end of file +.gradletasknamecache diff --git a/src/main/java/com/bedrockk/packs/PackHelper.java b/src/main/java/com/bedrockk/packs/PackHelper.java index 4fd0c9f..036ef47 100644 --- a/src/main/java/com/bedrockk/packs/PackHelper.java +++ b/src/main/java/com/bedrockk/packs/PackHelper.java @@ -1,9 +1,11 @@ package com.bedrockk.packs; +import com.bedrockk.packs.annotation.JsonConverter; import com.bedrockk.packs.definition.*; import com.bedrockk.packs.definition.recipe.RecipeDefinition; import com.bedrockk.packs.json.PackAnnotationIntrospector; import com.bedrockk.packs.json.PackModule; +import com.bedrockk.packs.json.VersionConverter; import com.bedrockk.packs.type.SemVersion; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonParser; @@ -11,6 +13,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.databind.util.ClassUtil; import lombok.experimental.UtilityClass; import java.io.IOException; @@ -37,6 +40,7 @@ public static synchronized T deserialize(String json, Class type) throws } else { CURRENT_DEFINITION_VERSION = null; } + MAPPER.setConfig(MAPPER.getDeserializationConfig().withAttribute("no-converter", false)); T value = MAPPER.readValue(json, type); CURRENT_DEFINITION_VERSION = null; return value; @@ -122,12 +126,32 @@ public static RenderControllerDefinition deserializeRenderController(String json return deserialize(json, RenderControllerDefinition.class); } - public static String serialize(Object object) throws JsonProcessingException { - return MAPPER.writeValueAsString(object); + public static String serialize(T object) throws JsonProcessingException { + return serialize(object, null, false); } - public static String serializeAsPretty(Object object) throws JsonProcessingException { - return MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object); + public static String serializePretty(T object) throws JsonProcessingException { + return serialize(object, null, true); + } + + public static String serialize(T object, SemVersion version, boolean pretty) throws JsonProcessingException { + var converter = object.getClass().getAnnotation(JsonConverter.class); + Object input = object; + if (converter != null && converter.past() != VersionConverter.None.class) { + var inst = ClassUtil.createInstance(converter.past(), true); + if (inst != null) { + var node = toJsonNode(object); + if (version == null) { + if (node.has("format_version") && node.get("format_version").isTextual()) { + version = SemVersion.of(node.get("format_version").asText()); + } else { + version = FORMAT_VERSION; + } + } + input = inst.convert(toJsonNode(input), version); + } + } + return pretty ? MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(object) : MAPPER.writeValueAsString(object); } public static T convert(Object value, Class type) { diff --git a/src/main/java/com/bedrockk/packs/annotation/JsonConverter.java b/src/main/java/com/bedrockk/packs/annotation/JsonConverter.java index b955f08..da9cd87 100644 --- a/src/main/java/com/bedrockk/packs/annotation/JsonConverter.java +++ b/src/main/java/com/bedrockk/packs/annotation/JsonConverter.java @@ -1,5 +1,6 @@ package com.bedrockk.packs.annotation; +import com.bedrockk.packs.json.VersionConverter; import com.fasterxml.jackson.databind.util.Converter; import java.lang.annotation.ElementType; @@ -11,7 +12,7 @@ @Target({ElementType.TYPE, ElementType.FIELD}) public @interface JsonConverter { - Class current() default Converter.None.class; + Class current() default VersionConverter.None.class; - Class past() default Converter.None.class; + Class past() default VersionConverter.None.class; } diff --git a/src/main/java/com/bedrockk/packs/definition/feature/OreFeatureDefinition.java b/src/main/java/com/bedrockk/packs/definition/feature/OreFeatureDefinition.java index 2898c02..bfc052a 100644 --- a/src/main/java/com/bedrockk/packs/definition/feature/OreFeatureDefinition.java +++ b/src/main/java/com/bedrockk/packs/definition/feature/OreFeatureDefinition.java @@ -42,16 +42,11 @@ public static class ReplaceRule implements PackNode { private List mayReplace; } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_220); - } - - @Override - public JsonNode apply(JsonNode value) { - if (value instanceof ObjectNode node && value.has("may_replace")) { + public JsonNode toCurrent(JsonNode value, SemVersion version) { + if (version.isLower(FormatVersions.V1_16_220) && value instanceof ObjectNode node && value.has("may_replace")) { var array = PackHelper.MAPPER.createArrayNode(); var rule = PackHelper.MAPPER.createObjectNode(); rule.set("places_block", node.remove("places_block")); diff --git a/src/main/java/com/bedrockk/packs/definition/item/EntityPlacerDefinition.java b/src/main/java/com/bedrockk/packs/definition/item/EntityPlacerDefinition.java index 9425d23..d689574 100644 --- a/src/main/java/com/bedrockk/packs/definition/item/EntityPlacerDefinition.java +++ b/src/main/java/com/bedrockk/packs/definition/item/EntityPlacerDefinition.java @@ -27,16 +27,11 @@ public class EntityPlacerDefinition implements ItemComponentNode { @Singular("canDispenseOn") private List dispenseOn; - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_100); - } - - @Override - public JsonNode apply(JsonNode value) { - if (value instanceof ObjectNode node) { + public JsonNode toCurrent(JsonNode value, SemVersion version) { + if (version.isLower(FormatVersions.V1_16_100) && value instanceof ObjectNode node) { if (node.has("allowedBlocks")) { node.set("useOn", node.remove("allowedBlocks")); } diff --git a/src/main/java/com/bedrockk/packs/definition/item/RenderOffsetsDefinition.java b/src/main/java/com/bedrockk/packs/definition/item/RenderOffsetsDefinition.java index 6e1ecac..dd601b2 100644 --- a/src/main/java/com/bedrockk/packs/definition/item/RenderOffsetsDefinition.java +++ b/src/main/java/com/bedrockk/packs/definition/item/RenderOffsetsDefinition.java @@ -36,20 +36,6 @@ public static class RenderOffset implements PackNode { private ImmutableVec3 scale; } - public static class Converter extends VersionConverter { - - @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_200); - } - - @Override - public JsonNode apply(JsonNode value) { - // TODO - return value.isTextual() ? PackHelper.MAPPER.createObjectNode() : value; - } - } - public enum HandType { MAIN_HAND, OFF_HAND; diff --git a/src/main/java/com/bedrockk/packs/definition/item/UseDurationDefinition.java b/src/main/java/com/bedrockk/packs/definition/item/UseDurationDefinition.java index 2c26aef..67d834c 100644 --- a/src/main/java/com/bedrockk/packs/definition/item/UseDurationDefinition.java +++ b/src/main/java/com/bedrockk/packs/definition/item/UseDurationDefinition.java @@ -13,9 +13,9 @@ public UseDurationDefinition(Integer value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public JsonNode apply(JsonNode value) { + public JsonNode toCurrent(JsonNode value, SemVersion version) { return value.isDouble() ? PackHelper.toJsonNode((int) value.asDouble() * 20) : value; } } diff --git a/src/main/java/com/bedrockk/packs/definition/loot/function/SetBannerDetailsFunction.java b/src/main/java/com/bedrockk/packs/definition/loot/function/SetBannerDetailsFunction.java index 1bb83c0..9bc66c2 100644 --- a/src/main/java/com/bedrockk/packs/definition/loot/function/SetBannerDetailsFunction.java +++ b/src/main/java/com/bedrockk/packs/definition/loot/function/SetBannerDetailsFunction.java @@ -9,7 +9,6 @@ import com.bedrockk.packs.utils.FormatVersions; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.util.StdConverter; import lombok.*; import lombok.extern.jackson.Jacksonized; @@ -33,16 +32,11 @@ public static class Pattern implements PackNode { private String color; } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_100); - } - - @Override - public JsonNode apply(JsonNode value) { - if (value instanceof ObjectNode node && value.has("type")) { + public JsonNode toCurrent(JsonNode value, SemVersion version) { + if (version.isLower(FormatVersions.V1_16_100) && value instanceof ObjectNode node && value.has("type")) { var type = value.get("type"); if (type.isObject() && type.has("min") && type.has("max")) { node.set("type", PackHelper.toJsonNode("default")); diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockDestroyTimeDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockDestroyTimeDescription.java index 1a4cff9..c8df30b 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockDestroyTimeDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockDestroyTimeDescription.java @@ -15,16 +15,11 @@ public BlockDestroyTimeDescription(Integer value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? PackHelper.toJsonNode((int) value.get("value").asDouble() * 20) : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? PackHelper.toJsonNode((int) value.get("value").asDouble() * 20) : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockExplodeableDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockExplodeableDescription.java index dcf7ddc..1e3548f 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockExplodeableDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockExplodeableDescription.java @@ -1,6 +1,5 @@ package com.bedrockk.packs.description.block; -import com.bedrockk.packs.PackHelper; import com.bedrockk.packs.annotation.JsonConverter; import com.bedrockk.packs.description.BlockDescription; import com.bedrockk.packs.json.VersionConverter; @@ -15,16 +14,11 @@ public BlockExplodeableDescription(Double value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? value.get("value") : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? value.get("value") : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockFrictionDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockFrictionDescription.java index bbc4ee5..bbe69f4 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockFrictionDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockFrictionDescription.java @@ -14,16 +14,11 @@ public BlockFrictionDescription(Double value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? value.get("value") : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? value.get("value") : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockLightAbsorptionDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockLightAbsorptionDescription.java index 5bed8a7..a18e777 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockLightAbsorptionDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockLightAbsorptionDescription.java @@ -14,16 +14,11 @@ public BlockLightAbsorptionDescription(Double value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? value.get("value") : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? value.get("value") : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockLightEmissionDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockLightEmissionDescription.java index aab00c1..3f04a16 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockLightEmissionDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockLightEmissionDescription.java @@ -14,16 +14,11 @@ public BlockLightEmissionDescription(Double value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? value.get("value") : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? value.get("value") : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockLootDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockLootDescription.java index 172ed28..875dda1 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockLootDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockLootDescription.java @@ -16,16 +16,11 @@ public BlockLootDescription(Path value) { super(value); } - public static class Converter extends VersionConverter { + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); - } - - @Override - public JsonNode apply(JsonNode value) { - return value.isDouble() ? value.get("value") : value; + public JsonNode toCurrent(JsonNode value, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && value.isDouble() ? value.get("value") : value; } } } diff --git a/src/main/java/com/bedrockk/packs/description/block/BlockMapColorDescription.java b/src/main/java/com/bedrockk/packs/description/block/BlockMapColorDescription.java index e55aed9..1fe095a 100644 --- a/src/main/java/com/bedrockk/packs/description/block/BlockMapColorDescription.java +++ b/src/main/java/com/bedrockk/packs/description/block/BlockMapColorDescription.java @@ -1,5 +1,6 @@ package com.bedrockk.packs.description.block; +import com.bedrockk.packs.PackHelper; import com.bedrockk.packs.annotation.JsonConverter; import com.bedrockk.packs.description.BlockDescription; import com.bedrockk.packs.json.VersionConverter; @@ -12,20 +13,29 @@ @JsonConverter(current = BlockMapColorDescription.Converter.class) public class BlockMapColorDescription extends SingleValueNode implements BlockDescription { @JsonCreator - public BlockMapColorDescription(Integer value) { + public BlockMapColorDescription(int value) { super(value); } - public static class Converter extends VersionConverter { + @JsonCreator + public static BlockMapColorDescription of(JsonNode node) { + return new BlockMapColorDescription(node.asInt()); + } + + public static class Converter implements VersionConverter { @Override - public boolean isValid(SemVersion version) { - return version.isLower(FormatVersions.V1_16_0); + public JsonNode toCurrent(JsonNode node, SemVersion version) { + return version.isLower(FormatVersions.V1_16_0) && node.isObject() ? node.get("color") : node; } - @Override - public JsonNode apply(JsonNode node) { - return node.isObject() ? node.get("color") : node; + public JsonNode toSpecific(JsonNode node, SemVersion version) { + if (version.isLower(FormatVersions.V1_16_0) && node.isNumber()) { + var wrap = PackHelper.MAPPER.createObjectNode(); + wrap.set("value", node); + return wrap; + } + return node; } } } diff --git a/src/main/java/com/bedrockk/packs/json/NamedTypeDeserializer.java b/src/main/java/com/bedrockk/packs/json/NamedTypeDeserializer.java index 403b05c..9993c21 100644 --- a/src/main/java/com/bedrockk/packs/json/NamedTypeDeserializer.java +++ b/src/main/java/com/bedrockk/packs/json/NamedTypeDeserializer.java @@ -2,10 +2,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.BeanProperty; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.core.util.JsonParserSequence; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; import com.fasterxml.jackson.databind.jsontype.NamedType; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; @@ -16,6 +14,7 @@ import java.io.IOException; import java.io.Serial; import java.util.Collection; +import java.util.Map; public class NamedTypeDeserializer extends AsPropertyTypeDeserializer { @Serial @@ -41,12 +40,10 @@ public TypeDeserializer forProperty(BeanProperty prop) { @Override public Object deserializeTypedFromObject(JsonParser p, DeserializationContext ctxt) throws IOException { - String name = p.currentName(); + var name = p.currentName(); if (name != null) { - TokenBuffer tb = new TokenBuffer(p, ctxt); - tb.copyCurrentStructure(p); - - return _deserializeTypedForId(p, ctxt, tb, name); + JsonDeserializer deser = _findDeserializer(ctxt, name); + return deser.deserialize(p, ctxt); } else { throw new InvalidTypeIdException(p, "Could not found root for definition", _baseType, "NAMED"); } diff --git a/src/main/java/com/bedrockk/packs/json/PackDeserializers.java b/src/main/java/com/bedrockk/packs/json/PackDeserializers.java index a8cd6ea..2f213fc 100644 --- a/src/main/java/com/bedrockk/packs/json/PackDeserializers.java +++ b/src/main/java/com/bedrockk/packs/json/PackDeserializers.java @@ -12,16 +12,16 @@ public class PackDeserializers extends Deserializers.Base { @Override - @SuppressWarnings("unchecked") public JsonDeserializer findBeanDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException { var intro = (PackAnnotationIntrospector) config.getAnnotationIntrospector(); var since = intro.findJsonSince(beanDesc.getClassInfo()); var until = intro.findJsonUntil(beanDesc.getClassInfo()); var converter = intro.findJsonConverter(beanDesc.getClassInfo()); var current = PackHelper.CURRENT_DEFINITION_VERSION; + var attr = PackHelper.MAPPER.getDeserializationConfig().getAttributes().getAttribute("no-converter"); - if (converter != null) { - var conv = (Converter) ClassUtil.createInstance(converter.current(), true); + if (converter != null && attr != null && !((boolean) attr)) { + var conv = ClassUtil.createInstance(converter.current(), true); return new VersionConverterDeserializer(conv, type); } diff --git a/src/main/java/com/bedrockk/packs/json/VersionConverter.java b/src/main/java/com/bedrockk/packs/json/VersionConverter.java index cde63d6..1c245b4 100644 --- a/src/main/java/com/bedrockk/packs/json/VersionConverter.java +++ b/src/main/java/com/bedrockk/packs/json/VersionConverter.java @@ -1,25 +1,17 @@ package com.bedrockk.packs.json; -import com.bedrockk.packs.PackHelper; import com.bedrockk.packs.type.SemVersion; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.*; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.util.StdConverter; +import com.fasterxml.jackson.databind.JsonNode; -public abstract class VersionConverter extends StdConverter { +public interface VersionConverter { - public boolean isValid(SemVersion version) { - return true; + default JsonNode toCurrent(JsonNode value, SemVersion version) { + return value; } - @Override - public JsonNode convert(JsonNode value) { - return isValid(PackHelper.CURRENT_DEFINITION_VERSION) ? apply(value) : value; + default JsonNode toSpecific(JsonNode value, SemVersion version) { + return value; } - public abstract JsonNode apply(JsonNode node); + abstract class None implements VersionConverter { } } diff --git a/src/main/java/com/bedrockk/packs/json/VersionConverterDeserializer.java b/src/main/java/com/bedrockk/packs/json/VersionConverterDeserializer.java index d97b946..7329725 100644 --- a/src/main/java/com/bedrockk/packs/json/VersionConverterDeserializer.java +++ b/src/main/java/com/bedrockk/packs/json/VersionConverterDeserializer.java @@ -1,27 +1,52 @@ package com.bedrockk.packs.json; import com.bedrockk.packs.PackHelper; +import com.fasterxml.jackson.annotation.JsonView; import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext; +import com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.Impl; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; +import com.fasterxml.jackson.databind.type.MapLikeType; import com.fasterxml.jackson.databind.util.Converter; import lombok.RequiredArgsConstructor; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; @RequiredArgsConstructor public class VersionConverterDeserializer extends JsonDeserializer { - private final Converter converter; + private final VersionConverter converter; private final JavaType type; @Override public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + var currentName = p.getCurrentName(); var node = p.readValueAs(JsonNode.class); - converter.convert(node); - return PackHelper.MAPPER.convertValue(node, type); + node = converter.toCurrent(node, PackHelper.CURRENT_DEFINITION_VERSION); + + if (currentName == null) { + return PackHelper.MAPPER.convertValue(node, type); + } + var node2 = PackHelper.MAPPER.createObjectNode(); + node2.set(currentName, node); + var parser = PackHelper.MAPPER.createParser(node.toString()); + var desc = ctxt.getConfig().introspect(type); + PackHelper.MAPPER.setConfig(PackHelper.MAPPER.getDeserializationConfig().withAttribute("no-converter", true)); + var deser = ctxt.getFactory().createBeanDeserializer(ctxt, type, desc); + var result = deser.deserialize(parser, ctxt); + if (result instanceof Map) { + return ((Map) result).get(currentName); + } + return null; + } + + @Override + public Object deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException { + return super.deserializeWithType(p, ctxt, typeDeserializer); } } diff --git a/src/test/java/com/bedrockk/packs/DeserializeTest.java b/src/test/java/com/bedrockk/packs/DeserializeTest.java index eed3899..9b0fea5 100644 --- a/src/test/java/com/bedrockk/packs/DeserializeTest.java +++ b/src/test/java/com/bedrockk/packs/DeserializeTest.java @@ -141,7 +141,7 @@ public void testRenderController() throws IOException { private static void assertResult(String input, Definition definition) throws JsonProcessingException { JsonNode expected = PackHelper.MAPPER.readTree(input); - assertTree(expected, PackHelper.toJsonNode(definition)); + assertTree(expected, PackHelper.MAPPER.readTree(PackHelper.serialize(definition))); } private static void assertTree(JsonNode expected, JsonNode actual) { diff --git a/src/test/resources/test_block.json b/src/test/resources/test_block.json index f54074d..a455395 100644 --- a/src/test/resources/test_block.json +++ b/src/test/resources/test_block.json @@ -1,11 +1,13 @@ { - "format_version": "1.17.0", + "format_version": "1.15.0", "minecraft:block": { "description": { "identifier": "bedrockk:testblock" }, "components": { - "minecraft:map_color": 31231231 + "minecraft:map_color": { + "color": 121212 + } } } } \ No newline at end of file