From dbb791c2217e181a0a8e402fc9e4578c51994e34 Mon Sep 17 00:00:00 2001 From: Lukas Brand Date: Fri, 13 Oct 2023 08:25:17 +0200 Subject: [PATCH] Fix userProperties duplicate print --- .../hivemq/cli/utils/json/JsonFormatted.java | 31 ++++++++++++++++++- .../cli/utils/json/JsonMqttPublish.java | 14 +++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/hivemq/cli/utils/json/JsonFormatted.java b/src/main/java/com/hivemq/cli/utils/json/JsonFormatted.java index 3cdaaf5e7..ba0303e94 100644 --- a/src/main/java/com/hivemq/cli/utils/json/JsonFormatted.java +++ b/src/main/java/com/hivemq/cli/utils/json/JsonFormatted.java @@ -18,13 +18,42 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; import org.jetbrains.annotations.NotNull; +import java.lang.reflect.Type; + abstract class JsonFormatted { - private static final @NotNull Gson gson = new GsonBuilder().setPrettyPrinting().setLenient().create(); + private static final @NotNull Gson gson = + new GsonBuilder().registerTypeAdapter(Mqtt5UserProperties.class, new Mqtt5UserPropertySerializer()) + .setPrettyPrinting() + .setLenient() + .create(); public @NotNull String toString() { return gson.toJson(this); } + + private static class Mqtt5UserPropertySerializer implements JsonSerializer { + @Override + public @NotNull JsonElement serialize( + final @NotNull Mqtt5UserProperties src, + final @NotNull Type typeOfSrc, + final @NotNull JsonSerializationContext context) { + final JsonArray userPropertiesArray = new JsonArray(); + src.asList().forEach(mqtt5UserProperty -> { + final JsonObject userPropertyObject = new JsonObject(); + userPropertyObject.addProperty(mqtt5UserProperty.getName().toString(), + mqtt5UserProperty.getValue().toString()); + userPropertiesArray.add(userPropertyObject); + }); + return userPropertiesArray; + } + } } diff --git a/src/main/java/com/hivemq/cli/utils/json/JsonMqttPublish.java b/src/main/java/com/hivemq/cli/utils/json/JsonMqttPublish.java index 5e9728d6c..fb0c2f70f 100644 --- a/src/main/java/com/hivemq/cli/utils/json/JsonMqttPublish.java +++ b/src/main/java/com/hivemq/cli/utils/json/JsonMqttPublish.java @@ -25,6 +25,7 @@ import com.hivemq.client.mqtt.datatypes.MqttTopic; import com.hivemq.client.mqtt.datatypes.MqttUtf8String; import com.hivemq.client.mqtt.mqtt3.message.publish.Mqtt3Publish; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; import org.jetbrains.annotations.NotNull; @@ -33,9 +34,6 @@ import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; @SuppressWarnings({"unused", "FieldCanBeLocal"}) public class JsonMqttPublish extends JsonFormatted { @@ -50,7 +48,7 @@ public class JsonMqttPublish extends JsonFormatted { private @Nullable Long messageExpiryInterval; private @Nullable String responseTopic; private @Nullable String correlationData; - private @Nullable Map userProperties; + private @Nullable Mqtt5UserProperties userProperties; public JsonMqttPublish(final @NotNull Mqtt3Publish publish, final boolean isBase64) { payload = payloadToJson(publish.getPayloadAsBytes(), isBase64); @@ -78,12 +76,8 @@ public JsonMqttPublish(final @NotNull Mqtt5Publish publish, final boolean isBase .map(cd -> StandardCharsets.UTF_8.decode(cd).toString()) // .orElse(null); - if (publish.getUserProperties().asList().size() > 0) { - userProperties = new HashMap<>(); - publish.getUserProperties() - .asList() - .forEach(up -> Objects.requireNonNull(userProperties) - .put(up.getName().toString(), up.getValue().toString())); + if (!publish.getUserProperties().asList().isEmpty()) { + userProperties = publish.getUserProperties(); } }