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