@Override public MailboxId getId() { return mailbox.getMailboxId(); }
@Override public MessageUid nextUid(MailboxSession session, Mailbox mailbox) throws MailboxException { return nextUid(session, mailbox.getMailboxId()); }
@Override public MessageUid findFirstUnseenMessageUid(Mailbox mailbox) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return firstUnseenDAO.retrieveFirstUnread(mailboxId) .join() .orElse(null); }
@Override public Iterator<MessageUid> search(MailboxSession session, final Mailbox mailbox, SearchQuery query) throws MailboxException { Preconditions.checkArgument(session != null, "'session' is mandatory"); return searchResults(session, ImmutableList.of(mailbox).stream(), query) .stream() .filter(searchResult -> searchResult.getMailboxId().equals(mailbox.getMailboxId())) .map(SearchResult::getMessageUid) .iterator(); }
@Override public List<MessageUid> findRecentMessageUidsInMailbox(Mailbox mailbox) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return mailboxRecentDAO.getRecentMessageUidsInMailbox(mailboxId) .join() .collect(Guavate.toImmutableList()); }
@Override public Optional<MessageUid> lastUid(MailboxSession session, Mailbox mailbox) throws MailboxException { AtomicLong last = getLast((InMemoryId) mailbox.getMailboxId()); if (last == null) { return Optional.empty(); } return Optional.of(MessageUid.of(last.get())); }
@Override public long nextModSeq(MailboxSession mailboxSession, Mailbox mailbox) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return nextModSeq(mailboxId).join() .orElseThrow(() -> new MailboxException("Can not retrieve modseq for " + mailboxId)); }
@Override public Iterator<MailboxMessage> findInMailbox(Mailbox mailbox, MessageRange messageRange, FetchType ftype, int max) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return retrieveMessages(retrieveMessageIds(mailboxId, messageRange), ftype, Limit.from(max)) .join() .map(SimpleMailboxMessage -> (MailboxMessage) SimpleMailboxMessage) .sorted(Comparator.comparing(MailboxMessage::getUid)) .iterator(); }
@Override public void update(MailboxSession session, Mailbox mailbox, List<UpdatedFlags> updatedFlagsList) throws MailboxException { try { elasticSearchIndexer.update(updatedFlagsList.stream() .map(updatedFlags -> createUpdatedDocumentPartFromUpdatedFlags(mailbox, updatedFlags)) .collect(Collectors.toList())); } catch (Exception e) { LOGGER.error("Error when updating index on mailbox {}", mailbox.getMailboxId().serialize(), e); } }
@Override public long countMessagesInMailbox(Mailbox mailbox) throws MailboxException { try { JPAId mailboxId = (JPAId) mailbox.getMailboxId(); return (Long) getEntityManager().createNamedQuery("countMessagesInMailbox") .setParameter("idParam", mailboxId.getRawId()).getSingleResult(); } catch (PersistenceException e) { throw new MailboxException("Count of messages failed in mailbox " + mailbox, e); } }
@Override public long countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException { try { JPAId mailboxId = (JPAId) mailbox.getMailboxId(); return (Long) getEntityManager().createNamedQuery("countUnseenMessagesInMailbox") .setParameter("idParam", mailboxId.getRawId()).getSingleResult(); } catch (PersistenceException e) { throw new MailboxException("Count of useen messages failed in mailbox " + mailbox, e); } }
public CompletableFuture<Optional<Long>> countUnseenMessagesInMailbox(Mailbox mailbox) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return cassandraAsyncExecutor.executeSingleRow(bindWithMailbox(mailboxId, readStatement)) .thenApply(optional -> optional.map(row -> row.getLong(CassandraMailboxCountersTable.UNSEEN))); }
@Override public Flags getApplicableFlag(Mailbox mailbox) throws MailboxException { return new ApplicableFlagCalculator(getMembershipByUidForId((InMemoryId) mailbox.getMailboxId()).values()) .computeApplicableFlags(); }
private MessageMetaData setInMailbox(Mailbox mailbox, MailboxMessage message) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); insertIds(addUidAndModseq(message, mailboxId), mailboxId) .thenCompose(voidValue -> indexTableHandler.updateIndexOnAdd(message, mailboxId)) .join(); return new SimpleMessageMetaData(message); }
@Override public Flags getApplicableFlag(Mailbox mailbox) throws MailboxException { int maxBatchSize = -1; return new ApplicableFlagCalculator(findMessagesInMailbox((JPAId) mailbox.getMailboxId(), maxBatchSize)) .computeApplicableFlags(); }
@Override public Iterator<UpdatedFlags> updateFlags(Mailbox mailbox, FlagsUpdateCalculator flagUpdateCalculator, MessageRange range) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); Stream<ComposedMessageIdWithMetaData> toBeUpdated = messageIdDAO.retrieveMessages(mailboxId, range).join(); FlagsUpdateStageResult firstResult = runUpdateStage(mailboxId, toBeUpdated, flagUpdateCalculator); FlagsUpdateStageResult finalResult = handleUpdatesStagedRetry(mailboxId, flagUpdateCalculator, firstResult); if (finalResult.containsFailedResults()) { LOGGER.error("Can not update following UIDs {} for mailbox {}", finalResult.getFailed(), mailboxId.asUuid()); } return finalResult.getSucceeded().iterator(); }
private AbstractJPAMailboxMessage.MailboxIdUidKey buildKey(Mailbox mailbox, MailboxMessage message) { JPAId mailboxId = (JPAId) mailbox.getMailboxId(); AbstractJPAMailboxMessage.MailboxIdUidKey key = new AbstractJPAMailboxMessage.MailboxIdUidKey(); key.mailbox = mailboxId.getRawId(); key.uid = message.getUid().asLong(); return key; }
public CompletableFuture<Optional<MailboxCounters>> retrieveMailboxCounters(Mailbox mailbox) throws MailboxException { CassandraId mailboxId = (CassandraId) mailbox.getMailboxId(); return cassandraAsyncExecutor.executeSingleRow(bindWithMailbox(mailboxId, readStatement)) .thenApply(optional -> optional.map(row -> MailboxCounters.builder() .count(row.getLong(CassandraMailboxCountersTable.COUNT)) .unseen(row.getLong(CassandraMailboxCountersTable.UNSEEN)) .build())); }
@Ignore("JAMES-2514 Cassandra 3 supports long mailbox names. Hence we can not rely on this for failing") @Test public void saveShouldNotRemoveOldMailboxPathWhenCreatingTheNewMailboxPathFails() throws Exception { testee.save(new SimpleMailbox(MAILBOX_PATH, UID_VALIDITY)); Mailbox mailbox = testee.findMailboxByPath(MAILBOX_PATH); SimpleMailbox newMailbox = new SimpleMailbox(tooLongMailboxPath(mailbox.generateAssociatedPath()), UID_VALIDITY, mailbox.getMailboxId()); assertThatThrownBy(() -> testee.save(newMailbox)) .isInstanceOf(TooLongMailboxNameException.class); assertThat(mailboxPathV2DAO.retrieveId(MAILBOX_PATH).join()) .isPresent(); }
public CompletableFuture<Void> save(Mailbox mailbox) { CassandraId cassandraId = (CassandraId) mailbox.getMailboxId(); return executor.executeVoid(insertStatement.bind() .setUUID(ID, cassandraId.asUuid()) .setString(NAME, mailbox.getName()) .setLong(UIDVALIDITY, mailbox.getUidValidity()) .setUDTValue(MAILBOX_BASE, mailboxBaseTupleUtil.createMailboxBaseUDT(mailbox.getNamespace(), mailbox.getUser()))); }