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 ro...@apache.org on 2016/12/16 15:43:28 UTC

[24/24] james-project git commit: JAMES-1886 Avoid one copy by introducing intermediary data type

JAMES-1886 Avoid one copy by introducing intermediary data type


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

Branch: refs/heads/master
Commit: 620a82f77324718b2497b435cc1e018eedafa0b6
Parents: 0d09862
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Dec 15 11:49:17 2016 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Dec 16 20:37:00 2016 +0700

----------------------------------------------------------------------
 .../cassandra/mail/CassandraMessageDAO.java     | 75 +++++++++++++++-----
 .../mail/CassandraMessageIdMapper.java          |  7 +-
 .../cassandra/mail/CassandraMessageMapper.java  |  5 +-
 3 files changed, 62 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/620a82f7/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
index 60365b6..a581bfc 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageDAO.java
@@ -43,6 +43,7 @@ import static org.apache.james.mailbox.cassandra.table.CassandraMessageTable.TEX
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.util.Date;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
@@ -50,12 +51,14 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import javax.inject.Inject;
+import javax.mail.Flags;
 import javax.mail.util.SharedByteArrayInputStream;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
 import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.backends.cassandra.utils.CassandraUtils;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.cassandra.CassandraMessageId;
 import org.apache.james.mailbox.cassandra.CassandraMessageId.Factory;
 import org.apache.james.mailbox.cassandra.table.CassandraMessageTable.Attachments;
@@ -65,8 +68,10 @@ import org.apache.james.mailbox.model.AttachmentId;
 import org.apache.james.mailbox.model.Cid;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageAttachment;
+import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.mail.MessageMapper.FetchType;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailboxMessage;
@@ -87,7 +92,6 @@ import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
-import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.primitives.Bytes;
 
@@ -176,7 +180,7 @@ public class CassandraMessageDAO {
         return ByteBuffer.wrap(ByteStreams.toByteArray(stream));
     }
 
-    public CompletableFuture<Stream<Pair<MailboxMessage, Stream<MessageAttachmentRepresentation>>>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Optional<Integer> limit) {
+    public CompletableFuture<Stream<Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>>>> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Optional<Integer> limit) {
         return retrieveRows(messageIds, fetchType, limit)
                 .thenApply(resultSet -> CassandraUtils.convertToStream(resultSet)
                         .map(row -> message(row, messageIds, fetchType)));
@@ -201,25 +205,24 @@ public class CassandraMessageDAO {
                         .collect(Collectors.toList())));
     }
 
-    private Pair<MailboxMessage, Stream<MessageAttachmentRepresentation>> message(Row row, List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType) {
+    private Pair<MessageWithoutAttachment, Stream<MessageAttachmentRepresentation>> message(Row row, List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType) {
         try {
             ComposedMessageIdWithMetaData messageIdWithMetaData = retrieveComposedMessageId(messageIdFactory.of(row.getUUID(MESSAGE_ID)), messageIds);
             ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId();
 
-            SimpleMailboxMessage message =
-                    new SimpleMailboxMessage(
-                            messageId.getMessageId(),
-                            row.getDate(INTERNAL_DATE),
-                            row.getLong(FULL_CONTENT_OCTETS),
-                            row.getInt(BODY_START_OCTET),
-                            buildContent(row, fetchType),
-                            messageIdWithMetaData.getFlags(),
-                            getPropertyBuilder(row),
-                            messageId.getMailboxId(),
-                            ImmutableList.of());
-            message.setUid(messageId.getUid());
-            message.setModSeq(messageIdWithMetaData.getModSeq());
-            return Pair.of(message, getAttachments(row, fetchType));
+            MessageWithoutAttachment messageWithoutAttachment =
+                new MessageWithoutAttachment(
+                    messageId.getMessageId(),
+                    row.getDate(INTERNAL_DATE),
+                    row.getLong(FULL_CONTENT_OCTETS),
+                    row.getInt(BODY_START_OCTET),
+                    buildContent(row, fetchType),
+                    messageIdWithMetaData.getFlags(),
+                    getPropertyBuilder(row),
+                    messageId.getMailboxId(),
+                    messageId.getUid(),
+                    messageIdWithMetaData.getModSeq());
+            return Pair.of(messageWithoutAttachment, getAttachments(row, fetchType));
         } catch (MailboxException e) {
             throw Throwables.propagate(e);
         }
@@ -437,4 +440,40 @@ public class CassandraMessageDAO {
                     .toString();
         }
     }
+
+    static class MessageWithoutAttachment {
+
+        private final MessageId messageId;
+        private final Date internalDate;
+        private final Long size;
+        private final Integer boduSize;
+        private final SharedByteArrayInputStream content;
+        private final Flags flags;
+        private final PropertyBuilder propertyBuilder;
+        private final MailboxId mailboxId;
+        private final MessageUid messageUid;
+        private final long modSeq;
+
+        public MessageWithoutAttachment(MessageId messageId, Date internalDate, Long size, Integer boduSize, 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.content = content;
+            this.flags = flags;
+            this.propertyBuilder = propertyBuilder;
+            this.mailboxId = mailboxId;
+            this.messageUid = messageUid;
+            this.modSeq = modSeq;
+        }
+
+        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;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/620a82f7/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
index 51957fb..fad4fa4 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageIdMapper.java
@@ -102,14 +102,13 @@ public class CassandraMessageIdMapper implements MessageIdMapper {
             .sorted(Comparator.comparing(MailboxMessage::getUid));
     }
 
-    private Function<Pair<MailboxMessage, Stream<CassandraMessageDAO.MessageAttachmentRepresentation>>, Pair<MailboxMessage, Stream<MessageAttachment>>> loadAttachments() {
+    private Function<Pair<CassandraMessageDAO.MessageWithoutAttachment, Stream<CassandraMessageDAO.MessageAttachmentRepresentation>>, Pair<CassandraMessageDAO.MessageWithoutAttachment, Stream<MessageAttachment>>> loadAttachments() {
         return pair -> Pair.of(pair.getLeft(),
             new AttachmentLoader(attachmentMapper).getAttachments(pair.getRight().collect(Guavate.toImmutableSet())).stream());
     }
 
-    private FunctionChainer<Pair<MailboxMessage, Stream<MessageAttachment>>, SimpleMailboxMessage> toMailboxMessages() {
-        return Throwing.function(pair -> SimpleMailboxMessage.cloneWithAttachments(pair.getLeft(),
-                pair.getRight().collect(Guavate.toImmutableList())));
+    private FunctionChainer<Pair<CassandraMessageDAO.MessageWithoutAttachment, Stream<MessageAttachment>>, SimpleMailboxMessage> toMailboxMessages() {
+        return Throwing.function(pair -> pair.getLeft().toMailboxMessage(pair.getRight().collect(Guavate.toImmutableList())));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/620a82f7/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
index 33a4fff..5817bcc 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraMessageMapper.java
@@ -152,8 +152,7 @@ public class CassandraMessageMapper implements MessageMapper {
     private Stream<SimpleMailboxMessage> retrieveMessages(List<ComposedMessageIdWithMetaData> messageIds, FetchType fetchType, Optional<Integer> limit) {
         return messageDAO.retrieveMessages(messageIds, fetchType, limit).join()
                 .map(pair -> Pair.of(pair.getLeft(), new AttachmentLoader(attachmentMapper).getAttachments(pair.getRight().collect(Guavate.toImmutableSet()))))
-                .map(Throwing.function(pair -> SimpleMailboxMessage.cloneWithAttachments(pair.getLeft(),
-                        pair.getRight().stream().collect(Guavate.toImmutableList()))));
+                .map(Throwing.function(pair -> pair.getLeft().toMailboxMessage(pair.getRight().stream().collect(Guavate.toImmutableList()))));
     }
 
     @Override
@@ -346,7 +345,7 @@ public class CassandraMessageMapper implements MessageMapper {
                 mailbox,
                 messageDAO.retrieveMessages(ImmutableList.of(composedMessageIdWithMetaData), FetchType.Metadata, Optional.empty()).join()
                     .findFirst()
-                    .map(Pair::getLeft)
+                    .map(pair -> pair.getLeft().toMailboxMessage(ImmutableList.of()))
                     .orElseThrow(() -> new MessageDeletedDuringFlagsUpdateException(mailboxId, (CassandraMessageId) composedMessageIdWithMetaData.getComposedMessageId().getMessageId())));
     }
 }


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