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

Reply via email to