private List<MailboxMessage> findRelatedMailboxMessages(MessageId messageId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); return messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full) .stream() .filter(hasRightsOn(mailboxSession, Right.Read)) .collect(Guavate.toImmutableList()); }
private void delete(MessageIdMapper messageIdMapper, List<MailboxMessage> messageList, MailboxSession mailboxSession) throws MailboxException { ImmutableList<MetadataWithMailboxId> metadataWithMailbox = messageList.stream() .map(StoreMessageIdManager::toMetadataWithMailboxId) .collect(Guavate.toImmutableList()); messageIdMapper.delete( messageList.stream() .collect(Guavate.toImmutableListMultimap( Message::getMessageId, MailboxMessage::getMailboxId))); MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); for (MetadataWithMailboxId metadataWithMailboxId : metadataWithMailbox) { dispatcher.expunged(mailboxSession, metadataWithMailboxId.messageMetaData, mailboxMapper.findMailboxById(metadataWithMailboxId.mailboxId)); } }
@Override public void setFlags(Flags newState, MessageManager.FlagsUpdateMode replace, MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.Write); Map<MailboxId, UpdatedFlags> updatedFlags = messageIdMapper.setFlags(messageId, mailboxIds, newState, replace); for (Map.Entry<MailboxId, UpdatedFlags> entry : updatedFlags.entrySet()) { dispatchFlagsChange(mailboxSession, entry.getKey(), entry.getValue()); } }
private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper, MailboxMessage mailboxMessage) throws MailboxException { long modSeq = mailboxSessionMapperFactory.getModSeqProvider().nextModSeq(mailboxSession, mailboxMessage.getMailboxId()); MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId()); mailboxMessage.setModSeq(modSeq); mailboxMessage.setUid(uid); messageIdMapper.copyInMailbox(mailboxMessage); }
@Override public Result run() { try { MailboxSession session = mailboxManager.createSystemSession("MessageIdReIndexerImpl"); return mailboxSessionMapperFactory.getMessageIdMapper(session) .find(ImmutableList.of(messageId), MessageMapper.FetchType.Full) .stream() .map(mailboxMessage -> reIndex(mailboxMessage, session)) .reduce(Task::combine) .orElse(Result.COMPLETED); } catch (Exception e) { LOGGER.warn("Failed to re-index {}", messageId, e); return Result.PARTIAL; } }
private void removeMessageFromMailboxes(MailboxMessage message, Set<MailboxId> mailboxesToRemove, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); MailboxMapper mailboxMapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession); SimpleMessageMetaData eventPayload = new SimpleMessageMetaData(message); for (MailboxId mailboxId: mailboxesToRemove) { messageIdMapper.delete(message.getMessageId(), mailboxesToRemove); dispatcher.expunged(mailboxSession, eventPayload, mailboxMapper.findMailboxById(mailboxId)); } }
@Override public Set<MessageId> accessibleMessages(Collection<MessageId> messageIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Metadata); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); return messageList.stream() .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) .map(MailboxMessage::getMessageId) .collect(Guavate.toImmutableSet()); }
@Override public List<MessageResult> getMessages(List<MessageId> messageIds, MessageResult.FetchGroup fetchGroup, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Full); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.Read); return messageList.stream() .filter(inMailboxes(allowedMailboxIds)) .map(Throwing.function(messageResultConverter(fetchGroup)).sneakyThrow()) .collect(Guavate.toImmutableList()); }
@Override public DeleteResult delete(MessageId messageId, List<MailboxId> mailboxIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); assertRightsOnMailboxes(mailboxIds, mailboxSession, Right.DeleteMessages); List<MailboxMessage> messageList = messageIdMapper .find(ImmutableList.of(messageId), MessageMapper.FetchType.Metadata) .stream() .filter(inMailboxes(mailboxIds)) .collect(Guavate.toImmutableList()); if (!messageList.isEmpty()) { delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.destroyed(messageId); } return DeleteResult.notFound(messageId); }
@Override public DeleteResult delete(List<MessageId> messageIds, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> messageList = messageIdMapper.find(messageIds, MessageMapper.FetchType.Metadata); ImmutableSet<MailboxId> allowedMailboxIds = getAllowedMailboxIds(mailboxSession, messageList, Right.DeleteMessages); ImmutableSet<MessageId> accessibleMessages = messageList.stream() .filter(message -> allowedMailboxIds.contains(message.getMailboxId())) .map(MailboxMessage::getMessageId) .distinct() .collect(Guavate.toImmutableSet()); Sets.SetView<MessageId> nonAccessibleMessages = Sets.difference(ImmutableSet.copyOf(messageIds), accessibleMessages); delete(messageIdMapper, messageList, mailboxSession); return DeleteResult.builder() .addDestroyed(accessibleMessages) .addNotFound(nonAccessibleMessages) .build(); }
public void setInMailboxesNoCheck(MessageId messageId, MailboxId targetMailboxId, MailboxSession mailboxSession) throws MailboxException { MessageIdMapper messageIdMapper = mailboxSessionMapperFactory.getMessageIdMapper(mailboxSession); List<MailboxMessage> currentMailboxMessages = messageIdMapper.find(ImmutableList.of(messageId), MessageMapper.FetchType.Full); MessageMoves messageMoves = MessageMoves.builder() .previousMailboxIds(toMailboxIds(currentMailboxMessages)) .targetMailboxIds(targetMailboxId) .build(); if (messageMoves.isChange()) { applyMessageMoveNoMailboxChecks(mailboxSession, currentMailboxMessages, messageMoves); } }
@Test public void findShouldReturnCorrectElementsWhenChunking() throws Exception { CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory(); CassandraMailboxSessionMapperFactory mapperFactory = TestCassandraMailboxSessionMapperFactory.forTests( cassandra.getConf(), cassandra.getTypesProvider(), messageIdFactory, CassandraConfiguration.builder() .messageReadChunkSize(3) .build()); saveMessages(); List<MailboxMessage> messages = mapperFactory.getMessageIdMapper(MAILBOX_SESSION) .find( ImmutableList.of(message1.getMessageId(), message2.getMessageId(), message3.getMessageId(), message4.getMessageId()), MessageMapper.FetchType.Metadata); assertThat(messages) .containsOnly(message1, message2, message3, message4); } }