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