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