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 a6b44ca3ecf647b50acfd9bd5144cb97bfd71431 Author: Benoit Tellier <[email protected]> AuthorDate: Sun Apr 12 13:08:39 2020 +0700 JAMES-3148 MessageRepresentation should only ship information stored in CassandraMessageDAO Caller should carry over the mailbox context This allows reading basic metadata without the mailbox content of a message. --- .../mailbox/cassandra/mail/AttachmentLoader.java | 9 ++++-- .../cassandra/mail/CassandraMessageDAO.java | 24 +++++++-------- .../cassandra/mail/CassandraMessageIdMapper.java | 3 +- .../cassandra/mail/CassandraMessageMapper.java | 7 +++-- .../cassandra/mail/MessageRepresentation.java | 34 ++++------------------ 5 files changed, 28 insertions(+), 49 deletions(-) diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoader.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoader.java index a765dcd..17f0975 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoader.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/AttachmentLoader.java @@ -21,7 +21,9 @@ package org.apache.james.mailbox.cassandra.mail; import java.util.List; import java.util.stream.Stream; +import org.apache.commons.lang3.tuple.Pair; import org.apache.james.mailbox.model.AttachmentMetadata; +import org.apache.james.mailbox.model.ComposedMessageIdWithMetaData; import org.apache.james.mailbox.model.MessageAttachmentMetadata; import org.apache.james.mailbox.store.mail.MessageMapper; import org.apache.james.mailbox.store.mail.model.MailboxMessage; @@ -41,9 +43,10 @@ public class AttachmentLoader { this.attachmentMapper = attachmentMapper; } - public Mono<MailboxMessage> addAttachmentToMessage(MessageRepresentation messageRepresentation, MessageMapper.FetchType fetchType) { - return loadAttachments(messageRepresentation.getAttachments().stream(), fetchType) - .map(messageRepresentation::toMailboxMessage); + public Mono<MailboxMessage> addAttachmentToMessage(Pair<ComposedMessageIdWithMetaData, MessageRepresentation> messageRepresentation, + MessageMapper.FetchType fetchType) { + return loadAttachments(messageRepresentation.getRight().getAttachments().stream(), fetchType) + .map(attachments -> messageRepresentation.getRight().toMailboxMessage(messageRepresentation.getLeft(), attachments)); } private Mono<List<MessageAttachmentMetadata>> loadAttachments(Stream<MessageAttachmentRepresentation> messageAttachmentRepresentations, MessageMapper.FetchType fetchType) { 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 07dfbd1..baa1466 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 @@ -64,7 +64,6 @@ import org.apache.james.mailbox.cassandra.table.CassandraMessageV2Table.Properti import org.apache.james.mailbox.exception.MailboxException; 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.MessageAttachmentMetadata; import org.apache.james.mailbox.store.mail.MessageMapper.FetchType; @@ -227,23 +226,24 @@ public class CassandraMessageDAO { } public Mono<MessageRepresentation> retrieveMessage(ComposedMessageIdWithMetaData id, FetchType fetchType) { - return retrieveRow(id, fetchType) - .flatMap(resultSet -> message(resultSet, id, fetchType)); + CassandraMessageId cassandraMessageId = (CassandraMessageId) id.getComposedMessageId().getMessageId(); + return retrieveMessage(fetchType, cassandraMessageId); } - private Mono<ResultSet> retrieveRow(ComposedMessageIdWithMetaData messageId, FetchType fetchType) { - CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId.getComposedMessageId().getMessageId(); + private Mono<MessageRepresentation> retrieveMessage(FetchType fetchType, CassandraMessageId cassandraMessageId) { + return retrieveRow(cassandraMessageId, fetchType) + .flatMap(resultSet -> message(resultSet, cassandraMessageId, fetchType)); + } + private Mono<ResultSet> retrieveRow(CassandraMessageId messageId, FetchType fetchType) { return cassandraAsyncExecutor.execute(retrieveSelect(fetchType) .bind() - .setUUID(MESSAGE_ID, cassandraMessageId.get()) + .setUUID(MESSAGE_ID, messageId.get()) .setConsistencyLevel(QUORUM)); } private Mono<MessageRepresentation> - message(ResultSet rows,ComposedMessageIdWithMetaData messageIdWithMetaData, FetchType fetchType) { - ComposedMessageId messageId = messageIdWithMetaData.getComposedMessageId(); - + message(ResultSet rows, CassandraMessageId cassandraMessageId, FetchType fetchType) { if (rows.isExhausted()) { return Mono.empty(); } @@ -251,16 +251,12 @@ public class CassandraMessageDAO { Row row = rows.one(); return buildContentRetriever(fetchType, row).map(content -> new MessageRepresentation( - messageId.getMessageId(), + cassandraMessageId, row.getTimestamp(INTERNAL_DATE), row.getLong(FULL_CONTENT_OCTETS), row.getInt(BODY_START_OCTET), new SharedByteArrayInputStream(content), - messageIdWithMetaData.getFlags(), getPropertyBuilder(row), - messageId.getMailboxId(), - messageId.getUid(), - messageIdWithMetaData.getModSeq(), hasAttachment(row), getAttachments(row).collect(Guavate.toImmutableList()))); } 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 43b3c7c..281fb2b 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 @@ -101,7 +101,8 @@ public class CassandraMessageIdMapper implements MessageIdMapper { public Flux<MailboxMessage> findReactive(Collection<MessageId> messageIds, FetchType fetchType) { return Flux.fromStream(messageIds.stream()) .flatMap(messageId -> imapUidDAO.retrieve((CassandraMessageId) messageId, Optional.empty()), cassandraConfiguration.getMessageReadChunkSize()) - .flatMap(composedMessageId -> messageDAO.retrieveMessage(composedMessageId, fetchType), cassandraConfiguration.getMessageReadChunkSize()) + .flatMap(composedMessageId -> messageDAO.retrieveMessage(composedMessageId, fetchType) + .map(messageRepresentation -> Pair.of(composedMessageId, messageRepresentation)), cassandraConfiguration.getMessageReadChunkSize()) .flatMap(messageRepresentation -> attachmentLoader.addAttachmentToMessage(messageRepresentation, fetchType), cassandraConfiguration.getMessageReadChunkSize()) .groupBy(MailboxMessage::getMailboxId) .flatMap(this::keepMessageIfMailboxExists); 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 f5b9d55..465c9cf 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 @@ -29,6 +29,7 @@ import java.util.Optional; import javax.mail.Flags; import javax.mail.Flags.Flag; +import org.apache.commons.lang3.tuple.Pair; import org.apache.james.backends.cassandra.init.configuration.CassandraConfiguration; import org.apache.james.mailbox.ApplicableFlagBuilder; import org.apache.james.mailbox.FlagsBuilder; @@ -172,7 +173,7 @@ public class CassandraMessageMapper implements MessageMapper { private Mono<MailboxMessage> retrieveMessage(ComposedMessageIdWithMetaData messageId, FetchType fetchType) { return messageDAO.retrieveMessage(messageId, fetchType) - .flatMap(messageRepresentation -> attachmentLoader.addAttachmentToMessage(messageRepresentation, fetchType)); + .flatMap(messageRepresentation -> attachmentLoader.addAttachmentToMessage(Pair.of(messageId, messageRepresentation), fetchType)); } @Override @@ -213,8 +214,8 @@ public class CassandraMessageMapper implements MessageMapper { private Mono<SimpleMailboxMessage> expungeOne(CassandraId mailboxId, MessageUid messageUid) { return retrieveComposedId(mailboxId, messageUid) .flatMap(idWithMetadata -> deleteUsingMailboxId(idWithMetadata).thenReturn(idWithMetadata)) - .flatMap(idWithMetadata -> messageDAO.retrieveMessage(idWithMetadata, FetchType.Metadata)) - .map(pair -> pair.toMailboxMessage(ImmutableList.of())); + .flatMap(idWithMetadata -> messageDAO.retrieveMessage(idWithMetadata, FetchType.Metadata) + .map(pair -> pair.toMailboxMessage(idWithMetadata, ImmutableList.of()))); } private Mono<ComposedMessageIdWithMetaData> retrieveComposedId(CassandraId mailboxId, MessageUid uid) { diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java index 5416730..d627f2b 100644 --- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java +++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/MessageRepresentation.java @@ -22,14 +22,9 @@ package org.apache.james.mailbox.cassandra.mail; import java.util.Date; import java.util.List; -import javax.mail.Flags; import javax.mail.util.SharedByteArrayInputStream; -import org.apache.james.mailbox.MessageUid; -import org.apache.james.mailbox.ModSeq; -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.MessageAttachmentMetadata; import org.apache.james.mailbox.model.MessageId; import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; @@ -41,60 +36,43 @@ public class MessageRepresentation { private final Long size; private final Integer bodySize; private final SharedByteArrayInputStream content; - private final Flags flags; private final PropertyBuilder propertyBuilder; - private final MailboxId mailboxId; - private final MessageUid messageUid; - private final ModSeq modSeq; private final boolean hasAttachment; private final List<MessageAttachmentRepresentation> attachments; public MessageRepresentation(MessageId messageId, Date internalDate, Long size, Integer bodySize, SharedByteArrayInputStream content, - Flags flags, PropertyBuilder propertyBuilder, MailboxId mailboxId, MessageUid messageUid, ModSeq modSeq, - boolean hasAttachment, List<MessageAttachmentRepresentation> attachments) { + PropertyBuilder propertyBuilder, boolean hasAttachment, List<MessageAttachmentRepresentation> attachments) { this.messageId = messageId; this.internalDate = internalDate; this.size = size; this.bodySize = bodySize; this.content = content; - this.flags = flags; this.propertyBuilder = propertyBuilder; - this.mailboxId = mailboxId; - this.messageUid = messageUid; - this.modSeq = modSeq; this.hasAttachment = hasAttachment; this.attachments = attachments; } - public SimpleMailboxMessage toMailboxMessage(List<MessageAttachmentMetadata> attachments) { + public SimpleMailboxMessage toMailboxMessage(ComposedMessageIdWithMetaData metadata, List<MessageAttachmentMetadata> attachments) { return SimpleMailboxMessage.builder() .messageId(messageId) - .mailboxId(mailboxId) - .uid(messageUid) - .modseq(modSeq) + .mailboxId(metadata.getComposedMessageId().getMailboxId()) + .uid(metadata.getComposedMessageId().getUid()) + .modseq(metadata.getModSeq()) .internalDate(internalDate) .bodyStartOctet(bodySize) .size(size) .content(content) - .flags(flags) + .flags(metadata.getFlags()) .propertyBuilder(propertyBuilder) .addAttachments(attachments) .hasAttachment(hasAttachment) .build(); } - public MailboxId getMailboxId() { - return mailboxId; - } - public MessageId getMessageId() { return messageId; } - public ComposedMessageIdWithMetaData getMetadata() { - return new ComposedMessageIdWithMetaData(new ComposedMessageId(mailboxId, messageId, messageUid), flags, modSeq); - } - public SharedByteArrayInputStream getContent() { return content; } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
