From 282efdf67364556c1cb76bcaae14b35c9ce2af9b Mon Sep 17 00:00:00 2001
From: Michele Rastelli <michele@arangodb.com>
Date: Thu, 16 Jan 2025 13:53:06 +0100
Subject: [PATCH] made BaseDocument and BaseEdgeDocument serializable

---
 .../arangodb/entity/AbstractBaseDocument.java |  5 +++-
 .../serialization-config.json                 | 12 +++++++++
 .../serialization-config.json                 | 12 +++++++++
 .../java/com/arangodb/SerializableTest.java   | 26 +++++++++++++++++++
 4 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/core/src/main/java/com/arangodb/entity/AbstractBaseDocument.java b/core/src/main/java/com/arangodb/entity/AbstractBaseDocument.java
index 2bd5d4982..5019834c8 100644
--- a/core/src/main/java/com/arangodb/entity/AbstractBaseDocument.java
+++ b/core/src/main/java/com/arangodb/entity/AbstractBaseDocument.java
@@ -26,6 +26,7 @@
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 
+import java.io.Serializable;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -35,7 +36,9 @@
  * @author Mark Vollmary
  * @author Michele Rastelli
  */
-abstract class AbstractBaseDocument {
+abstract class AbstractBaseDocument implements Serializable {
+
+    private static final long serialVersionUID = 6985324876843525239L;
 
     private static final String[] META_PROPS = new String[]{
             DocumentFields.ID,
diff --git a/driver/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver/serialization-config.json b/driver/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver/serialization-config.json
index 7160b9bd4..e5d77727d 100644
--- a/driver/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver/serialization-config.json
+++ b/driver/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver/serialization-config.json
@@ -10,5 +10,17 @@
   },
   {
     "name": "com.arangodb.internal.net.ArangoDBRedirectException"
+  },
+  {
+    "name": "com.arangodb.entity.AbstractBaseDocument"
+  },
+  {
+    "name": "com.arangodb.entity.BaseDocument"
+  },
+  {
+    "name": "com.arangodb.entity.BaseEdgeDocument"
+  },
+  {
+    "name": "java.util.HashMap"
   }
 ]
diff --git a/shaded/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver-shaded/serialization-config.json b/shaded/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver-shaded/serialization-config.json
index 7160b9bd4..e5d77727d 100644
--- a/shaded/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver-shaded/serialization-config.json
+++ b/shaded/src/main/resources/META-INF/native-image/com.arangodb/arangodb-java-driver-shaded/serialization-config.json
@@ -10,5 +10,17 @@
   },
   {
     "name": "com.arangodb.internal.net.ArangoDBRedirectException"
+  },
+  {
+    "name": "com.arangodb.entity.AbstractBaseDocument"
+  },
+  {
+    "name": "com.arangodb.entity.BaseDocument"
+  },
+  {
+    "name": "com.arangodb.entity.BaseEdgeDocument"
+  },
+  {
+    "name": "java.util.HashMap"
   }
 ]
diff --git a/test-functional/src/test/java/com/arangodb/SerializableTest.java b/test-functional/src/test/java/com/arangodb/SerializableTest.java
index 17b1ec1da..a915a74aa 100644
--- a/test-functional/src/test/java/com/arangodb/SerializableTest.java
+++ b/test-functional/src/test/java/com/arangodb/SerializableTest.java
@@ -1,5 +1,7 @@
 package com.arangodb;
 
+import com.arangodb.entity.BaseDocument;
+import com.arangodb.entity.BaseEdgeDocument;
 import com.arangodb.entity.ErrorEntity;
 import com.arangodb.internal.net.ArangoDBRedirectException;
 import com.fasterxml.jackson.databind.JsonNode;
@@ -50,6 +52,30 @@ void serializeArangoDBMultipleException() throws IOException, ClassNotFoundExcep
         assertThat(e2.getExceptions().iterator().next().getMessage()).isEqualTo("foo");
     }
 
+    @Test
+    void serializeBaseDocument() throws IOException, ClassNotFoundException {
+        BaseDocument doc = new BaseDocument();
+        doc.setKey("test");
+        doc.setId("id");
+        doc.setRevision("revision");
+        doc.addAttribute("foo", "bar");
+        BaseDocument doc2 = roundTrip(doc);
+        assertThat(doc2).isEqualTo(doc);
+    }
+
+    @Test
+    void serializeBaseEdgeDocument() throws IOException, ClassNotFoundException {
+        BaseEdgeDocument doc = new BaseEdgeDocument();
+        doc.setKey("test");
+        doc.setId("id");
+        doc.setRevision("revision");
+        doc.setFrom("from");
+        doc.setTo("to");
+        doc.addAttribute("foo", "bar");
+        BaseDocument doc2 = roundTrip(doc);
+        assertThat(doc2).isEqualTo(doc);
+    }
+
     private <T> T roundTrip(T input) throws IOException, ClassNotFoundException {
         ByteArrayOutputStream os = new ByteArrayOutputStream();
         ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);