This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 84ef261b3b45db0e64b4693374cf9df7fe19581d
Author: Tran Tien Duc <[email protected]>
AuthorDate: Thu Mar 14 11:15:40 2019 +0700

    MAILBOX-385 Adding size field to DeletedMessage
    
    To be used in the Zipper size extra field latter. This step avoids to
    calculate deleted message content size from the InputStream, we can get
    it directly from the DeletedMessage.
---
 .../org/apache/james/vault/DeletedMessage.java     | 38 +++++++++++++++++-----
 .../james/vault/DeletedMessageConverter.java       |  1 +
 .../james/vault/DeletedMessageConverterTest.java   |  8 +++--
 .../apache/james/vault/DeletedMessageFixture.java  |  4 ++-
 .../org/apache/james/vault/DeletedMessageTest.java |  2 ++
 .../james/vault/DeletedMessageVaultHookTest.java   | 30 ++++++++++++-----
 .../vault/DeletedMessageVaultSearchContract.java   |  7 +++-
 .../apache/james/mailbox/store/MessageBuilder.java |  7 +++-
 .../java/org/apache/james/vault/MailConverter.java | 24 ++++++++++++++
 .../routes/DeletedMessagesVaultRoutesTest.java     | 19 +++++------
 10 files changed, 108 insertions(+), 32 deletions(-)

diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
index dd320d6..110c191 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessage.java
@@ -94,6 +94,11 @@ public class DeletedMessage {
             }
         }
 
+        @FunctionalInterface
+        public interface RequireSize<T> {
+            T size(long size);
+        }
+
         interface Steps {
             interface RequireMailboxContext<T> extends 
RequireMessageId<RequireOriginMailboxes<RequireUser<T>>> {}
 
@@ -101,7 +106,7 @@ public class DeletedMessage {
 
             interface RequireDates<T> extends 
RequireDeliveryDate<RequireDeletionDate<T>> {}
 
-            interface RequireMetadata<T> extends 
RequireMailboxContext<RequireDates<RequireEnvelope<RequireHasAttachment<T>>>> {}
+            interface RequireMetadata<T> extends 
RequireMailboxContext<RequireDates<RequireEnvelope<RequireHasAttachment<RequireSize<T>>>>>
 {}
         }
 
         public static class FinalStage {
@@ -113,10 +118,11 @@ public class DeletedMessage {
             private final MaybeSender sender;
             private final List<MailAddress> recipients;
             private final boolean hasAttachment;
+            private final long size;
             private Optional<String> subject;
 
             FinalStage(MessageId messageId, List<MailboxId> originMailboxes, 
User owner, ZonedDateTime deliveryDate,
-                       ZonedDateTime deletionDate, MaybeSender sender, 
List<MailAddress> recipients, boolean hasAttachment) {
+                       ZonedDateTime deletionDate, MaybeSender sender, 
List<MailAddress> recipients, boolean hasAttachment, long size) {
                 this.messageId = messageId;
                 this.originMailboxes = originMailboxes;
                 this.owner = owner;
@@ -125,6 +131,7 @@ public class DeletedMessage {
                 this.sender = sender;
                 this.recipients = recipients;
                 this.hasAttachment = hasAttachment;
+                this.size = size;
                 this.subject = Optional.empty();
             }
 
@@ -140,14 +147,14 @@ public class DeletedMessage {
 
             public DeletedMessage build() {
                 return new DeletedMessage(messageId, originMailboxes, owner, 
deliveryDate, deletionDate, sender,
-                    recipients, subject, hasAttachment);
+                    recipients, subject, hasAttachment, size);
             }
         }
     }
 
     public static RequireMetadata<FinalStage> builder() {
-        return messageId -> originMailboxes -> user -> deliveryDate -> 
deletionDate -> sender -> recipients -> hasAttachment ->
-            new Builder.FinalStage(messageId, originMailboxes, user, 
deliveryDate, deletionDate, sender, ImmutableList.copyOf(recipients), 
hasAttachment);
+        return messageId -> originMailboxes -> user -> deliveryDate -> 
deletionDate -> sender -> recipients -> hasAttachment -> size ->
+            new Builder.FinalStage(messageId, originMailboxes, user, 
deliveryDate, deletionDate, sender, ImmutableList.copyOf(recipients), 
hasAttachment, size);
     }
 
     private final MessageId messageId;
@@ -159,10 +166,11 @@ public class DeletedMessage {
     private final List<MailAddress> recipients;
     private final Optional<String> subject;
     private final boolean hasAttachment;
+    private final long size;
 
     public DeletedMessage(MessageId messageId, List<MailboxId> 
originMailboxes, User owner,
                           ZonedDateTime deliveryDate, ZonedDateTime 
deletionDate, MaybeSender sender, List<MailAddress> recipients,
-                          Optional<String> subject, boolean hasAttachment) {
+                          Optional<String> subject, boolean hasAttachment, 
long size) {
         this.messageId = messageId;
         this.originMailboxes = originMailboxes;
         this.owner = owner;
@@ -172,6 +180,7 @@ public class DeletedMessage {
         this.recipients = recipients;
         this.subject = subject;
         this.hasAttachment = hasAttachment;
+        this.size = size;
     }
 
     public MessageId getMessageId() {
@@ -210,6 +219,10 @@ public class DeletedMessage {
         return hasAttachment;
     }
 
+    public long getSize() {
+        return size;
+    }
+
     @Override
     public final boolean equals(Object o) {
         if (o instanceof DeletedMessage) {
@@ -223,7 +236,8 @@ public class DeletedMessage {
                 && Objects.equals(this.deletionDate, that.deletionDate)
                 && Objects.equals(this.sender, that.sender)
                 && Objects.equals(this.recipients, that.recipients)
-                && Objects.equals(this.subject, that.subject);
+                && Objects.equals(this.subject, that.subject)
+                && Objects.equals(this.size, that.size);
         }
         return false;
     }
@@ -231,7 +245,7 @@ public class DeletedMessage {
     @Override
     public final int hashCode() {
         return Objects.hash(messageId, originMailboxes, owner, deliveryDate, 
deletionDate, sender, recipients,
-            subject, hasAttachment);
+            subject, hasAttachment, size);
     }
 
     @Override
@@ -239,6 +253,14 @@ public class DeletedMessage {
         return MoreObjects.toStringHelper(this)
             .add("owner", owner)
             .add("messageId", messageId)
+            .add("originMailboxes", originMailboxes)
+            .add("owner", owner)
+            .add("deliveryDate", deliveryDate)
+            .add("deletionDate", deletionDate)
+            .add("sender", sender)
+            .add("recipients", recipients)
+            .add("subject", subject)
+            .add("size", size)
             .toString();
     }
 }
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
index 6360fa7..105929b 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/DeletedMessageConverter.java
@@ -61,6 +61,7 @@ class DeletedMessageConverter {
             .sender(retrieveSender(mimeMessage))
             .recipients(retrieveRecipients(mimeMessage))
             .hasAttachment(!message.getAttachments().isEmpty())
+            .size(message.getBodyOctets() + message.getHeaderOctets())
             .subject(mimeMessage.map(Message::getSubject))
             .build();
     }
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
index 9cea8d0..ee1c501 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageConverterTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.vault;
 
+import static org.apache.james.vault.DeletedMessageFixture.CONTENT;
 import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE;
 import static 
org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_WITH_SUBJECT;
 import static org.apache.james.vault.DeletedMessageFixture.DELETION_DATE;
@@ -91,11 +92,14 @@ class DeletedMessageConverterTest {
     }
 
     private MailboxMessage buildMessage(MessageBuilder messageBuilder, 
Collection<MessageAttachment> attachments) throws Exception {
-        MailboxMessage mailboxMessage = messageBuilder.build(MESSAGE_ID);
+        MailboxMessage mailboxMessage = messageBuilder
+            .size(CONTENT.length)
+            .build(MESSAGE_ID);
         return SimpleMailboxMessage.fromWithoutAttachments(mailboxMessage)
             .mailboxId(mailboxMessage.getMailboxId())
             .internalDate(Date.from(DELIVERY_DATE.toInstant()))
-            .addAttachments(attachments).build();
+            .addAttachments(attachments)
+            .build();
     }
 
     @BeforeEach
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
index d2e5c31..ee3016c 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageFixture.java
@@ -57,6 +57,7 @@ public interface DeletedMessageFixture {
         .sender(MaybeSender.of(SENDER))
         .recipients(RECIPIENT1, RECIPIENT2)
         .hasAttachment(false)
+        .size(CONTENT.length)
         .build();
     Supplier<DeletedMessage.Builder.FinalStage> FINAL_STAGE = () -> 
DeletedMessage.builder()
         .messageId(MESSAGE_ID)
@@ -66,7 +67,8 @@ public interface DeletedMessageFixture {
         .deletionDate(DELETION_DATE)
         .sender(MaybeSender.of(SENDER))
         .recipients(RECIPIENT1, RECIPIENT2)
-        .hasAttachment(false);
+        .hasAttachment(false)
+        .size(CONTENT.length);
     DeletedMessage DELETED_MESSAGE_WITH_SUBJECT = FINAL_STAGE.get()
         .subject(SUBJECT)
         .build();
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
index 049b561..e6e35bf 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.vault;
 
+import static org.apache.james.vault.DeletedMessageFixture.CONTENT;
 import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE;
 import static 
org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_WITH_SUBJECT;
 import static org.apache.james.vault.DeletedMessageFixture.DELETION_DATE;
@@ -58,6 +59,7 @@ class DeletedMessageTest {
                 
soft.assertThat(DELETED_MESSAGE.getSender()).isEqualTo(MaybeSender.of(SENDER));
                 
soft.assertThat(DELETED_MESSAGE.getRecipients()).containsOnly(RECIPIENT1, 
RECIPIENT2);
                 soft.assertThat(DELETED_MESSAGE.hasAttachment()).isFalse();
+                
soft.assertThat(DELETED_MESSAGE.getSize()).isEqualTo(CONTENT.length);
                 soft.assertThat(DELETED_MESSAGE.getSubject()).isEmpty();
             }
         );
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
index 20e2201..26c3ca4 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
@@ -36,12 +36,15 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.FetchGroupImpl;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.SearchQuery;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.vault.memory.MemoryDeletedMessagesVault;
@@ -58,6 +61,7 @@ class DeletedMessageVaultHookTest {
     private static final String TEST_ADDRESS = "[email protected]";
     private static final User ALICE = User.fromUsername(ALICE_ADDRESS);
     private static final User BOB = User.fromUsername(BOB_ADDRESS);
+    private static final String MESSAGE_BODY = "testmail";
 
     private static final MailboxPath MAILBOX_ALICE_ONE = 
MailboxPath.forUser(ALICE_ADDRESS, "ALICE_ONE");
     private static final MailboxPath MAILBOX_BOB_ONE = 
MailboxPath.forUser(BOB_ADDRESS, "BOB_ONE");
@@ -71,7 +75,7 @@ class DeletedMessageVaultHookTest {
     private MailboxSession bobSession;
     private SearchQuery searchQuery;
 
-    private DeletedMessage buildDeletedMessage(List<MailboxId> mailboxIds, 
MessageId messageId, User user) throws Exception {
+    private DeletedMessage buildDeletedMessage(List<MailboxId> mailboxIds, 
MessageId messageId, User user, long messageSize) throws Exception {
         return DeletedMessage.builder()
             .messageId(messageId)
             .originMailboxes(mailboxIds)
@@ -81,6 +85,7 @@ class DeletedMessageVaultHookTest {
             .sender(MaybeSender.getMailSender(ALICE_ADDRESS))
             .recipients(new MailAddress(TEST_ADDRESS))
             .hasAttachment(false)
+            .size(messageSize)
             .subject("test")
             .build();
     }
@@ -114,7 +119,7 @@ class DeletedMessageVaultHookTest {
 
         mailContent = Message.Builder.of()
             .setSubject("test")
-            .setBody("testmail", StandardCharsets.UTF_8)
+            .setBody(MESSAGE_BODY, StandardCharsets.UTF_8)
             .setSender(ALICE_ADDRESS)
             .setTo(TEST_ADDRESS)
             .setDate(INTERNAL_DATE)
@@ -131,11 +136,13 @@ class DeletedMessageVaultHookTest {
     void notifyDeleteShouldAppendMessageVault() throws Exception {
         MailboxId aliceMailbox = 
mailboxManager.createMailbox(MAILBOX_ALICE_ONE, aliceSession).get();
         MessageManager messageManager = 
mailboxManager.getMailbox(aliceMailbox, aliceSession);
-        MessageId messageId = appendMessage(messageManager).getMessageId();
+        ComposedMessageId composedId = appendMessage(messageManager);
+        MessageId messageId = composedId.getMessageId();
+        long messageSize = messageSize(messageManager, composedId);
 
         messageIdManager.delete(ImmutableList.of(messageId), aliceSession);
 
-        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(aliceMailbox), messageId, ALICE);
+        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(aliceMailbox), messageId, ALICE, 
messageSize);
         assertThat(messageVault.search(ALICE, Query.ALL).blockFirst())
             .isEqualTo(deletedMessage);
     }
@@ -155,9 +162,9 @@ class DeletedMessageVaultHookTest {
         MessageManager bobMessageManager = 
mailboxManager.getMailbox(aliceMailbox, bobSession);
         ComposedMessageId composedMessageId = 
appendMessage(aliceMessageManager);
         MessageId messageId = composedMessageId.getMessageId();
+        long messageSize = messageSize(bobMessageManager, composedMessageId);
 
-
-        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(aliceMailbox), messageId, ALICE);
+        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(aliceMailbox), messageId, ALICE, 
messageSize);
         
bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery,
 bobSession)), bobSession);
 
         assertThat(messageVault.search(ALICE, Query.ALL).blockFirst())
@@ -203,7 +210,8 @@ class DeletedMessageVaultHookTest {
 
         messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(bobMailbox), bobSession);
 
-        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB);
+        long messageSize = messageSize(bobMessageManager, composedMessageId);
+        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB, messageSize);
         
bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery,
 bobSession)), bobSession);
 
         assertThat(messageVault.search(BOB, Query.ALL).blockFirst())
@@ -252,7 +260,8 @@ class DeletedMessageVaultHookTest {
 
         messageIdManager.setInMailboxes(messageId, 
ImmutableList.of(aliceMailbox, bobMailbox), bobSession);
 
-        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB);
+        long messageSize = messageSize(bobMessageManager, composedMessageId);
+        DeletedMessage deletedMessage = 
buildDeletedMessage(ImmutableList.of(bobMailbox), messageId, BOB, messageSize);
         
bobMessageManager.delete(ImmutableList.copyOf(bobMessageManager.search(searchQuery,
 bobSession)), bobSession);
 
         assertThat(messageVault.search(BOB, Query.ALL).blockFirst())
@@ -283,4 +292,9 @@ class DeletedMessageVaultHookTest {
             .isEmpty();
     }
 
+    private long messageSize(MessageManager messageManager, ComposedMessageId 
composedMessageId) throws MailboxException {
+        return 
messageManager.getMessages(MessageRange.one(composedMessageId.getUid()), 
FetchGroupImpl.MINIMAL, aliceSession)
+            .next()
+            .getSize();
+    }
 }
diff --git 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
index 11822d7..051de74 100644
--- 
a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
+++ 
b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultSearchContract.java
@@ -573,6 +573,7 @@ public interface DeletedMessageVaultSearchContract {
             .sender(MaybeSender.of(SENDER))
             .recipients(recipients)
             .hasAttachment(false)
+            .size(CONTENT.length)
             .build();
 
         return storeDeletedMessage(deletedMessage, USER);
@@ -588,6 +589,7 @@ public interface DeletedMessageVaultSearchContract {
             .sender(sender)
             .recipients(RECIPIENT1, RECIPIENT2)
             .hasAttachment(false)
+            .size(CONTENT.length)
             .build();
 
         return storeDeletedMessage(deletedMessage, USER);
@@ -603,6 +605,7 @@ public interface DeletedMessageVaultSearchContract {
             .sender(MaybeSender.of(SENDER))
             .recipients(RECIPIENT1, RECIPIENT2)
             .hasAttachment(hasAttachment)
+            .size(CONTENT.length)
             .build();
 
         return storeDeletedMessage(deletedMessage, USER);
@@ -618,6 +621,7 @@ public interface DeletedMessageVaultSearchContract {
             .sender(MaybeSender.of(SENDER))
             .recipients(RECIPIENT1, RECIPIENT2)
             .hasAttachment(true)
+            .size(CONTENT.length)
             .build();
 
         return storeDeletedMessage(deletedMessage, USER);
@@ -661,6 +665,7 @@ public interface DeletedMessageVaultSearchContract {
             .deletionDate(deletionDate)
             .sender(MaybeSender.of(SENDER))
             .recipients(RECIPIENT1)
-            .hasAttachment(false);
+            .hasAttachment(false)
+            .size(CONTENT.length);
     }
 }
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
index 640c932..9476326 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/MessageBuilder.java
@@ -48,7 +48,12 @@ public class MessageBuilder {
     public MailboxMessage build(MessageId messageId) throws Exception {
         return new SimpleMailboxMembership(messageId, mailboxId, uid, -1,  
internalDate, size, flags, body, headers);
     }
-    
+
+    public MessageBuilder size(int size) {
+        this.size = size;
+        return this;
+    }
+
     public void header(String field, String value) {
         headers.put(field, value);
     }
diff --git 
a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailConverter.java
 
b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailConverter.java
index cfd6d41..b4aa43a 100644
--- 
a/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailConverter.java
+++ 
b/server/mailrepository/deleted-messages-vault-repository/src/main/java/org/apache/james/vault/MailConverter.java
@@ -34,15 +34,20 @@ import org.apache.james.core.User;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.server.core.MailImpl;
+import org.apache.james.util.MimeMessageUtil;
 import org.apache.mailet.AttributeName;
 import org.apache.mailet.AttributeUtils;
 import org.apache.mailet.AttributeValue;
 import org.apache.mailet.Mail;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
 import com.google.common.collect.ImmutableList;
 
 class MailConverter {
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(MailConverter.class);
+
     static final AttributeName ORIGIN_MAILBOXES_ATTRIBUTE_NAME = 
AttributeName.of("originMailboxes");
     static final AttributeName HAS_ATTACHMENT_ATTRIBUTE_NAME = 
AttributeName.of("hasAttachment");
     static final AttributeName OWNER_ATTRIBUTE_NAME = 
AttributeName.of("owner");
@@ -84,10 +89,29 @@ class MailConverter {
             .sender(mail.getMaybeSender())
             .recipients(mail.getRecipients())
             .hasAttachment(retrieveHasAttachment(mail))
+            .size(getMessageSize(mail))
             .subject(retrieveSubject(mail))
             .build();
     }
 
+    private long getMessageSize(Mail mail) {
+        try {
+            return mail.getMessageSize();
+        } catch (MessagingException e) {
+            LOGGER.warn("can not get message size from message {}, fallback to 
use MimeMessageUtil.asBytes()", mail.getName(), e);
+            return getMimeMessageSize(mail);
+        }
+    }
+
+    private int getMimeMessageSize(Mail mail) {
+        try {
+            MimeMessage mimeMessage = mail.getMessage();
+            return MimeMessageUtil.asBytes(mimeMessage).length;
+        } catch (Exception e) {
+            throw new RuntimeException("can not calculate mime message size 
from mail " + mail.getName(), e);
+        }
+    }
+
     private ImmutableList<AttributeValue<?>> 
serializedMailboxIds(DeletedMessage deletedMessage) {
         return deletedMessage.getOriginMailboxes().stream()
             .map(MailboxId::serialize)
diff --git 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index 56b977a..cf7ac0a 100644
--- 
a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ 
b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -799,9 +799,7 @@ class DeletedMessagesVaultRoutesTest {
 
             @Test
             void restoreShouldAppendMessageToMailboxWhenMatchingNoAttachment() 
throws Exception {
-                DeletedMessage deletedMessage = messageWithAttachmentBuilder()
-                    .hasAttachment(false)
-                    .build();
+                DeletedMessage deletedMessage = 
buildMessageWithHasAttachment(false);
                 storeDeletedMessage(deletedMessage);
 
                 String query =
@@ -834,9 +832,7 @@ class DeletedMessagesVaultRoutesTest {
 
             @Test
             void 
restoreShouldAppendMessageToMailboxWhenMatchingHasAttachment() throws Exception 
{
-                DeletedMessage deletedMessage = messageWithAttachmentBuilder()
-                    .hasAttachment()
-                    .build();
+                DeletedMessage deletedMessage = 
buildMessageWithHasAttachment(true);
                 storeDeletedMessage(deletedMessage);
 
                 String query =
@@ -869,9 +865,7 @@ class DeletedMessagesVaultRoutesTest {
 
             @Test
             void 
restoreShouldNotAppendMessageToMailboxWhenMatchingHasNoAttachment() throws 
Exception {
-                DeletedMessage deletedMessage = messageWithAttachmentBuilder()
-                    .hasAttachment(false)
-                    .build();
+                DeletedMessage deletedMessage = 
buildMessageWithHasAttachment(false);
                 storeDeletedMessage(deletedMessage);
 
                 String query =
@@ -1616,7 +1610,7 @@ class DeletedMessagesVaultRoutesTest {
         return 
ImmutableList.copyOf(messageManager.getMessages(MessageRange.all(), 
FetchGroupImpl.MINIMAL, session));
     }
 
-    private 
DeletedMessage.Builder.RequireHasAttachment<DeletedMessage.Builder.FinalStage> 
messageWithAttachmentBuilder() {
+    private DeletedMessage buildMessageWithHasAttachment(boolean 
hasAttachment) {
         return DeletedMessage.builder()
             
.messageId(InMemoryMessageId.of(MESSAGE_ID_GENERATOR.incrementAndGet()))
             .originMailboxes(MAILBOX_ID_1)
@@ -1624,7 +1618,10 @@ class DeletedMessagesVaultRoutesTest {
             .deliveryDate(DELIVERY_DATE)
             .deletionDate(DELETION_DATE)
             .sender(MaybeSender.of(SENDER))
-            .recipients(RECIPIENT1, RECIPIENT2);
+            .recipients(RECIPIENT1, RECIPIENT2)
+            .hasAttachment(hasAttachment)
+            .size(CONTENT.length)
+            .build();
     }
 
     private DeletedMessage storeDeletedMessage(DeletedMessage deletedMessage) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to