You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/10/04 02:19:29 UTC

[james-project] 01/04: JAMES-3828 Smarter duplication for AttributeValue

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 10394598ed553e0a419658a0096805d5812d48fb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Sep 29 11:50:48 2022 +0700

    JAMES-3828 Smarter duplication for AttributeValue
    
    Embed type dependant knowledge onto the serializer and do type specific optimization
    to avoid the serialization/deserialization upon splitting emails.
---
 .../java/org/apache/mailet/AttributeValue.java     |  4 +-
 .../main/java/org/apache/mailet/Serializer.java    | 78 ++++++++++++++++++++++
 2 files changed, 79 insertions(+), 3 deletions(-)

diff --git a/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java b/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
index 41fa188b91..4a64cc1078 100644
--- a/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
+++ b/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
@@ -244,10 +244,8 @@ public class AttributeValue<T> {
         }
     }
 
-    //FIXME : poor performance
-    @SuppressWarnings("unchecked")
     public AttributeValue<T> duplicate() {
-        return (AttributeValue<T>) fromJson(toJson());
+        return new AttributeValue<>(serializer.duplicate(value), serializer);
     }
 
     public JsonNode toJson() {
diff --git a/mailet/api/src/main/java/org/apache/mailet/Serializer.java b/mailet/api/src/main/java/org/apache/mailet/Serializer.java
index dd833a6c48..5ba1c69c74 100644
--- a/mailet/api/src/main/java/org/apache/mailet/Serializer.java
+++ b/mailet/api/src/main/java/org/apache/mailet/Serializer.java
@@ -36,6 +36,7 @@ import java.util.Optional;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
+import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.mailbox.model.MessageIdDto;
 import org.apache.james.util.streams.Iterators;
 import org.nustaq.serialization.FSTConfiguration;
@@ -71,6 +72,8 @@ public interface Serializer<T> {
 
     String getName();
 
+    T duplicate(T value);
+
     class Registry {
 
         private static ImmutableMap<String, Serializer<?>> serializers;
@@ -115,6 +118,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Boolean duplicate(Boolean value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "BooleanSerializer";
@@ -148,6 +156,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public String duplicate(String value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "StringSerializer";
@@ -181,6 +194,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Integer duplicate(Integer value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "IntSerializer";
@@ -216,6 +234,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Long duplicate(Long value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "LongSerializer";
@@ -251,6 +274,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Float duplicate(Float value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "FloatSerializer";
@@ -284,6 +312,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Double duplicate(Double value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "DoubleSerializer";
@@ -319,6 +352,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public ZonedDateTime duplicate(ZonedDateTime value) {
+            return ZonedDateTime.ofInstant(value.toInstant(), value.getZone());
+        }
+
         @Override
         public String getName() {
             return "DateSerializer";
@@ -352,6 +390,11 @@ public interface Serializer<T> {
                     .map(MessageIdDto::new);
         }
 
+        @Override
+        public MessageIdDto duplicate(MessageIdDto value) {
+            return value;
+        }
+
         @Override
         public String getName() {
             return "MessageIdDtoSerializer";
@@ -426,6 +469,11 @@ public interface Serializer<T> {
         public int hashCode() {
             return Objects.hash(getClass());
         }
+
+        @Override
+        public T duplicate(T value) {
+            return deserialize(serialize(value)).get();
+        }
     }
 
     class UrlSerializer implements Serializer<URL> {
@@ -459,6 +507,11 @@ public interface Serializer<T> {
         public int hashCode() {
             return Objects.hash(getClass());
         }
+
+        @Override
+        public URL duplicate(URL value) {
+            return value;
+        }
     }
 
     Serializer<URL> URL_SERIALIZER = new UrlSerializer();
@@ -484,6 +537,13 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Collection<AttributeValue<U>> duplicate(Collection<AttributeValue<U>> value) {
+            return value.stream()
+                .map(AttributeValue::duplicate)
+                .collect(ImmutableList.toImmutableList());
+        }
+
         @Override
         public String getName() {
             return "CollectionSerializer";
@@ -522,6 +582,14 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Map<String, AttributeValue<U>> duplicate(Map<String, AttributeValue<U>> value) {
+            return value.entrySet()
+                .stream()
+                .map(entry -> Pair.of(entry.getKey(), entry.getValue().duplicate()))
+                .collect(ImmutableMap.toImmutableMap(Pair::getKey, Pair::getValue));
+        }
+
         @Override
         public String getName() {
             return "MapSerializer";
@@ -558,6 +626,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Optional<AttributeValue<U>> duplicate(Optional<AttributeValue<U>> value) {
+            return value.map(AttributeValue::duplicate);
+        }
+
         @Override
         public String getName() {
             return "OptionalSerializer";
@@ -596,6 +669,11 @@ public interface Serializer<T> {
             }
         }
 
+        @Override
+        public Serializable duplicate(Serializable value) {
+            return deserialize(serialize(value)).get();
+        }
+
         @Override
         public String getName() {
             return "FSTSerializer";


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org