]> nmode's Git Repositories - signal-cli/commitdiff
Make fields in json classes final and omit unnecessary nulls when serializing
authorAsamK <asamk@gmx.de>
Sun, 17 Jan 2021 10:23:02 +0000 (11:23 +0100)
committerAsamK <asamk@gmx.de>
Sun, 17 Jan 2021 10:23:02 +0000 (11:23 +0100)
Fix sender in sync read messages

16 files changed:
src/main/java/org/asamk/signal/JsonWriter.java
src/main/java/org/asamk/signal/json/JsonAttachment.java
src/main/java/org/asamk/signal/json/JsonCallMessage.java
src/main/java/org/asamk/signal/json/JsonDataMessage.java
src/main/java/org/asamk/signal/json/JsonError.java
src/main/java/org/asamk/signal/json/JsonGroupInfo.java
src/main/java/org/asamk/signal/json/JsonMention.java
src/main/java/org/asamk/signal/json/JsonMessageEnvelope.java
src/main/java/org/asamk/signal/json/JsonQuote.java
src/main/java/org/asamk/signal/json/JsonQuotedAttachment.java
src/main/java/org/asamk/signal/json/JsonReaction.java
src/main/java/org/asamk/signal/json/JsonReceiptMessage.java
src/main/java/org/asamk/signal/json/JsonSticker.java
src/main/java/org/asamk/signal/json/JsonSyncDataMessage.java
src/main/java/org/asamk/signal/json/JsonSyncMessage.java
src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java [new file with mode: 0644]

index 3cc875145ec1d4f6b60675fdb6b9d18b077cbd52..26a20a1f18873a57fd94f5433027f0b46e7a5c14 100644 (file)
@@ -20,7 +20,7 @@ public class JsonWriter {
         this.writer = new OutputStreamWriter(writer, StandardCharsets.UTF_8);
 
         objectMapper = new ObjectMapper();
         this.writer = new OutputStreamWriter(writer, StandardCharsets.UTF_8);
 
         objectMapper = new ObjectMapper();
-        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.PUBLIC_ONLY);
         objectMapper.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
     }
 
         objectMapper.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
     }
 
index 1949171ae87da900163aea08b886f4a9be579908..1b2a7bc7fde92950c92c970e9052f03d2a5179f4 100644 (file)
@@ -1,31 +1,45 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
 import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
+import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
 
 class JsonAttachment {
 
 
 class JsonAttachment {
 
-    String contentType;
-    String filename;
-    String id;
-    int size;
+    @JsonProperty
+    final String contentType;
+
+    @JsonProperty
+    final String filename;
+
+    @JsonProperty
+    final String id;
+
+    @JsonProperty
+    final Long size;
 
     JsonAttachment(SignalServiceAttachment attachment) {
         this.contentType = attachment.getContentType();
 
 
     JsonAttachment(SignalServiceAttachment attachment) {
         this.contentType = attachment.getContentType();
 
-        final SignalServiceAttachmentPointer pointer = attachment.asPointer();
         if (attachment.isPointer()) {
         if (attachment.isPointer()) {
-            this.id = String.valueOf(pointer.getRemoteId());
-            if (pointer.getFileName().isPresent()) {
-                this.filename = pointer.getFileName().get();
-            }
-            if (pointer.getSize().isPresent()) {
-                this.size = pointer.getSize().get();
-            }
+            final SignalServiceAttachmentPointer pointer = attachment.asPointer();
+            this.id = pointer.getRemoteId().toString();
+            this.filename = pointer.getFileName().orNull();
+            this.size = pointer.getSize().transform(Integer::longValue).orNull();
+        } else {
+            final SignalServiceAttachmentStream stream = attachment.asStream();
+            this.id = null;
+            this.filename = stream.getFileName().orNull();
+            this.size = stream.getLength();
         }
     }
 
     JsonAttachment(String filename) {
         this.filename = filename;
         }
     }
 
     JsonAttachment(String filename) {
         this.filename = filename;
+        this.contentType = null;
+        this.id = null;
+        this.size = null;
     }
 }
     }
 }
index c1b1d4432a44755533d63067b732f3129a44af3b..885c38a40fc04a04b3aaf44546837035715ab076 100644 (file)
@@ -1,5 +1,8 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.whispersystems.signalservice.api.messages.calls.AnswerMessage;
 import org.whispersystems.signalservice.api.messages.calls.BusyMessage;
 import org.whispersystems.signalservice.api.messages.calls.HangupMessage;
 import org.whispersystems.signalservice.api.messages.calls.AnswerMessage;
 import org.whispersystems.signalservice.api.messages.calls.BusyMessage;
 import org.whispersystems.signalservice.api.messages.calls.HangupMessage;
@@ -11,27 +14,31 @@ import java.util.List;
 
 class JsonCallMessage {
 
 
 class JsonCallMessage {
 
-    OfferMessage offerMessage;
-    AnswerMessage answerMessage;
-    BusyMessage busyMessage;
-    HangupMessage hangupMessage;
-    List<IceUpdateMessage> iceUpdateMessages;
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final OfferMessage offerMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final AnswerMessage answerMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final BusyMessage busyMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final HangupMessage hangupMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<IceUpdateMessage> iceUpdateMessages;
 
     JsonCallMessage(SignalServiceCallMessage callMessage) {
 
     JsonCallMessage(SignalServiceCallMessage callMessage) {
-        if (callMessage.getOfferMessage().isPresent()) {
-            this.offerMessage = callMessage.getOfferMessage().get();
-        }
-        if (callMessage.getAnswerMessage().isPresent()) {
-            this.answerMessage = callMessage.getAnswerMessage().get();
-        }
-        if (callMessage.getBusyMessage().isPresent()) {
-            this.busyMessage = callMessage.getBusyMessage().get();
-        }
-        if (callMessage.getHangupMessage().isPresent()) {
-            this.hangupMessage = callMessage.getHangupMessage().get();
-        }
-        if (callMessage.getIceUpdateMessages().isPresent()) {
-            this.iceUpdateMessages = callMessage.getIceUpdateMessages().get();
-        }
+        this.offerMessage = callMessage.getOfferMessage().orNull();
+        this.answerMessage = callMessage.getAnswerMessage().orNull();
+        this.busyMessage = callMessage.getBusyMessage().orNull();
+        this.hangupMessage = callMessage.getHangupMessage().orNull();
+        this.iceUpdateMessages = callMessage.getIceUpdateMessages().orNull();
     }
 }
     }
 }
index fd3f1efc1939400a94d42075e76dc18dc212d247..e755acad3b0ab72d6e094eac3e81bd519acfbd16 100644 (file)
@@ -1,9 +1,13 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
+import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
 
 import java.util.List;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
 
 import java.util.List;
@@ -11,38 +15,61 @@ import java.util.stream.Collectors;
 
 class JsonDataMessage {
 
 
 class JsonDataMessage {
 
-    long timestamp;
-    String message;
-    int expiresInSeconds;
+    @JsonProperty
+    final long timestamp;
+
+    @JsonProperty
+    final String message;
+
+    @JsonProperty
+    final Integer expiresInSeconds;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonReaction reaction;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonQuote quote;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<JsonMention> mentions;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<JsonAttachment> attachments;
 
 
-    JsonReaction reaction;
-    JsonQuote quote;
-    List<JsonMention> mentions;
-    List<JsonAttachment> attachments;
-    JsonSticker sticker;
-    JsonGroupInfo groupInfo;
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonSticker sticker;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonGroupInfo groupInfo;
 
     JsonDataMessage(SignalServiceDataMessage dataMessage, Manager m) {
         this.timestamp = dataMessage.getTimestamp();
         if (dataMessage.getGroupContext().isPresent()) {
 
     JsonDataMessage(SignalServiceDataMessage dataMessage, Manager m) {
         this.timestamp = dataMessage.getTimestamp();
         if (dataMessage.getGroupContext().isPresent()) {
-            if (dataMessage.getGroupContext().get().getGroupV1().isPresent()) {
-                SignalServiceGroup groupInfo = dataMessage.getGroupContext().get().getGroupV1().get();
+            final SignalServiceGroupContext groupContext = dataMessage.getGroupContext().get();
+            if (groupContext.getGroupV1().isPresent()) {
+                SignalServiceGroup groupInfo = groupContext.getGroupV1().get();
                 this.groupInfo = new JsonGroupInfo(groupInfo);
                 this.groupInfo = new JsonGroupInfo(groupInfo);
-            } else if (dataMessage.getGroupContext().get().getGroupV2().isPresent()) {
-                SignalServiceGroupV2 groupInfo = dataMessage.getGroupContext().get().getGroupV2().get();
+            } else if (groupContext.getGroupV2().isPresent()) {
+                SignalServiceGroupV2 groupInfo = groupContext.getGroupV2().get();
                 this.groupInfo = new JsonGroupInfo(groupInfo);
                 this.groupInfo = new JsonGroupInfo(groupInfo);
+            } else {
+                this.groupInfo = null;
             }
             }
+        } else {
+            this.groupInfo = null;
         }
         }
-        if (dataMessage.getBody().isPresent()) {
-            this.message = dataMessage.getBody().get();
-        }
+        this.message = dataMessage.getBody().orNull();
         this.expiresInSeconds = dataMessage.getExpiresInSeconds();
         this.expiresInSeconds = dataMessage.getExpiresInSeconds();
-        if (dataMessage.getReaction().isPresent()) {
-            this.reaction = new JsonReaction(dataMessage.getReaction().get(), m);
-        }
-        if (dataMessage.getQuote().isPresent()) {
-            this.quote = new JsonQuote(dataMessage.getQuote().get(), m);
-        }
+        this.reaction = dataMessage.getReaction().isPresent()
+                ? new JsonReaction(dataMessage.getReaction().get(), m)
+                : null;
+        this.quote = dataMessage.getQuote().isPresent() ? new JsonQuote(dataMessage.getQuote().get(), m) : null;
         if (dataMessage.getMentions().isPresent()) {
             this.mentions = dataMessage.getMentions()
                     .get()
         if (dataMessage.getMentions().isPresent()) {
             this.mentions = dataMessage.getMentions()
                     .get()
@@ -61,15 +88,14 @@ class JsonDataMessage {
         } else {
             this.attachments = List.of();
         }
         } else {
             this.attachments = List.of();
         }
-        if (dataMessage.getSticker().isPresent()) {
-            this.sticker = new JsonSticker(dataMessage.getSticker().get());
-        }
+        this.sticker = dataMessage.getSticker().isPresent() ? new JsonSticker(dataMessage.getSticker().get()) : null;
     }
 
     public JsonDataMessage(Signal.MessageReceived messageReceived) {
         timestamp = messageReceived.getTimestamp();
         message = messageReceived.getMessage();
         groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null;
     }
 
     public JsonDataMessage(Signal.MessageReceived messageReceived) {
         timestamp = messageReceived.getTimestamp();
         message = messageReceived.getMessage();
         groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null;
+        expiresInSeconds = null;
         reaction = null;    // TODO Replace these 4 with the proper commands
         quote = null;
         mentions = null;
         reaction = null;    // TODO Replace these 4 with the proper commands
         quote = null;
         mentions = null;
@@ -81,6 +107,7 @@ class JsonDataMessage {
         timestamp = messageReceived.getTimestamp();
         message = messageReceived.getMessage();
         groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null;
         timestamp = messageReceived.getTimestamp();
         message = messageReceived.getMessage();
         groupInfo = messageReceived.getGroupId().length > 0 ? new JsonGroupInfo(messageReceived.getGroupId()) : null;
+        expiresInSeconds = null;
         reaction = null;    // TODO Replace these 4 with the proper commands
         quote = null;
         mentions = null;
         reaction = null;    // TODO Replace these 4 with the proper commands
         quote = null;
         mentions = null;
index 29d85c8bd09ea55a0de06f8c231cca9d874b736f..d8b3e5f5c555e75b746c7a159beec14bbc445976 100644 (file)
@@ -1,8 +1,11 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 public class JsonError {
 
 public class JsonError {
 
-    String message;
+    @JsonProperty
+    final String message;
 
     public JsonError(Throwable exception) {
         this.message = exception.getMessage();
 
     public JsonError(Throwable exception) {
         this.message = exception.getMessage();
index bc3e7e0eca35326cb4f013576d8247e1caea543f..d79941edaf36f7d6b5e9e3cc34327f4bd83cf332 100644 (file)
@@ -1,41 +1,59 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.signal.manager.groups.GroupUtils;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import org.asamk.signal.manager.groups.GroupUtils;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
 import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
-import java.util.ArrayList;
 import java.util.Base64;
 import java.util.List;
 import java.util.Base64;
 import java.util.List;
+import java.util.stream.Collectors;
 
 class JsonGroupInfo {
 
 
 class JsonGroupInfo {
 
-    String groupId;
-    List<String> members;
-    String name;
-    String type;
+    @JsonProperty
+    final String groupId;
+
+    @JsonProperty
+    final String type;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final String name;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<String> members;
 
     JsonGroupInfo(SignalServiceGroup groupInfo) {
         this.groupId = Base64.getEncoder().encodeToString(groupInfo.getGroupId());
 
     JsonGroupInfo(SignalServiceGroup groupInfo) {
         this.groupId = Base64.getEncoder().encodeToString(groupInfo.getGroupId());
+        this.type = groupInfo.getType().toString();
+        this.name = groupInfo.getName().orNull();
         if (groupInfo.getMembers().isPresent()) {
         if (groupInfo.getMembers().isPresent()) {
-            this.members = new ArrayList<>(groupInfo.getMembers().get().size());
-            for (SignalServiceAddress address : groupInfo.getMembers().get()) {
-                this.members.add(address.getLegacyIdentifier());
-            }
-        }
-        if (groupInfo.getName().isPresent()) {
-            this.name = groupInfo.getName().get();
+            this.members = groupInfo.getMembers()
+                    .get()
+                    .stream()
+                    .map(SignalServiceAddress::getLegacyIdentifier)
+                    .collect(Collectors.toList());
+        } else {
+            this.members = null;
         }
         }
-        this.type = groupInfo.getType().toString();
     }
 
     JsonGroupInfo(SignalServiceGroupV2 groupInfo) {
         this.groupId = GroupUtils.getGroupIdV2(groupInfo.getMasterKey()).toBase64();
         this.type = groupInfo.hasSignedGroupChange() ? "UPDATE" : "DELIVER";
     }
 
     JsonGroupInfo(SignalServiceGroupV2 groupInfo) {
         this.groupId = GroupUtils.getGroupIdV2(groupInfo.getMasterKey()).toBase64();
         this.type = groupInfo.hasSignedGroupChange() ? "UPDATE" : "DELIVER";
+        this.members = null;
+        this.name = null;
     }
 
     JsonGroupInfo(byte[] groupId) {
         this.groupId = Base64.getEncoder().encodeToString(groupId);
     }
 
     JsonGroupInfo(byte[] groupId) {
         this.groupId = Base64.getEncoder().encodeToString(groupId);
+        this.type = "DELIVER";
+        this.members = null;
+        this.name = null;
     }
 }
     }
 }
index 302128eda41c3fdce47ef5a6597951228b95ace5..b62430410277f7d61f7541241551f8864be40da5 100644 (file)
@@ -1,14 +1,21 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 public class JsonMention {
 
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 public class JsonMention {
 
-    String name;
-    int start;
-    int length;
+    @JsonProperty
+    final String name;
+
+    @JsonProperty
+    final int start;
+
+    @JsonProperty
+    final int length;
 
     JsonMention(SignalServiceDataMessage.Mention mention, Manager m) {
         this.name = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null))
 
     JsonMention(SignalServiceDataMessage.Mention mention, Manager m) {
         this.name = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null))
index 787f62e201172a5b9fc6208fc094110cafcc3231..2a87d12907095a8f292f32f798dda52023547100 100644 (file)
@@ -1,5 +1,8 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceContent;
@@ -10,61 +13,99 @@ import java.util.List;
 
 public class JsonMessageEnvelope {
 
 
 public class JsonMessageEnvelope {
 
-    String source;
-    int sourceDevice;
-    String relay;
-    long timestamp;
-    JsonDataMessage dataMessage;
-    JsonSyncMessage syncMessage;
-    JsonCallMessage callMessage;
-    JsonReceiptMessage receiptMessage;
+    @JsonProperty
+    final String source;
+
+    @JsonProperty
+    final Integer sourceDevice;
+
+    @JsonProperty
+    final String relay;
+
+    @JsonProperty
+    final long timestamp;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonDataMessage dataMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonSyncMessage syncMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonCallMessage callMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonReceiptMessage receiptMessage;
 
     public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content, Manager m) {
         if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
             SignalServiceAddress source = envelope.getSourceAddress();
             this.source = source.getLegacyIdentifier();
 
     public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content, Manager m) {
         if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
             SignalServiceAddress source = envelope.getSourceAddress();
             this.source = source.getLegacyIdentifier();
-            this.relay = source.getRelay().isPresent() ? source.getRelay().get() : null;
+            this.sourceDevice = envelope.getSourceDevice();
+            this.relay = source.getRelay().orNull();
+        } else if (envelope.isUnidentifiedSender() && content != null) {
+            this.source = content.getSender().getLegacyIdentifier();
+            this.sourceDevice = content.getSenderDevice();
+            this.relay = null;
+        } else {
+            this.source = null;
+            this.sourceDevice = null;
+            this.relay = null;
         }
         }
-        this.sourceDevice = envelope.getSourceDevice();
         this.timestamp = envelope.getTimestamp();
         if (envelope.isReceipt()) {
             this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
         this.timestamp = envelope.getTimestamp();
         if (envelope.isReceipt()) {
             this.receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
+        } else if (content != null && content.getReceiptMessage().isPresent()) {
+            this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
+        } else {
+            this.receiptMessage = null;
         }
         }
-        if (content != null) {
-            if (envelope.isUnidentifiedSender()) {
-                this.source = content.getSender().getLegacyIdentifier();
-                this.sourceDevice = content.getSenderDevice();
-            }
-            if (content.getDataMessage().isPresent()) {
-                this.dataMessage = new JsonDataMessage(content.getDataMessage().get(), m);
-            }
-            if (content.getSyncMessage().isPresent()) {
-                this.syncMessage = new JsonSyncMessage(content.getSyncMessage().get(), m);
-            }
-            if (content.getCallMessage().isPresent()) {
-                this.callMessage = new JsonCallMessage(content.getCallMessage().get());
-            }
-            if (content.getReceiptMessage().isPresent()) {
-                this.receiptMessage = new JsonReceiptMessage(content.getReceiptMessage().get());
-            }
-        }
+
+        this.dataMessage = content != null && content.getDataMessage().isPresent()
+                ? new JsonDataMessage(content.getDataMessage().get(), m)
+                : null;
+        this.syncMessage = content != null && content.getSyncMessage().isPresent()
+                ? new JsonSyncMessage(content.getSyncMessage().get(), m)
+                : null;
+        this.callMessage = content != null && content.getCallMessage().isPresent()
+                ? new JsonCallMessage(content.getCallMessage().get())
+                : null;
     }
 
     public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
         source = messageReceived.getSender();
     }
 
     public JsonMessageEnvelope(Signal.MessageReceived messageReceived) {
         source = messageReceived.getSender();
+        sourceDevice = null;
+        relay = null;
         timestamp = messageReceived.getTimestamp();
         timestamp = messageReceived.getTimestamp();
+        receiptMessage = null;
         dataMessage = new JsonDataMessage(messageReceived);
         dataMessage = new JsonDataMessage(messageReceived);
+        syncMessage = null;
+        callMessage = null;
     }
 
     public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
         source = receiptReceived.getSender();
     }
 
     public JsonMessageEnvelope(Signal.ReceiptReceived receiptReceived) {
         source = receiptReceived.getSender();
+        sourceDevice = null;
+        relay = null;
         timestamp = receiptReceived.getTimestamp();
         receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
         timestamp = receiptReceived.getTimestamp();
         receiptMessage = JsonReceiptMessage.deliveryReceipt(timestamp, List.of(timestamp));
+        dataMessage = null;
+        syncMessage = null;
+        callMessage = null;
     }
 
     public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
         source = messageReceived.getSource();
     }
 
     public JsonMessageEnvelope(Signal.SyncMessageReceived messageReceived) {
         source = messageReceived.getSource();
+        sourceDevice = null;
+        relay = null;
         timestamp = messageReceived.getTimestamp();
         timestamp = messageReceived.getTimestamp();
+        receiptMessage = null;
+        dataMessage = null;
         syncMessage = new JsonSyncMessage(messageReceived);
         syncMessage = new JsonSyncMessage(messageReceived);
+        callMessage = null;
     }
 }
     }
 }
index 10cd0bf4c31d3d7d50446364d6447086227a7bd8..8165bcfaf4277387a3c7992e79ee1f49be5af503 100644 (file)
@@ -1,5 +1,8 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
@@ -9,12 +12,21 @@ import java.util.stream.Collectors;
 
 public class JsonQuote {
 
 
 public class JsonQuote {
 
-    long id;
-    String author;
-    String text;
+    @JsonProperty
+    final long id;
+
+    @JsonProperty
+    final String author;
+
+    @JsonProperty
+    final String text;
 
 
-    List<JsonMention> mentions;
-    List<JsonQuotedAttachment> attachments;
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<JsonMention> mentions;
+
+    @JsonProperty
+    final List<JsonQuotedAttachment> attachments;
 
     JsonQuote(SignalServiceDataMessage.Quote quote, Manager m) {
         this.id = quote.getId();
 
     JsonQuote(SignalServiceDataMessage.Quote quote, Manager m) {
         this.id = quote.getId();
@@ -26,6 +38,8 @@ public class JsonQuote {
                     .stream()
                     .map(quotedMention -> new JsonMention(quotedMention, m))
                     .collect(Collectors.toList());
                     .stream()
                     .map(quotedMention -> new JsonMention(quotedMention, m))
                     .collect(Collectors.toList());
+        } else {
+            this.mentions = null;
         }
 
         if (quote.getAttachments().size() > 0) {
         }
 
         if (quote.getAttachments().size() > 0) {
index bcbbe2a538d49d651b196fddc2430caed9eea656..f3f809dc1fadb3d87e58c8863dd1a34de47d3399 100644 (file)
@@ -1,12 +1,21 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
 public class JsonQuotedAttachment {
 
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
 public class JsonQuotedAttachment {
 
-    String contentType;
-    String filename;
-    JsonAttachment thumbnail;
+    @JsonProperty
+    final String contentType;
+
+    @JsonProperty
+    final String filename;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonAttachment thumbnail;
 
     JsonQuotedAttachment(SignalServiceDataMessage.Quote.QuotedAttachment quotedAttachment) {
         contentType = quotedAttachment.getContentType();
 
     JsonQuotedAttachment(SignalServiceDataMessage.Quote.QuotedAttachment quotedAttachment) {
         contentType = quotedAttachment.getContentType();
index 5e978fe09adbe0bd2dd2e15d1fe6468816c2af1f..2fa15b48579c87d73af5f96a2663b411a3e598ad 100644 (file)
@@ -1,14 +1,23 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Reaction;
 
 public class JsonReaction {
 
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Reaction;
 
 public class JsonReaction {
 
-    String emoji;
-    String targetAuthor;
-    long targetSentTimestamp;
-    boolean isRemove;
+    @JsonProperty
+    final String emoji;
+
+    @JsonProperty
+    final String targetAuthor;
+
+    @JsonProperty
+    final long targetSentTimestamp;
+
+    @JsonProperty
+    final boolean isRemove;
 
     JsonReaction(Reaction reaction, Manager m) {
         this.emoji = reaction.getEmoji();
 
     JsonReaction(Reaction reaction, Manager m) {
         this.emoji = reaction.getEmoji();
index ccd5960b3e3a53f69667e5a5af428c239038d821..e32009e13c72879d3f07b39ab71b32c769d897e6 100644 (file)
@@ -1,25 +1,29 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 
 import java.util.List;
 
 class JsonReceiptMessage {
 
 import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
 
 import java.util.List;
 
 class JsonReceiptMessage {
 
-    long when;
-    boolean isDelivery;
-    boolean isRead;
-    List<Long> timestamps;
+    @JsonProperty
+    final long when;
 
 
-    JsonReceiptMessage(SignalServiceReceiptMessage receiptMessage) {
+    @JsonProperty
+    final boolean isDelivery;
+
+    @JsonProperty
+    final boolean isRead;
 
 
+    @JsonProperty
+    final List<Long> timestamps;
+
+    JsonReceiptMessage(SignalServiceReceiptMessage receiptMessage) {
         this.when = receiptMessage.getWhen();
         this.when = receiptMessage.getWhen();
-        if (receiptMessage.isDeliveryReceipt()) {
-            this.isDelivery = true;
-        }
-        if (receiptMessage.isReadReceipt()) {
-            this.isRead = true;
-        }
+        this.isDelivery = receiptMessage.isDeliveryReceipt();
+        this.isRead = receiptMessage.isReadReceipt();
         this.timestamps = receiptMessage.getTimestamps();
     }
 
         this.timestamps = receiptMessage.getTimestamps();
     }
 
index ea7a581598741170b2f298b958b64fda3d469bc3..e56ddf3fef5d4d552d6f1f1006660c6565d16e12 100644 (file)
@@ -1,19 +1,25 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
 import java.util.Base64;
 
 public class JsonSticker {
 
 import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
 
 import java.util.Base64;
 
 public class JsonSticker {
 
-    String packId;
-    String packKey;
-    int stickerId;
+    @JsonProperty
+    final String packId;
+
+    @JsonProperty
+    final String packKey;
+
+    @JsonProperty
+    final int stickerId;
 
     public JsonSticker(SignalServiceDataMessage.Sticker sticker) {
         this.packId = Base64.getEncoder().encodeToString(sticker.getPackId());
         this.packKey = Base64.getEncoder().encodeToString(sticker.getPackKey());
         this.stickerId = sticker.getStickerId();
 
     public JsonSticker(SignalServiceDataMessage.Sticker sticker) {
         this.packId = Base64.getEncoder().encodeToString(sticker.getPackId());
         this.packKey = Base64.getEncoder().encodeToString(sticker.getPackKey());
         this.stickerId = sticker.getStickerId();
-        // TODO also download sticker image ??
     }
 }
     }
 }
index 7ea75bbdbdd4d5e60d31e6377e26db5411dc264b..d93351f16d01b5a2b1da1fc7de6dd9817b2cea52 100644 (file)
@@ -1,18 +1,23 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
+import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 class JsonSyncDataMessage extends JsonDataMessage {
 
 
 class JsonSyncDataMessage extends JsonDataMessage {
 
-    String destination;
+    @JsonProperty
+    final String destination;
 
     JsonSyncDataMessage(SentTranscriptMessage transcriptMessage, Manager m) {
         super(transcriptMessage.getMessage(), m);
 
     JsonSyncDataMessage(SentTranscriptMessage transcriptMessage, Manager m) {
         super(transcriptMessage.getMessage(), m);
-        if (transcriptMessage.getDestination().isPresent()) {
-            this.destination = transcriptMessage.getDestination().get().getLegacyIdentifier();
-        }
+
+        this.destination = transcriptMessage.getDestination()
+                .transform(SignalServiceAddress::getLegacyIdentifier)
+                .orNull();
     }
 
     JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) {
     }
 
     JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) {
index f29bc02eeea43b4c2b852c49167a4797c32cb7fd..11ecbbc805daaba9300ce338d1749aef86cf0fa1 100644 (file)
@@ -1,13 +1,16 @@
 package org.asamk.signal.json;
 
 package org.asamk.signal.json;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
 import org.asamk.Signal;
 import org.asamk.signal.manager.Manager;
-import org.whispersystems.signalservice.api.messages.multidevice.ReadMessage;
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
 import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 
-import java.util.ArrayList;
+import java.util.Base64;
 import java.util.List;
 import java.util.List;
+import java.util.stream.Collectors;
 
 enum JsonSyncMessageType {
     CONTACTS_SYNC,
 
 enum JsonSyncMessageType {
     CONTACTS_SYNC,
@@ -17,23 +20,57 @@ enum JsonSyncMessageType {
 
 class JsonSyncMessage {
 
 
 class JsonSyncMessage {
 
-    JsonSyncDataMessage sentMessage;
-    List<String> blockedNumbers;
-    List<ReadMessage> readMessages;
-    JsonSyncMessageType type;
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonSyncDataMessage sentMessage;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<String> blockedNumbers;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<String> blockedGroupIds;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final List<JsonSyncReadMessage> readMessages;
+
+    @JsonProperty
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    final JsonSyncMessageType type;
 
     JsonSyncMessage(SignalServiceSyncMessage syncMessage, Manager m) {
 
     JsonSyncMessage(SignalServiceSyncMessage syncMessage, Manager m) {
-        if (syncMessage.getSent().isPresent()) {
-            this.sentMessage = new JsonSyncDataMessage(syncMessage.getSent().get(), m);
-        }
+        this.sentMessage = syncMessage.getSent().isPresent()
+                ? new JsonSyncDataMessage(syncMessage.getSent().get(), m)
+                : null;
         if (syncMessage.getBlockedList().isPresent()) {
         if (syncMessage.getBlockedList().isPresent()) {
-            this.blockedNumbers = new ArrayList<>(syncMessage.getBlockedList().get().getAddresses().size());
-            for (SignalServiceAddress address : syncMessage.getBlockedList().get().getAddresses()) {
-                this.blockedNumbers.add(address.getLegacyIdentifier());
-            }
+            final Base64.Encoder base64 = Base64.getEncoder();
+            this.blockedNumbers = syncMessage.getBlockedList()
+                    .get()
+                    .getAddresses()
+                    .stream()
+                    .map(SignalServiceAddress::getLegacyIdentifier)
+                    .collect(Collectors.toList());
+            this.blockedGroupIds = syncMessage.getBlockedList()
+                    .get()
+                    .getGroupIds()
+                    .stream()
+                    .map(base64::encodeToString)
+                    .collect(Collectors.toList());
+        } else {
+            this.blockedNumbers = null;
+            this.blockedGroupIds = null;
         }
         if (syncMessage.getRead().isPresent()) {
         }
         if (syncMessage.getRead().isPresent()) {
-            this.readMessages = syncMessage.getRead().get();
+            this.readMessages = syncMessage.getRead()
+                    .get()
+                    .stream()
+                    .map(message -> new JsonSyncReadMessage(message.getSender().getLegacyIdentifier(),
+                            message.getTimestamp()))
+                    .collect(Collectors.toList());
+        } else {
+            this.readMessages = null;
         }
 
         if (syncMessage.getContacts().isPresent()) {
         }
 
         if (syncMessage.getContacts().isPresent()) {
@@ -42,10 +79,16 @@ class JsonSyncMessage {
             this.type = JsonSyncMessageType.GROUPS_SYNC;
         } else if (syncMessage.getRequest().isPresent()) {
             this.type = JsonSyncMessageType.REQUEST_SYNC;
             this.type = JsonSyncMessageType.GROUPS_SYNC;
         } else if (syncMessage.getRequest().isPresent()) {
             this.type = JsonSyncMessageType.REQUEST_SYNC;
+        } else {
+            this.type = null;
         }
     }
 
     JsonSyncMessage(Signal.SyncMessageReceived messageReceived) {
         }
     }
 
     JsonSyncMessage(Signal.SyncMessageReceived messageReceived) {
-        sentMessage = new JsonSyncDataMessage(messageReceived);
+        this.sentMessage = new JsonSyncDataMessage(messageReceived);
+        this.blockedNumbers = null;
+        this.blockedGroupIds = null;
+        this.readMessages = null;
+        this.type = null;
     }
 }
     }
 }
diff --git a/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java b/src/main/java/org/asamk/signal/json/JsonSyncReadMessage.java
new file mode 100644 (file)
index 0000000..d65b067
--- /dev/null
@@ -0,0 +1,17 @@
+package org.asamk.signal.json;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+class JsonSyncReadMessage {
+
+    @JsonProperty
+    final String sender;
+
+    @JsonProperty
+    final long timestamp;
+
+    public JsonSyncReadMessage(final String sender, final long timestamp) {
+        this.sender = sender;
+        this.timestamp = timestamp;
+    }
+}