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/12/19 11:24:50 UTC

[09/10] james-project git commit: MAILBOX-363 MessageMoveEvent JSON serialization

MAILBOX-363 MessageMoveEvent JSON serialization


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

Branch: refs/heads/master
Commit: 26af5b2bd46dedc2e7734f508930443566639891
Parents: 8a91427
Author: Benoit Tellier <bt...@linagora.com>
Authored: Mon Dec 17 10:46:17 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Wed Dec 19 18:24:21 2018 +0700

----------------------------------------------------------------------
 .../james/event/json/EventSerializer.scala      |  34 +-
 .../json/MessageMoveEventSerializationTest.java | 412 +++++++++++++++++++
 2 files changed, 436 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/26af5b2b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
----------------------------------------------------------------------
diff --git a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
index 01cb1b8..31ebf49 100644
--- a/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
+++ b/mailbox/event/json/src/main/scala/org/apache/james/event/json/EventSerializer.scala
@@ -26,17 +26,11 @@ import javax.mail.{Flags => JavaMailFlags}
 import julienrf.json.derived
 import org.apache.james.core.quota.{QuotaCount, QuotaSize, QuotaValue}
 import org.apache.james.core.{Domain, User}
-import org.apache.james.event.json.DTOs.{ACLDiff, MailboxPath, Quota}
-import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged,
-  MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion,
-  MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent}
+import org.apache.james.event.json.DTOs.{ACLDiff, Flags, MailboxPath, Quota}
+import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, MailboxACLUpdated => JavaMailboxACLUpdated, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent}
 import org.apache.james.mailbox.MailboxSession.SessionId
-import org.apache.james.mailbox.model.{MailboxId, MessageId, QuotaRoot, MailboxACL => JavaMailboxACL, Quota => JavaQuota}
-import org.apache.james.event.json.DTOs.{Flags, MailboxPath, Quota}
-import org.apache.james.mailbox.MailboxListener.{Added => JavaAdded, Expunged => JavaExpunged, MailboxAdded => JavaMailboxAdded, MailboxDeletion => JavaMailboxDeletion, MailboxRenamed => JavaMailboxRenamed, QuotaUsageUpdatedEvent => JavaQuotaUsageUpdatedEvent}
-import org.apache.james.mailbox.MailboxSession.SessionId
-import org.apache.james.mailbox.model.{MailboxId, MessageId, QuotaRoot, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota}
-import org.apache.james.mailbox.{MessageUid, Event => JavaEvent}
+import org.apache.james.mailbox.model.{MailboxId, MessageId, MessageMoves, QuotaRoot, MailboxACL => JavaMailboxACL, MessageMetaData => JavaMessageMetaData, Quota => JavaQuota}
+import org.apache.james.mailbox.{MessageUid, Event => JavaEvent, MessageMoveEvent => JavaMessageMoveEvent}
 import play.api.libs.json.{JsArray, JsError, JsNull, JsNumber, JsObject, JsResult, JsString, JsSuccess, Json, OFormat, Reads, Writes}
 
 import scala.collection.JavaConverters._
@@ -89,6 +83,18 @@ private object DTO {
       mailboxId,
       expunged.mapValues(_.toJava).asJava)
   }
+
+  case class MessageMoveEvent(user: User, previousMailboxIds: Seq[MailboxId], targetMailboxIds: Seq[MailboxId],
+                              messageIds: Seq[MessageId]) extends Event {
+    override def toJava: JavaEvent = JavaMessageMoveEvent.builder()
+      .user(user)
+      .messageId(messageIds.asJava)
+      .messageMoves(MessageMoves.builder()
+          .previousMailboxIds(previousMailboxIds.asJava)
+          .targetMailboxIds(targetMailboxIds.asJava)
+        .build())
+      .build()
+  }
 }
 
 private object ScalaConverter {
@@ -149,6 +155,13 @@ private object ScalaConverter {
     expunged = event.getExpunged.asScala.mapValues(DTOs.MessageMetaData.fromJava).toMap
   )
 
+  private def toScala(event: JavaMessageMoveEvent): DTO.MessageMoveEvent = DTO.MessageMoveEvent(
+    user = event.getUser,
+    previousMailboxIds = event.getMessageMoves.getPreviousMailboxIds.asScala.toList,
+    targetMailboxIds = event.getMessageMoves.getTargetMailboxIds.asScala.toList,
+    messageIds = event.getMessageIds.asScala.toList)
+
+
   def toScala(javaEvent: JavaEvent): Event = javaEvent match {
     case e: JavaAdded => toScala(e)
     case e: JavaExpunged => toScala(e)
@@ -156,6 +169,7 @@ private object ScalaConverter {
     case e: JavaMailboxAdded => toScala(e)
     case e: JavaMailboxDeletion => toScala(e)
     case e: JavaMailboxRenamed => toScala(e)
+    case e: JavaMessageMoveEvent => toScala(e)
     case e: JavaQuotaUsageUpdatedEvent => toScala(e)
     case _ => throw new RuntimeException("no Scala conversion known")
   }

http://git-wip-us.apache.org/repos/asf/james-project/blob/26af5b2b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
new file mode 100644
index 0000000..f3008dc
--- /dev/null
+++ b/mailbox/event/json/src/test/java/org/apache/james/event/json/MessageMoveEventSerializationTest.java
@@ -0,0 +1,412 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.event.json;
+
+import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.NoSuchElementException;
+
+import org.apache.james.core.User;
+import org.apache.james.mailbox.Event;
+import org.apache.james.mailbox.MessageMoveEvent;
+import org.apache.james.mailbox.model.MessageMoves;
+import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.model.TestMessageId;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class MessageMoveEventSerializationTest {
+    private static final EventSerializer EVENT_SERIALIZER = new EventSerializer(new TestId.Factory(), new TestMessageId.Factory());
+
+    private static final Event EVENT = MessageMoveEvent.builder()
+        .user(User.fromUsername("bob@domain.tld"))
+        .messageId(TestMessageId.of(42))
+        .messageMoves(
+            MessageMoves.builder()
+                .previousMailboxIds(TestId.of(18), TestId.of(24))
+                .targetMailboxIds(TestId.of(36))
+                .build())
+        .build();
+    private static final String JSON = "{" +
+        "  \"MessageMoveEvent\": {" +
+        "    \"user\": \"bob@domain.tld\"," +
+        "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+        "    \"targetMailboxIds\": [\"36\"]," +
+        "    \"messageIds\": [\"42\"]" +
+        "  }" +
+        "}";
+
+    @Test
+    void messageMoveEventShouldBeWellSerialized() {
+        assertThatJson(EVENT_SERIALIZER.toJson(EVENT))
+            .isEqualTo(JSON);
+    }
+
+    @Test
+    void messageMoveEventShouldBeWellDeSerialized() {
+        assertThat(EVENT_SERIALIZER.fromJson(JSON).get())
+            .isEqualTo(EVENT);
+    }
+
+    @Nested
+    class ValidPayloads {
+        @Nested
+        class NoVirtualHosting {
+            private final Event event = MessageMoveEvent.builder()
+                .user(User.fromUsername("bob"))
+                .messageId(TestMessageId.of(42))
+                .messageMoves(
+                    MessageMoves.builder()
+                        .previousMailboxIds(TestId.of(18), TestId.of(24))
+                        .targetMailboxIds(TestId.of(36))
+                        .build())
+                .build();
+            private final String json = "{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob\"," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}";
+
+            @Test
+            void messageMoveEventShouldBeWellSerialized() {
+                assertThatJson(EVENT_SERIALIZER.toJson(event))
+                    .isEqualTo(json);
+            }
+
+            @Test
+            void messageMoveEventShouldBeWellDeSerialized() {
+                assertThat(EVENT_SERIALIZER.fromJson(json).get())
+                    .isEqualTo(event);
+            }
+        }
+
+        @Nested
+        class EmptyTargetMailboxIds {
+            private final Event event = MessageMoveEvent.builder()
+                .user(User.fromUsername("bob"))
+                .messageId(TestMessageId.of(42))
+                .messageMoves(
+                    MessageMoves.builder()
+                        .previousMailboxIds(TestId.of(18), TestId.of(24))
+                        .build())
+                .build();
+            private final String json = "{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob\"," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": []," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}";
+
+            @Test
+            void messageMoveEventShouldBeWellSerialized() {
+                assertThatJson(EVENT_SERIALIZER.toJson(event))
+                    .isEqualTo(json);
+            }
+
+            @Test
+            void messageMoveEventShouldBeWellDeSerialized() {
+                assertThat(EVENT_SERIALIZER.fromJson(json).get())
+                    .isEqualTo(event);
+            }
+        }
+
+        @Nested
+        class EmptyPreviousMailboxIds {
+            private final Event event = MessageMoveEvent.builder()
+                .user(User.fromUsername("bob"))
+                .messageId(TestMessageId.of(42))
+                .messageMoves(
+                    MessageMoves.builder()
+                        .targetMailboxIds(TestId.of(36))
+                        .build())
+                .build();
+            private final String json = "{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob\"," +
+                "    \"previousMailboxIds\": []," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}";
+
+            @Test
+            void messageMoveEventShouldBeWellSerialized() {
+                assertThatJson(EVENT_SERIALIZER.toJson(event))
+                    .isEqualTo(json);
+            }
+
+            @Test
+            void messageMoveEventShouldBeWellDeSerialized() {
+                assertThat(EVENT_SERIALIZER.fromJson(json).get())
+                    .isEqualTo(event);
+            }
+        }
+
+        @Nested
+        class EmptyMessagesIds {
+            private final Event event = MessageMoveEvent.builder()
+                .user(User.fromUsername("bob"))
+                .messageMoves(
+                    MessageMoves.builder()
+                        .previousMailboxIds(TestId.of(18), TestId.of(24))
+                        .targetMailboxIds(TestId.of(36))
+                        .build())
+                .build();
+            private final String json = "{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob\"," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": []" +
+                "  }" +
+                "}";
+
+            @Test
+            void messageMoveEventShouldBeWellSerialized() {
+                assertThatJson(EVENT_SERIALIZER.toJson(event))
+                    .isEqualTo(json);
+            }
+
+            @Test
+            void messageMoveEventShouldBeWellDeSerialized() {
+                assertThat(EVENT_SERIALIZER.fromJson(json).get())
+                    .isEqualTo(event);
+            }
+        }
+    }
+
+    @Nested
+    class InvalidPayloads {
+        @Test
+        void emptyUserShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"\"," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(IllegalArgumentException.class);
+        }
+
+        @Test
+        void basUsersShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld@bad\"," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(IllegalArgumentException.class);
+        }
+
+        @Test
+        void nonStringUserShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": 42," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullUserShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": null," +
+                "    \"previousMailboxIds\": [\"18\", \"24\"]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullPreviousMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": null," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonCollectionPreviousMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": 42," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonStringElementInPreviousMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [42]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullElementInPreviousMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [null]," +
+                "    \"targetMailboxIds\": [\"36\"]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullTargetMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": null," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonCollectionTargetMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": 42," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonStringElementInTargetMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [42]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullElementInTargetMailboxIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [null]," +
+                "    \"messageIds\": [\"42\"]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullMessageIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [\"42\"]," +
+                "    \"messageIds\": null" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonCollectionMessageIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [\"42\"]," +
+                "    \"messageIds\": 42" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nonStringElementInMessageIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [\"42\"]," +
+                "    \"messageIds\": [42]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+
+        @Test
+        void nullElementInMessageIdsShouldBeRejected() {
+            assertThatThrownBy(() -> EVENT_SERIALIZER.fromJson("{" +
+                "  \"MessageMoveEvent\": {" +
+                "    \"user\": \"bob@domain.tld\"," +
+                "    \"previousMailboxIds\": [\"36\"]," +
+                "    \"targetMailboxIds\": [\"42\"]," +
+                "    \"messageIds\": [null]" +
+                "  }" +
+                "}").get())
+                .isInstanceOf(NoSuchElementException.class);
+        }
+    }
+}


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