From 63f43948e59992342ec8e4ab209fa5786687eac2 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 13 May 2020 11:23:37 +0300 Subject: [PATCH] Text deserializer --- .../java/mc/protocol/converter/Converter.java | 6 -- .../converter/TextToJsonConverter.java | 48 ------------- src/main/java/mc/protocol/dto/ServerInfo.java | 3 +- .../status/server/StatusServerResponse.java | 2 +- src/main/java/mc/protocol/text/Text.java | 2 + src/main/java/mc/protocol/text/TextColor.java | 8 +++ .../protocol/utils/{ => json}/JsonUtils.java | 9 ++- .../json/serializer/TextDeserializer.java | 69 +++++++++++++++++++ 8 files changed, 90 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/mc/protocol/converter/Converter.java delete mode 100644 src/main/java/mc/protocol/converter/TextToJsonConverter.java rename src/main/java/mc/protocol/utils/{ => json}/JsonUtils.java (77%) create mode 100644 src/main/java/mc/protocol/utils/json/serializer/TextDeserializer.java diff --git a/src/main/java/mc/protocol/converter/Converter.java b/src/main/java/mc/protocol/converter/Converter.java deleted file mode 100644 index 625855a..0000000 --- a/src/main/java/mc/protocol/converter/Converter.java +++ /dev/null @@ -1,6 +0,0 @@ -package mc.protocol.converter; - -public interface Converter { - - T convert(S source); -} diff --git a/src/main/java/mc/protocol/converter/TextToJsonConverter.java b/src/main/java/mc/protocol/converter/TextToJsonConverter.java deleted file mode 100644 index 6f0df98..0000000 --- a/src/main/java/mc/protocol/converter/TextToJsonConverter.java +++ /dev/null @@ -1,48 +0,0 @@ -package mc.protocol.converter; - -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import mc.protocol.text.Text; -import mc.protocol.text.TextStyle; -import mc.protocol.utils.JsonUtils; - -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@Getter -public class TextToJsonConverter implements Converter { - - private static final TextToJsonConverter instance = new TextToJsonConverter(); - - @Override - public String convert(Text text) { - return JsonUtils.objectToJson(createObjectNode(text)); - } - - private ObjectNode createObjectNode(Text text) { - final ObjectNode objectNode = JsonUtils.getObjectMapper().createObjectNode(); - objectNode.put("text", text.getContent()); - - if (text.getColor() != null) { - objectNode.put("color", text.getColor().getName()); - } - - if (text.getStyle() != null) { - final TextStyle style = text.getStyle(); - style.getBold().ifPresent(value -> objectNode.put("bold", value)); - style.getItalic().ifPresent(value -> objectNode.put("italic", value)); - style.getObfuscated().ifPresent(value -> objectNode.put("obfuscated", value)); - style.getStrikethrough().ifPresent(value -> objectNode.put("strikethrough", value)); - style.getUnderline().ifPresent(value -> objectNode.put("underlined", value)); - } - - if (text.getChildren() != null) { - final ArrayNode arrayNode = JsonUtils.getObjectMapper().createArrayNode(); - text.getChildren().forEach(childText -> arrayNode.add(createObjectNode(childText))); - objectNode.set("extra", arrayNode); - } - - return objectNode; - } -} diff --git a/src/main/java/mc/protocol/dto/ServerInfo.java b/src/main/java/mc/protocol/dto/ServerInfo.java index 843de07..f88ffa4 100644 --- a/src/main/java/mc/protocol/dto/ServerInfo.java +++ b/src/main/java/mc/protocol/dto/ServerInfo.java @@ -3,6 +3,7 @@ package mc.protocol.dto; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; +import lombok.ToString; import mc.protocol.text.Text; import java.util.List; @@ -10,6 +11,7 @@ import java.util.UUID; @JsonIgnoreProperties(ignoreUnknown = true) @Data +@ToString(exclude = "faviconBase64") public class ServerInfo { private Version version; @@ -17,7 +19,6 @@ public class ServerInfo { @JsonProperty("players") private PlayersInfo playersInfo; - //FIXME так не получится. Нужен кастомный Jackson сериализатор private Text description; @JsonProperty("favicon") diff --git a/src/main/java/mc/protocol/status/server/StatusServerResponse.java b/src/main/java/mc/protocol/status/server/StatusServerResponse.java index 3cfbfda..899da96 100644 --- a/src/main/java/mc/protocol/status/server/StatusServerResponse.java +++ b/src/main/java/mc/protocol/status/server/StatusServerResponse.java @@ -5,7 +5,7 @@ import mc.protocol.Packet; import mc.protocol.dto.ServerInfo; import mc.protocol.io.NetInputStream; import mc.protocol.io.NetOutputStream; -import mc.protocol.utils.JsonUtils; +import mc.protocol.utils.json.JsonUtils; /** * Status server packet, response. diff --git a/src/main/java/mc/protocol/text/Text.java b/src/main/java/mc/protocol/text/Text.java index 66ac680..85f308a 100644 --- a/src/main/java/mc/protocol/text/Text.java +++ b/src/main/java/mc/protocol/text/Text.java @@ -2,10 +2,12 @@ package mc.protocol.text; import com.google.common.collect.ImmutableList; import lombok.Getter; +import lombok.ToString; import java.util.*; @Getter +@ToString public class Text { private static final Text EMPTY = new Text(); private static final Text NEW_LINE = new Text("\n", null, null, null); diff --git a/src/main/java/mc/protocol/text/TextColor.java b/src/main/java/mc/protocol/text/TextColor.java index d25e187..3ed5fa4 100644 --- a/src/main/java/mc/protocol/text/TextColor.java +++ b/src/main/java/mc/protocol/text/TextColor.java @@ -3,6 +3,8 @@ package mc.protocol.text; import lombok.Getter; import lombok.RequiredArgsConstructor; +import java.util.stream.Stream; + @RequiredArgsConstructor @Getter public enum TextColor { @@ -23,6 +25,12 @@ public enum TextColor { YELLOW ("yellow", 'e'), WHITE ("white", 'f'); + public static TextColor valueOfColorName(String name) { + return Stream.of(TextColor.values()) + .filter(textColor -> textColor.getName().equals(name)) + .findFirst().orElse(null); + } + private final String name; private final char code; } diff --git a/src/main/java/mc/protocol/utils/JsonUtils.java b/src/main/java/mc/protocol/utils/json/JsonUtils.java similarity index 77% rename from src/main/java/mc/protocol/utils/JsonUtils.java rename to src/main/java/mc/protocol/utils/json/JsonUtils.java index 37e70af..ae01d6e 100644 --- a/src/main/java/mc/protocol/utils/JsonUtils.java +++ b/src/main/java/mc/protocol/utils/json/JsonUtils.java @@ -1,9 +1,12 @@ -package mc.protocol.utils; +package mc.protocol.utils.json; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; +import mc.protocol.text.Text; +import mc.protocol.utils.json.serializer.TextDeserializer; import java.util.Optional; @@ -40,7 +43,11 @@ public class JsonUtils { public ObjectMapper getObjectMapper() { if (objectMapper == null) { + SimpleModule module = new SimpleModule(); + module.addDeserializer(Text.class, new TextDeserializer()); + objectMapper = new ObjectMapper(); + objectMapper.registerModule(module); } return objectMapper; diff --git a/src/main/java/mc/protocol/utils/json/serializer/TextDeserializer.java b/src/main/java/mc/protocol/utils/json/serializer/TextDeserializer.java new file mode 100644 index 0000000..f46cdef --- /dev/null +++ b/src/main/java/mc/protocol/utils/json/serializer/TextDeserializer.java @@ -0,0 +1,69 @@ +package mc.protocol.utils.json.serializer; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; +import mc.protocol.text.Text; +import mc.protocol.text.TextColor; +import mc.protocol.text.TextStyle; + +import java.io.IOException; +import java.util.Optional; + +public class TextDeserializer extends StdDeserializer { + + public TextDeserializer() { + this(null); + } + + public TextDeserializer(Class t) { + super(t); + } + + @Override + public Text deserialize(JsonParser parser, DeserializationContext ctx) throws IOException { + final Text.Builder builder = Text.builder(); + + final JsonNode jsonNode = parser.getCodec().readTree(parser); + + Optional.ofNullable(jsonNode.get("text")) + .ifPresent(node -> builder.append(node.asText())); + Optional.ofNullable(jsonNode.get("color")) + .ifPresent(node -> builder.color(TextColor.valueOfColorName(node.asText()))); + + if (jsonNode.get("bold") != null && jsonNode.get("bold").isBoolean() + && jsonNode.get("bold").asBoolean()) { + builder.style(TextStyle.BOLD); + } + + if (jsonNode.get("italic") != null && jsonNode.get("italic").isBoolean() + && jsonNode.get("italic").asBoolean()) { + builder.style(TextStyle.ITALIC); + } + + if (jsonNode.get("obfuscated") != null && jsonNode.get("obfuscated").isBoolean() + && jsonNode.get("obfuscated").asBoolean()) { + builder.style(TextStyle.OBFUSCATED); + } + + if (jsonNode.get("strikethrough") != null && jsonNode.get("strikethrough").isBoolean() + && jsonNode.get("strikethrough").asBoolean()) { + builder.style(TextStyle.STRIKETHOUGH); + } + + if (jsonNode.get("underlined") != null && jsonNode.get("underlined").isBoolean() + && jsonNode.get("underlined").asBoolean()) { + builder.style(TextStyle.UNDERLINE); + } + + if (jsonNode.get("extra") != null && jsonNode.get("extra").isArray()) { + final JsonNode nodeExtra = jsonNode.get("extra"); + for (JsonNode node : nodeExtra) { + builder.append(parser.getCodec().treeToValue(node, Text.class)); + } + } + + return builder.build(); + } +}