JAMES-2578 Add an Optional serializer

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/d66fa22b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/d66fa22b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/d66fa22b

Branch: refs/heads/master
Commit: d66fa22b9af271d0d56e326a8c4f6c31bc399650
Parents: c1f4ba5
Author: Benoit Tellier <btell...@linagora.com>
Authored: Tue Oct 30 09:08:02 2018 +0700
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Thu Nov 1 11:03:27 2018 +0700

----------------------------------------------------------------------
 .../java/org/apache/mailet/AttributeValue.java  |  9 ++++
 .../main/java/org/apache/mailet/Serializer.java | 34 ++++++++++++-
 .../org/apache/mailet/AttributeValueTest.java   | 52 ++++++++++++++++++++
 3 files changed, 94 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d66fa22b/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
----------------------------------------------------------------------
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 6bf3a6e..4ae6952 100644
--- a/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
+++ b/mailet/api/src/main/java/org/apache/mailet/AttributeValue.java
@@ -87,6 +87,12 @@ public class AttributeValue<T> {
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
+    public static <T> AttributeValue<Optional<AttributeValue<T>>> 
of(Optional<AttributeValue<T>> value) {
+        Preconditions.checkNotNull(value, "value should not be null");
+        return new AttributeValue<>(value, new 
Serializer.OptionalSerializer<>());
+    }
+
+    @SuppressWarnings({ "unchecked", "rawtypes" })
     public static AttributeValue<Collection<AttributeValue<?>>> 
of(Collection<AttributeValue<?>> value) {
         Preconditions.checkNotNull(value, "value should not be null");
         return new AttributeValue<>(value, new 
Serializer.CollectionSerializer());
@@ -135,6 +141,9 @@ public class AttributeValue<T> {
         if (value instanceof URL) {
             return of((URL) value);
         }
+        if (value instanceof Optional) {
+            return of((Optional) value);
+        }
         if (value instanceof Serializable) {
             return ofSerializable((Serializable) value);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d66fa22b/mailet/api/src/main/java/org/apache/mailet/Serializer.java
----------------------------------------------------------------------
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 514b464..e3eb47a 100644
--- a/mailet/api/src/main/java/org/apache/mailet/Serializer.java
+++ b/mailet/api/src/main/java/org/apache/mailet/Serializer.java
@@ -47,6 +47,7 @@ import com.fasterxml.jackson.databind.node.FloatNode;
 import com.fasterxml.jackson.databind.node.IntNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.LongNode;
+import com.fasterxml.jackson.databind.node.NullNode;
 import com.fasterxml.jackson.databind.node.NumericNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.fasterxml.jackson.databind.node.TextNode;
@@ -82,7 +83,8 @@ public interface Serializer<T> {
                     URL_SERIALIZER,
                     new CollectionSerializer<>(),
                     new MapSerializer<>(),
-                    new FSTSerializer())
+                    new FSTSerializer(),
+                    new OptionalSerializer<>())
                 .collect(ImmutableMap.toImmutableMap(Serializer::getName, 
Function.identity()));
         }
 
@@ -405,6 +407,36 @@ public interface Serializer<T> {
         }
     }
 
+    class OptionalSerializer<U> implements 
Serializer<Optional<AttributeValue<U>>> {
+        @Override
+        public JsonNode serialize(Optional<AttributeValue<U>> object) {
+            return object.map(AttributeValue::toJson)
+                .orElse(NullNode.getInstance());
+        }
+
+        @Override
+        public Optional<Optional<AttributeValue<U>>> deserialize(JsonNode 
json) {
+            if (json instanceof ObjectNode) {
+                AttributeValue<U> value = (AttributeValue<U>) 
AttributeValue.fromJson(json);
+                return Optional.of(Optional.of(value));
+            } else if (json instanceof NullNode) {
+                return Optional.of(Optional.empty());
+            } else {
+                return Optional.empty();
+            }
+        }
+
+        @Override
+        public String getName() {
+            return "OptionalSerializer";
+        }
+
+        @Override
+        public boolean equals(Object other) {
+            return this.getClass() == other.getClass();
+        }
+    }
+
     class FSTSerializer implements Serializer<Serializable> {
         static final FSTConfiguration CONFIGURATION = 
FSTConfiguration.createJsonConfiguration();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d66fa22b/mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java
----------------------------------------------------------------------
diff --git a/mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java 
b/mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java
index dd3f43f..95cb0c2 100644
--- a/mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java
+++ b/mailet/api/src/test/java/org/apache/mailet/AttributeValueTest.java
@@ -446,6 +446,58 @@ class AttributeValueTest {
         }
     }
 
+    @Nested
+    class OptionalSerialization {
+        @Test
+        void nullMapShouldThrowAnException() {
+            assertThatNullPointerException().
+                isThrownBy(() -> AttributeValue.of((Optional) null));
+        }
+
+        @Test
+        void emptyOptionalShouldBeSerializedAndBack() {
+            AttributeValue<?> expected = AttributeValue.of(Optional.empty());
+            JsonNode json = expected.toJson();
+            AttributeValue<?> actual = AttributeValue.fromJson(json);
+
+            assertThat(actual).isEqualTo(expected);
+        }
+
+        @Test
+        void optionalShouldBeSerializedAndBack() {
+            AttributeValue<?> expected = 
AttributeValue.of(Optional.of(AttributeValue.of(42)));
+            JsonNode json = expected.toJson();
+            AttributeValue<?> actual = AttributeValue.fromJson(json);
+
+            assertThat(actual).isEqualTo(expected);
+        }
+
+        @Test
+        void fromJsonStringShouldReturnEmptyOptionalWhenEmptyOptional() throws 
Exception {
+            AttributeValue<?> expected = AttributeValue.of(Optional.empty());
+
+            AttributeValue<?> actual = 
AttributeValue.fromJsonString("{\"serializer\":\"OptionalSerializer\",\"value\":null}");
+
+            assertThat(actual).isEqualTo(expected);
+        }
+
+        @Test
+        void fromJsonStringShouldReturnOptional() throws Exception {
+            AttributeValue<Optional<AttributeValue<Integer>>> expected = 
AttributeValue.of(
+                Optional.of(AttributeValue.of(1)));
+
+            AttributeValue<?> actual = 
AttributeValue.fromJsonString("{\"serializer\":\"OptionalSerializer\",\"value\":{\"serializer\":\"IntSerializer\",\"value\":1}}");
+
+            assertThat(actual).isEqualTo(expected);
+        }
+
+        @Test
+        void fromJsonStringShouldThrowOnMalformedFormattedJson() {
+            assertThatIllegalStateException()
+                .isThrownBy(() -> 
AttributeValue.fromJsonString("{\"serializer\":\"OptionalSerializer\",\"value\":
 []}"));
+        }
+    }
+
     @Test
     void fromJsonStringShouldThrowOnUnknownSerializer() {
         assertThatIllegalStateException()


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to