JAMES-2082 Introduce SimpleMailboxMessage builder
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/15e77eaf Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/15e77eaf Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/15e77eaf Branch: refs/heads/master Commit: 15e77eafe3e4944109c9cef0d6ccd92545117806 Parents: d27cfb1 Author: benwa <btell...@linagora.com> Authored: Fri Jul 7 18:10:15 2017 +0700 Committer: Antoine Duprat <adup...@linagora.com> Committed: Mon Jul 10 14:23:58 2017 +0200 ---------------------------------------------------------------------- .../mail/MessageWithoutAttachment.java | 24 +- .../cassandra/mail/CassandraMessageDAOTest.java | 35 +-- .../mail/CassandraMessageDAOV2Test.java | 14 +- .../mail/model/impl/SimpleMailboxMessage.java | 102 +++++++++ .../model/impl/SimpleMailboxMessageTest.java | 229 ++++++++++++++++++- 5 files changed, 376 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/15e77eaf/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java index 1c63cee..89f57b2 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageWithoutAttachment.java @@ -37,7 +37,7 @@ public class MessageWithoutAttachment { private final MessageId messageId; private final Date internalDate; private final Long size; - private final Integer boduSize; + private final Integer bodySize; private final SharedByteArrayInputStream content; private final Flags flags; private final PropertyBuilder propertyBuilder; @@ -45,12 +45,12 @@ public class MessageWithoutAttachment { private final MessageUid messageUid; private final long modSeq; - public MessageWithoutAttachment(MessageId messageId, Date internalDate, Long size, Integer boduSize, SharedByteArrayInputStream content, + public MessageWithoutAttachment(MessageId messageId, Date internalDate, Long size, Integer bodySize, SharedByteArrayInputStream content, Flags flags, PropertyBuilder propertyBuilder, MailboxId mailboxId, MessageUid messageUid, long modSeq) { this.messageId = messageId; this.internalDate = internalDate; this.size = size; - this.boduSize = boduSize; + this.bodySize = bodySize; this.content = content; this.flags = flags; this.propertyBuilder = propertyBuilder; @@ -60,11 +60,19 @@ public class MessageWithoutAttachment { } public SimpleMailboxMessage toMailboxMessage(List<MessageAttachment> attachments) { - SimpleMailboxMessage simpleMailboxMessage = new SimpleMailboxMessage(messageId, internalDate, size, boduSize, - content, flags, propertyBuilder, mailboxId, attachments); - simpleMailboxMessage.setUid(messageUid); - simpleMailboxMessage.setModSeq(modSeq); - return simpleMailboxMessage; + return SimpleMailboxMessage.builder() + .messageId(messageId) + .mailboxId(mailboxId) + .uid(messageUid) + .modseq(modSeq) + .internalDate(internalDate) + .bodyStartOctet(bodySize) + .size(size) + .content(content) + .flags(flags) + .propertyBuilder(propertyBuilder) + .addAttachments(attachments) + .build(); } public MailboxId getMailboxId() { http://git-wip-us.apache.org/repos/asf/james-project/blob/15e77eaf/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java index 2810ba1..98c2fa6 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOTest.java @@ -43,6 +43,7 @@ import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage; import com.github.steveash.guavate.Guavate; +import com.google.common.base.Charsets; import com.google.common.collect.ImmutableList; import org.junit.After; @@ -142,22 +143,24 @@ public class CassandraMessageDAOTest { } private SimpleMailboxMessage createMessage( - MessageId messageId, - String content, - int bodyStart, - PropertyBuilder propertyBuilder, - List<MessageAttachment> attachments - ) { - return new SimpleMailboxMessage( - messageId, - new Date(), - content.length(), - bodyStart, - new SharedByteArrayInputStream(content.getBytes()), - new Flags(), - propertyBuilder, - MAILBOX_ID, - attachments); + MessageId messageId, + String content, + int bodyStart, + PropertyBuilder propertyBuilder, + List<MessageAttachment> attachments) { + + return SimpleMailboxMessage.builder() + .messageId(messageId) + .mailboxId(MAILBOX_ID) + .uid(messageUid) + .internalDate(new Date()) + .bodyStartOctet(bodyStart) + .size(content.length()) + .content(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8))) + .flags(new Flags()) + .propertyBuilder(propertyBuilder) + .addAttachments(attachments) + .build(); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/james-project/blob/15e77eaf/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java ---------------------------------------------------------------------- diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java index 234d9fd..5b98aa7 100644 --- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java +++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAOV2Test.java @@ -167,9 +167,17 @@ public class CassandraMessageDAOV2Test { } private SimpleMailboxMessage createMessage(MessageId messageId, String content, int bodyStart, PropertyBuilder propertyBuilder) { - return new SimpleMailboxMessage(messageId, new Date(), content.length(), bodyStart, - new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8)), new Flags(), - propertyBuilder, MAILBOX_ID); + return SimpleMailboxMessage.builder() + .messageId(messageId) + .mailboxId(MAILBOX_ID) + .uid(messageUid) + .internalDate(new Date()) + .bodyStartOctet(bodyStart) + .size(content.length()) + .content(new SharedByteArrayInputStream(content.getBytes(Charsets.UTF_8))) + .flags(new Flags()) + .propertyBuilder(propertyBuilder) + .build(); } private MessageWithoutAttachment toMessage(CompletableFuture<Stream<CassandraMessageDAOV2.MessageResult>> readOptional) throws InterruptedException, java.util.concurrent.ExecutionException { http://git-wip-us.apache.org/repos/asf/james-project/blob/15e77eaf/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java index 3b8037d..7f81690 100644 --- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java +++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessage.java @@ -20,6 +20,7 @@ package org.apache.james.mailbox.store.mail.model.impl; import java.io.IOException; +import java.util.Collection; import java.util.Date; import java.util.List; @@ -38,11 +39,112 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; public class SimpleMailboxMessage extends DelegatingMailboxMessage { + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private MessageId messageId; + private Date internalDate; + private Long size; + private Integer bodyStartOctet; + private SharedInputStream content; + private Flags flags; + private PropertyBuilder propertyBuilder; + private MailboxId mailboxId; + private Optional<MessageUid> uid = Optional.absent(); + private Optional<Long> modseq = Optional.absent(); + private ImmutableList.Builder<MessageAttachment> attachments = ImmutableList.builder(); + + public Builder messageId(MessageId messageId) { + this.messageId = messageId; + return this; + } + + public Builder uid(MessageUid messageUid) { + this.uid = Optional.of(messageUid); + return this; + } + + public Builder modseq(long modseq) { + Preconditions.checkArgument(modseq >= 0, "modseq can not be negative"); + this.modseq = Optional.of(modseq); + return this; + } + + public Builder internalDate(Date internalDate) { + this.internalDate = internalDate; + return this; + } + + public Builder size(long size) { + Preconditions.checkArgument(size >= 0, "size can not be negative"); + this.size = size; + return this; + } + + public Builder bodyStartOctet(int bodyStartOctet) { + Preconditions.checkArgument(bodyStartOctet >= 0, "bodyStartOctet can not be negative"); + this.bodyStartOctet = bodyStartOctet; + return this; + } + + public Builder content(SharedInputStream content) { + this.content = content; + return this; + } + + public Builder flags(Flags flags) { + this.flags = flags; + return this; + } + + public Builder propertyBuilder(PropertyBuilder propertyBuilder) { + this.propertyBuilder = propertyBuilder; + return this; + } + + public Builder mailboxId(MailboxId mailboxId) { + this.mailboxId = mailboxId; + return this; + } + + public Builder addAttachments(Collection<MessageAttachment> attachments) { + this.attachments.addAll(attachments); + return this; + } + + public SimpleMailboxMessage build() { + Preconditions.checkNotNull(messageId, "messageId is required"); + Preconditions.checkNotNull(internalDate, "internalDate is required"); + Preconditions.checkNotNull(size, "size is required"); + Preconditions.checkNotNull(bodyStartOctet, "bodyStartOctet is required"); + Preconditions.checkNotNull(content, "content is required"); + Preconditions.checkNotNull(flags, "flags is required"); + Preconditions.checkNotNull(propertyBuilder, "propertyBuilder is required"); + Preconditions.checkNotNull(mailboxId, "mailboxId is required"); + + SimpleMailboxMessage simpleMailboxMessage = new SimpleMailboxMessage(messageId, internalDate, size, + bodyStartOctet, content, flags, propertyBuilder, mailboxId, attachments.build()); + + if (uid.isPresent()) { + simpleMailboxMessage.setUid(uid.get()); + } + + if (modseq.isPresent()) { + simpleMailboxMessage.setModSeq(modseq.get()); + } + return simpleMailboxMessage; + } + } + public static SimpleMailboxMessage copy(MailboxId mailboxId, MailboxMessage original) throws MailboxException { return copy(mailboxId, original, original.getAttachments()); } http://git-wip-us.apache.org/repos/asf/james-project/blob/15e77eaf/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java ---------------------------------------------------------------------- diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java index f5e3241..9cd77a1 100644 --- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java +++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/impl/SimpleMailboxMessageTest.java @@ -31,25 +31,42 @@ import javax.mail.util.SharedByteArrayInputStream; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.james.mailbox.FlagsBuilder; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.exception.MailboxException; +import org.apache.james.mailbox.model.Attachment; +import org.apache.james.mailbox.model.MessageAttachment; +import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.model.TestId; import org.apache.james.mailbox.model.TestMessageId; import org.apache.james.mailbox.store.mail.model.DefaultMessageId; +import org.assertj.core.api.JUnitSoftAssertions; import org.assertj.core.internal.FieldByFieldComparator; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableList; public class SimpleMailboxMessageTest { private static final Charset MESSAGE_CHARSET = Charsets.UTF_8; private static final String MESSAGE_CONTENT = "Simple message content without special characters"; + public static final SharedByteArrayInputStream CONTENT_STREAM = new SharedByteArrayInputStream(MESSAGE_CONTENT.getBytes(MESSAGE_CHARSET)); private static final String MESSAGE_CONTENT_SPECIAL_CHAR = "Simple message content with special characters: \"'(§è!çà $*`"; public static final TestId TEST_ID = TestId.of(1L); public static final int BODY_START_OCTET = 0; + public static final MessageId MESSAGE_ID = new TestMessageId.Factory().generate(); + public static final int SIZE = 1000; private SimpleMailboxMessage MESSAGE; private SimpleMailboxMessage MESSAGE_SPECIAL_CHAR; + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Rule + public final JUnitSoftAssertions soft = new JUnitSoftAssertions(); + @Before public void setUp() { MESSAGE = buildMessage(MESSAGE_CONTENT); @@ -107,7 +124,7 @@ public class SimpleMailboxMessageTest { SimpleMailboxMessage original = new SimpleMailboxMessage(new TestMessageId.Factory().generate(), new Date(), MESSAGE_CONTENT.length(), BODY_START_OCTET, - new SharedByteArrayInputStream(MESSAGE_CONTENT.getBytes(MESSAGE_CHARSET)), + CONTENT_STREAM, new Flags(), propertyBuilder, TEST_ID); @@ -129,4 +146,214 @@ public class SimpleMailboxMessageTest { new PropertyBuilder(), TEST_ID); } + @Test + public void modseqShouldThrowWhenNegative() { + expectedException.expect(IllegalArgumentException.class); + + SimpleMailboxMessage.builder() + .modseq(-1); + } + + @Test + public void sizeShouldThrowWhenNegative() { + expectedException.expect(IllegalArgumentException.class); + + SimpleMailboxMessage.builder() + .size(-1); + } + + @Test + public void bodyStartOctetShouldThrowWhenNegative() { + expectedException.expect(IllegalArgumentException.class); + + SimpleMailboxMessage.builder() + .bodyStartOctet(-1); + } + + @Test + public void buildShouldWorkWithMinimalContent() { + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + + + @Test + public void buildShouldCreateAMessageWithAllFields() throws IOException { + Date internalDate = new Date(); + Flags flags = new Flags(); + PropertyBuilder propertyBuilder = new PropertyBuilder(); + int modseq = 145; + MessageUid uid = MessageUid.of(45); + MessageAttachment messageAttachment = MessageAttachment.builder() + .attachment(Attachment.builder() + .bytes("".getBytes(Charsets.UTF_8)) + .type("type") + .build()) + .name("name") + .isInline(false) + .build(); + SimpleMailboxMessage message = SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .modseq(modseq) + .uid(uid) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(flags) + .propertyBuilder(propertyBuilder) + .addAttachments(ImmutableList.of(messageAttachment)) + .build(); + + soft.assertThat(message.getMessageId()).isEqualTo(MESSAGE_ID); + soft.assertThat(message.getMailboxId()).isEqualTo(TEST_ID); + soft.assertThat(message.getInternalDate()).isEqualTo(internalDate); + soft.assertThat(message.getHeaderOctets()).isEqualTo(BODY_START_OCTET); + soft.assertThat(message.getFullContentOctets()).isEqualTo(SIZE); + soft.assertThat(IOUtils.toString(message.getFullContent(), Charsets.UTF_8)).isEqualTo(MESSAGE_CONTENT); + soft.assertThat(message.createFlags()).isEqualTo(flags); + soft.assertThat(message.getProperties()).isEqualTo(propertyBuilder.toProperties()); + soft.assertThat(message.getUid()).isEqualTo(uid); + soft.assertThat(message.getModSeq()).isEqualTo(modseq); + soft.assertThat(message.getAttachments()).containsOnly(messageAttachment); + } + + @Test + public void buildShouldThrowOnMissingMessageId() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingMailboxId() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingInternalDate() { + expectedException.expect(NullPointerException.class); + + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingBodyStartOctets() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingSize() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .content(CONTENT_STREAM) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingContent() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .flags(new Flags()) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingFlags() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .propertyBuilder(new PropertyBuilder()) + .build(); + } + + @Test + public void buildShouldThrowOnMissingProperties() { + expectedException.expect(NullPointerException.class); + + Date internalDate = new Date(); + SimpleMailboxMessage.builder() + .messageId(MESSAGE_ID) + .mailboxId(TEST_ID) + .internalDate(internalDate) + .bodyStartOctet(BODY_START_OCTET) + .size(SIZE) + .content(CONTENT_STREAM) + .flags(new Flags()) + .build(); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org