You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/03/13 08:12:48 UTC

[07/13] james-project git commit: JAMES-2346 JSON de-serialization for MDN disposition types

JAMES-2346 JSON de-serialization for MDN disposition types


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

Branch: refs/heads/master
Commit: 857074e42956c7075eb047beede625964243d425
Parents: 0f11476
Author: benwa <bt...@linagora.com>
Authored: Thu Mar 8 10:55:24 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Mar 13 15:11:54 2018 +0700

----------------------------------------------------------------------
 server/protocols/jmap/pom.xml                   |   4 +
 .../james/jmap/json/ObjectMapperFactory.java    |  63 +++++++++-
 .../jmap/json/ObjectMapperFactoryTest.java      | 116 ++++++++++++++++++-
 3 files changed, 176 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/857074e4/server/protocols/jmap/pom.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/pom.xml b/server/protocols/jmap/pom.xml
index 546afd7..e58ce38 100644
--- a/server/protocols/jmap/pom.xml
+++ b/server/protocols/jmap/pom.xml
@@ -82,6 +82,10 @@
         </dependency>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-mdn</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-core</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/857074e4/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/ObjectMapperFactory.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/ObjectMapperFactory.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/ObjectMapperFactory.java
index 36c76fa..42fbc0b 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/ObjectMapperFactory.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/json/ObjectMapperFactory.java
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.json;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Set;
 
 import javax.inject.Inject;
@@ -28,6 +29,9 @@ import org.apache.james.jmap.model.mailbox.Rights;
 import org.apache.james.mailbox.Role;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mdn.action.mode.DispositionActionMode;
+import org.apache.james.mdn.sending.mode.DispositionSendingMode;
+import org.apache.james.mdn.type.DispositionType;
 
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.core.JsonParser;
@@ -45,7 +49,9 @@ import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.datatype.guava.GuavaModule;
 import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 
 public class ObjectMapperFactory {
@@ -72,9 +78,16 @@ public class ObjectMapperFactory {
         mailboxIdModule.addKeyDeserializer(Rights.Username.class, new UsernameKeyDeserializer());
         mailboxIdModule.addDeserializer(Rights.Right.class, new RightDeserializer());
 
+        SimpleModule mdnModule = new SimpleModule();
+        mailboxIdModule.addDeserializer(DispositionActionMode.class, new MDNActionModeDeserializer());
+        mailboxIdModule.addDeserializer(DispositionSendingMode.class, new MDNSendingModeDeserializer());
+        mailboxIdModule.addDeserializer(DispositionType.class, new MDNTypeDeserializer());
+
         mailboxIdModule.setMixInAnnotation(Role.class, RoleMixIn.class);
 
-        jacksonModules = JACKSON_BASE_MODULES.add(mailboxIdModule).build();
+        jacksonModules = JACKSON_BASE_MODULES.add(mailboxIdModule)
+            .add(mdnModule)
+            .build();
     }
 
     public ObjectMapper forParsing() {
@@ -89,6 +102,48 @@ public class ObjectMapperFactory {
                 .registerModules(jacksonModules);
     }
 
+    public static class MDNActionModeDeserializer extends JsonDeserializer<DispositionActionMode> {
+        private static final ImmutableList<String> ALLOWED_VALUES = Arrays.stream(DispositionActionMode.values())
+            .map(DispositionActionMode::getValue)
+            .collect(Guavate.toImmutableList());
+
+        @Override
+        public DispositionActionMode deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            String value = jsonParser.getValueAsString();
+            return DispositionActionMode.fromString(value)
+                .orElseThrow(() -> new IllegalStateException(
+                    String.format("Unrecognized MDN Disposition action mode %s. Should be one of %s", value, ALLOWED_VALUES)));
+        }
+    }
+
+    public static class MDNSendingModeDeserializer extends JsonDeserializer<DispositionSendingMode> {
+        private static final ImmutableList<String> ALLOWED_VALUES = Arrays.stream(DispositionSendingMode.values())
+            .map(DispositionSendingMode::getValue)
+            .collect(Guavate.toImmutableList());
+
+        @Override
+        public DispositionSendingMode deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            String value = jsonParser.getValueAsString();
+            return DispositionSendingMode.fromString(value)
+                .orElseThrow(() -> new IllegalStateException(
+                    String.format("Unrecognized MDN Disposition sending mode %s. Should be one of %s", value, ALLOWED_VALUES)));
+        }
+    }
+
+    public static class MDNTypeDeserializer extends JsonDeserializer<DispositionType> {
+        private static final ImmutableList<String> ALLOWED_VALUES = Arrays.stream(DispositionType.values())
+            .map(DispositionType::getValue)
+            .collect(Guavate.toImmutableList());
+
+        @Override
+        public DispositionType deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
+            String value = jsonParser.getValueAsString();
+            return DispositionType.fromString(value)
+                .orElseThrow(() -> new IllegalStateException(
+                    String.format("Unrecognized MDN Disposition type %s. Should be one of %s", value, ALLOWED_VALUES)));
+        }
+    }
+
     public static class MailboxIdDeserializer extends JsonDeserializer<MailboxId> {
         private MailboxId.Factory factory;
 
@@ -112,7 +167,7 @@ public class ObjectMapperFactory {
 
     public static class UsernameKeyDeserializer extends KeyDeserializer {
         @Override
-        public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        public Object deserializeKey(String key, DeserializationContext ctxt) {
             return new Rights.Username(key);
         }
     }
@@ -136,7 +191,7 @@ public class ObjectMapperFactory {
         }
 
         @Override
-        public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        public Object deserializeKey(String key, DeserializationContext ctxt) {
             return factory.fromString(key);
         }
     }
@@ -170,7 +225,7 @@ public class ObjectMapperFactory {
         }
 
         @Override
-        public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
+        public Object deserializeKey(String key, DeserializationContext ctxt) {
             return factory.fromString(key);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/857074e4/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ObjectMapperFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ObjectMapperFactoryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ObjectMapperFactoryTest.java
index 8a181d7..f71d38d 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ObjectMapperFactoryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/json/ObjectMapperFactoryTest.java
@@ -28,6 +28,9 @@ import org.apache.james.jmap.model.mailbox.Rights;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mdn.action.mode.DispositionActionMode;
+import org.apache.james.mdn.sending.mode.DispositionSendingMode;
+import org.apache.james.mdn.type.DispositionType;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -95,6 +98,113 @@ public class ObjectMapperFactoryTest {
     }
 
     @Test
+    public void readValueShouldParseActionModeWhenAutomatic() throws Exception {
+        DispositionActionMode actual = testee.forParsing()
+            .readValue("\"" + DispositionActionMode.Automatic.getValue() + "\"",
+                DispositionActionMode.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionActionMode.Automatic);
+    }
+
+    @Test
+    public void readValueShouldParseActionModeWhenManual() throws Exception {
+        DispositionActionMode actual = testee.forParsing()
+            .readValue("\"" + DispositionActionMode.Manual.getValue() + "\"",
+                DispositionActionMode.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionActionMode.Manual);
+    }
+
+    @Test
+    public void readValueShouldFailOnInvalidActionMode() {
+        assertThatThrownBy(() -> testee.forParsing()
+            .readValue("\"illegal\"",
+                DispositionActionMode.class))
+            .isInstanceOf(IllegalStateException.class)
+            .hasMessage("Unrecognized MDN Disposition action mode illegal. Should be one of [manual-action, automatic-action]");
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenAutomatic() throws Exception {
+        DispositionSendingMode actual = testee.forParsing()
+            .readValue("\"" + DispositionSendingMode.Automatic.getValue() + "\"",
+                DispositionSendingMode.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionSendingMode.Automatic);
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenManual() throws Exception {
+        DispositionSendingMode actual = testee.forParsing()
+            .readValue("\"" + DispositionSendingMode.Manual.getValue() + "\"",
+                DispositionSendingMode.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionSendingMode.Manual);
+    }
+
+    @Test
+    public void readValueShouldFailOnInvalidSendingMode() {
+        assertThatThrownBy(() -> testee.forParsing()
+            .readValue("\"illegal\"",
+                DispositionSendingMode.class))
+            .isInstanceOf(IllegalStateException.class)
+            .hasMessage("Unrecognized MDN Disposition sending mode illegal. Should be one of [MDN-sent-manually, MDN-sent-automatically]");
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenDeleted() throws Exception {
+        DispositionType actual = testee.forParsing()
+            .readValue("\"" + DispositionType.Deleted.getValue() + "\"",
+                DispositionType.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionType.Deleted);
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenDispatched() throws Exception {
+        DispositionType actual = testee.forParsing()
+            .readValue("\"" + DispositionType.Dispatched.getValue() + "\"",
+                DispositionType.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionType.Dispatched);
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenDisplayed() throws Exception {
+        DispositionType actual = testee.forParsing()
+            .readValue("\"" + DispositionType.Displayed.getValue() + "\"",
+                DispositionType.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionType.Displayed);
+    }
+
+    @Test
+    public void readValueShouldParseSendingModeWhenProcessed() throws Exception {
+        DispositionType actual = testee.forParsing()
+            .readValue("\"" + DispositionType.Processed.getValue() + "\"",
+                DispositionType.class);
+
+        assertThat(actual)
+            .isEqualTo(DispositionType.Processed);
+    }
+
+    @Test
+    public void readValueShouldFailOnInvalidDispositionType() {
+        assertThatThrownBy(() -> testee.forParsing()
+            .readValue("\"illegal\"",
+                DispositionType.class))
+            .isInstanceOf(IllegalStateException.class)
+            .hasMessage("Unrecognized MDN Disposition type illegal. Should be one of [deleted, dispatched, displayed, processed]");
+    }
+
+    @Test
     public void readValueShouldParseRightsObject() throws Exception {
         String username = "username";
         Rights actual = testee.forParsing()
@@ -107,7 +217,7 @@ public class ObjectMapperFactoryTest {
     }
 
     @Test
-    public void readValueShouldRejectMultiCharacterRights() throws Exception {
+    public void readValueShouldRejectMultiCharacterRights() {
         assertThatThrownBy(() ->
             testee.forParsing()
                 .readValue("\"ae\"", Rights.Right.class))
@@ -115,7 +225,7 @@ public class ObjectMapperFactoryTest {
     }
 
     @Test
-    public void readValueShouldRejectUnsupportedRights() throws Exception {
+    public void readValueShouldRejectUnsupportedRights() {
         assertThatThrownBy(() ->
             testee.forParsing()
                 .readValue("\"p\"", Rights.Right.class))
@@ -123,7 +233,7 @@ public class ObjectMapperFactoryTest {
     }
 
     @Test
-    public void readValueShouldRejectUnExistingRights() throws Exception {
+    public void readValueShouldRejectUnExistingRights() {
         assertThatThrownBy(() ->
             testee.forParsing()
                 .readValue("\"z\"", Rights.Right.class))


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