From ae49f5352a14180cec9c1d287486f1d59ef2c71a Mon Sep 17 00:00:00 2001
From: Simon Convent <simon.convent@grandcentrix.net>
Date: Thu, 4 Apr 2024 16:05:23 +0200
Subject: [PATCH] Add JacksonRegistrationUpdateSerializer to fix serialization
 issue

---
 .../server/demo/servlet/EventServlet.java     |  4 +-
 .../JacksonRegistrationUpdateSerializer.java  | 60 +++++++++++++++++++
 2 files changed, 62 insertions(+), 2 deletions(-)
 create mode 100644 leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/JacksonRegistrationUpdateSerializer.java

diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
index 5ce76d6eba..7b0c617e28 100644
--- a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/EventServlet.java
@@ -45,6 +45,7 @@
 import org.eclipse.leshan.server.demo.servlet.json.JacksonLinkSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.JacksonLwM2mNodeSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.JacksonRegistrationSerializer;
+import org.eclipse.leshan.server.demo.servlet.json.JacksonRegistrationUpdateSerializer;
 import org.eclipse.leshan.server.demo.servlet.json.JacksonVersionSerializer;
 import org.eclipse.leshan.server.demo.servlet.log.CoapMessage;
 import org.eclipse.leshan.server.demo.servlet.log.CoapMessageListener;
@@ -302,8 +303,7 @@ public EventServlet(LeshanServer server) {
         SimpleModule module = new SimpleModule();
         module.addSerializer(Link.class, new JacksonLinkSerializer());
         module.addSerializer(Registration.class, new JacksonRegistrationSerializer(server.getPresenceService()));
-        // TODO like we have a dedicated serializer for Registration, we maybe need one for RegistrationUpdate
-        // needed for : registrationListener.updated(RegistrationUpdate, Registration, Registration)
+        module.addSerializer(RegistrationUpdate.class, new JacksonRegistrationUpdateSerializer());
         module.addSerializer(LwM2mNode.class, new JacksonLwM2mNodeSerializer());
         module.addSerializer(Version.class, new JacksonVersionSerializer());
         mapper.registerModule(module);
diff --git a/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/JacksonRegistrationUpdateSerializer.java b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/JacksonRegistrationUpdateSerializer.java
new file mode 100644
index 0000000000..43ce7a3c89
--- /dev/null
+++ b/leshan-server-demo/src/main/java/org/eclipse/leshan/server/demo/servlet/json/JacksonRegistrationUpdateSerializer.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2024 Sierra Wireless and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * and Eclipse Distribution License v1.0 which accompany this distribution.
+ *
+ * The Eclipse Public License is available at
+ *    http://www.eclipse.org/legal/epl-v20.html
+ * and the Eclipse Distribution License is available at
+ *    http://www.eclipse.org/org/documents/edl-v10.html.
+ *
+ * Contributors:
+ *     Simon Convent - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.leshan.server.demo.servlet.json;
+
+import java.io.IOException;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.leshan.core.peer.OscoreIdentity;
+import org.eclipse.leshan.server.registration.RegistrationUpdate;
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+public class JacksonRegistrationUpdateSerializer extends StdSerializer<RegistrationUpdate> {
+
+    private static final long serialVersionUID = -2828961931685566265L;
+
+    protected JacksonRegistrationUpdateSerializer(Class<RegistrationUpdate> t) {
+        super(t);
+    }
+
+    public JacksonRegistrationUpdateSerializer() {
+        this(null);
+    }
+
+    @Override
+    public void serialize(RegistrationUpdate src, JsonGenerator gen, SerializerProvider provider) throws IOException {
+        Map<String, Object> map = new LinkedHashMap<>();
+
+        map.put("registrationId", src.getRegistrationId());
+
+        map.put("address", src.getAddress().getHostAddress() + ":" + src.getPort());
+        map.put("smsNumber", src.getSmsNumber());
+        map.put("lifetime", src.getLifeTimeInSec());
+
+        map.put("alternatePath", src.getAlternatePath());
+        map.put("objectLinks", src.getObjectLinks());
+        // TODO secure means over TLS (not OSCORE) but this is not clear so maybe we need to change this.
+        map.put("secure", src.getClientTransportData().getIdentity().isSecure()
+                && !(src.getClientTransportData().getIdentity() instanceof OscoreIdentity));
+        map.put("additionalAttributes", src.getAdditionalAttributes());
+
+        gen.writeObject(map);
+    }
+}