From f62556910b000a9090b45065d5479e3d6ab1b194 Mon Sep 17 00:00:00 2001 From: Maxim Smirnov Date: Wed, 16 Aug 2023 23:53:32 +0400 Subject: [PATCH] Reworked parsing of some classes for GSON, removed transient property --- .../ru/livetex/sdk/entity/FileMessage.java | 2 +- .../ru/livetex/sdk/entity/HistoryEntity.java | 2 +- .../ru/livetex/sdk/entity/TextMessage.java | 2 +- .../ru/livetex/sdk/logic/EntityMapper.java | 109 ++++++++++-------- 4 files changed, 67 insertions(+), 48 deletions(-) diff --git a/sdk/src/main/java/ru/livetex/sdk/entity/FileMessage.java b/sdk/src/main/java/ru/livetex/sdk/entity/FileMessage.java index 89f30bb..b7bfab0 100644 --- a/sdk/src/main/java/ru/livetex/sdk/entity/FileMessage.java +++ b/sdk/src/main/java/ru/livetex/sdk/entity/FileMessage.java @@ -17,7 +17,7 @@ public final class FileMessage extends BaseEntity implements GenericMessage { @NonNull public Date createdAt; // timestamp in millis @NonNull - public transient Creator creator; + public Creator creator; public FileMessage(FileUploadedResponse response) { super(); diff --git a/sdk/src/main/java/ru/livetex/sdk/entity/HistoryEntity.java b/sdk/src/main/java/ru/livetex/sdk/entity/HistoryEntity.java index 75291a4..50e5721 100644 --- a/sdk/src/main/java/ru/livetex/sdk/entity/HistoryEntity.java +++ b/sdk/src/main/java/ru/livetex/sdk/entity/HistoryEntity.java @@ -12,7 +12,7 @@ public final class HistoryEntity extends BaseEntity { @NonNull public Date createdAt; @NonNull - public transient List messages = new ArrayList<>(); + public List messages = new ArrayList<>(); @Override protected String getType() { diff --git a/sdk/src/main/java/ru/livetex/sdk/entity/TextMessage.java b/sdk/src/main/java/ru/livetex/sdk/entity/TextMessage.java index b1b8e05..1ae84a6 100644 --- a/sdk/src/main/java/ru/livetex/sdk/entity/TextMessage.java +++ b/sdk/src/main/java/ru/livetex/sdk/entity/TextMessage.java @@ -16,7 +16,7 @@ public final class TextMessage extends BaseEntity implements GenericMessage { @NonNull public Date createdAt; @NonNull - public transient Creator creator; + public Creator creator; // Related to custom project logic @Nullable public Map attributes = null; diff --git a/sdk/src/main/java/ru/livetex/sdk/logic/EntityMapper.java b/sdk/src/main/java/ru/livetex/sdk/logic/EntityMapper.java index e72cdb1..6be4b1b 100644 --- a/sdk/src/main/java/ru/livetex/sdk/logic/EntityMapper.java +++ b/sdk/src/main/java/ru/livetex/sdk/logic/EntityMapper.java @@ -17,6 +17,7 @@ import ru.livetex.sdk.entity.AttributesRequest; import ru.livetex.sdk.entity.BaseEntity; import ru.livetex.sdk.entity.Bot; +import ru.livetex.sdk.entity.Creator; import ru.livetex.sdk.entity.Department; import ru.livetex.sdk.entity.DepartmentRequestEntity; import ru.livetex.sdk.entity.DialogState; @@ -36,6 +37,8 @@ public class EntityMapper { public final static Gson gson = new GsonBuilder() .registerTypeAdapter(BaseEntity.class, new LivetexTypeModelDeserializer()) + .registerTypeAdapter(GenericMessage.class, new LivetexGenericMessageDeserializer()) + .registerTypeAdapter(Creator.class, new LivetexCreatorDeserializer()) .create(); public BaseEntity toEntity(String jsonStr) { @@ -56,12 +59,12 @@ public BaseEntity deserialize(final JsonElement json, final Type typeOfT, final case DialogState.TYPE: { return gson.fromJson(json, DialogState.class); } - case TextMessage.TYPE: { - return parseTextMessage(json); - } - case FileMessage.TYPE: { - return parseFileMessage(json); - } +// case TextMessage.TYPE: { +// return parseTextMessage(json); +// } +// case FileMessage.TYPE: { +// return parseFileMessage(json); +// } case TypingEvent.TYPE: { return gson.fromJson(json, TypingEvent.class); } @@ -83,29 +86,29 @@ public BaseEntity deserialize(final JsonElement json, final Type typeOfT, final case HistoryEntity.TYPE: { HistoryEntity history = gson.fromJson(json, HistoryEntity.class); - JsonArray messages = jsonObject.getAsJsonArray("messages"); - - for (int i = 0; i < messages.size(); i++) { - JsonElement message = messages.get(i); - - String msgType = message.getAsJsonObject().get("type").getAsString(); - GenericMessage msg = null; - - switch (msgType) { - case TextMessage.TYPE: { - msg = parseTextMessage(message); - break; - } - case FileMessage.TYPE: { - msg = parseFileMessage(message); - break; - } - } - - if (msg != null) { - history.messages.add(msg); - } - } +// JsonArray messages = jsonObject.getAsJsonArray("messages"); +// +// for (int i = 0; i < messages.size(); i++) { +// JsonElement message = messages.get(i); +// +// String msgType = message.getAsJsonObject().get("type").getAsString(); +// GenericMessage msg = null; +// +// switch (msgType) { +// case TextMessage.TYPE: { +// msg = parseTextMessage(message); +// break; +// } +// case FileMessage.TYPE: { +// msg = parseFileMessage(message); +// break; +// } +// } +// +// if (msg != null) { +// history.messages.add(msg); +// } +// } return history; } @@ -118,44 +121,60 @@ public BaseEntity deserialize(final JsonElement json, final Type typeOfT, final } } } + } + + static class LivetexGenericMessageDeserializer implements JsonDeserializer { + @Override + public GenericMessage deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + String msgType = json.getAsJsonObject().get("type").getAsString(); + GenericMessage msg = null; + + switch (msgType) { + case TextMessage.TYPE: { + msg = parseTextMessage(json); + break; + } + case FileMessage.TYPE: { + msg = parseFileMessage(json); + break; + } + } + + return msg; + } private TextMessage parseTextMessage(JsonElement json) { TextMessage message = gson.fromJson(json, TextMessage.class); - parseCreator(message, json); return message; } private FileMessage parseFileMessage(JsonElement json) { FileMessage message = gson.fromJson(json, FileMessage.class); - parseCreator(message, json); return message; } + } - private void parseCreator(GenericMessage message, JsonElement json) { - JsonObject jsonObject = json.getAsJsonObject(); - - JsonObject creator = jsonObject.getAsJsonObject("creator"); - String creatorType = creator.get("type").getAsString(); + static class LivetexCreatorDeserializer implements JsonDeserializer { + @Override + public Creator deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject obj = json.getAsJsonObject(); + String creatorType = obj.get("type").getAsString(); switch (creatorType) { case Employee.TYPE: { - JsonObject creatorObject = creator.getAsJsonObject("employee"); - message.setCreator(gson.fromJson(creatorObject, Employee.class)); - break; + return gson.fromJson(obj, Employee.class); } case Visitor.TYPE: { - message.setCreator(gson.fromJson(creator, Visitor.class)); - break; + return gson.fromJson(obj, Visitor.class); } case SystemUser.TYPE: { - message.setCreator(gson.fromJson(creator, SystemUser.class)); - break; + return gson.fromJson(obj, SystemUser.class); } case Bot.TYPE: { - message.setCreator(gson.fromJson(creator, Bot.class)); - break; + return gson.fromJson(obj, Bot.class); } } + return null; } } }