.build(out.toByteArray()), session); mailboxManager.startProcessingRequest(session);
public MessageFactory.MetaDataWithContent appendMessageInMailboxes(CreationMessageEntry createdEntry, List<MailboxId> targetMailboxes, MailboxSession session) throws MailboxException { Preconditions.checkArgument(!targetMailboxes.isEmpty()); ImmutableList<MessageAttachment> messageAttachments = getMessageAttachments(session, createdEntry.getValue().getAttachments()); byte[] messageContent = mimeMessageConverter.convert(createdEntry, messageAttachments); SharedByteArrayInputStream content = new SharedByteArrayInputStream(messageContent); Date internalDate = Date.from(createdEntry.getValue().getDate().toInstant()); MessageManager mailbox = mailboxManager.getMailbox(targetMailboxes.get(0), session); ComposedMessageId message = mailbox.appendMessage( MessageManager.AppendCommand.builder() .withInternalDate(internalDate) .withFlags(getFlags(createdEntry.getValue())) .notRecent() .build(content), session); if (targetMailboxes.size() > 1) { messageIdManager.setInMailboxes(message.getMessageId(), targetMailboxes, session); } return MessageFactory.MetaDataWithContent.builder() .uid(message.getUid()) .keywords(createdEntry.getValue().getKeywords()) .internalDate(internalDate.toInstant()) .sharedContent(content) .size(messageContent.length) .attachments(messageAttachments) .mailboxId(mailbox.getId()) .messageId(message.getMessageId()) .build(); }
ComposedMessageId message1 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags1) .build(messageContent1), session); ComposedMessageId message2 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags2) .build(messageContent2), session); ComposedMessageId message3 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags3) .build(messageContent3), session);
ComposedMessageId message1 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags) .build(messageContent1), session); ComposedMessageId message2 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags) .build(messageContent2), session); ComposedMessageId message3 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags) .build(messageContent3), session);
readMessageFlag.add(Flags.Flag.SEEN); messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(defaultUnseenFlag) .build(Message.Builder.of() .setSubject("test") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(defaultUnseenFlag) .build(Message.Builder.of() .setSubject("test2") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession); messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(readMessageFlag) .build(Message.Builder.of() .setSubject("test3") .setBody("testmail", StandardCharsets.UTF_8)), mailboxSession);
.build(Message.Builder.of() .setSubject("test") .setBody("content", StandardCharsets.UTF_8))); ComposedMessageId message2 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"), MessageManager.AppendCommand.builder() .build(Message.Builder.of() .setBody( MultipartBuilder.create("alternative")
.build(Message.Builder.of() .setSubject("test") .setBody("content", StandardCharsets.UTF_8))); ComposedMessageId message2 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"), MessageManager.AppendCommand.builder() .build(Message.Builder.of() .setBody( MultipartBuilder.create("alternative")
@Test public void processShouldReturnKeywordsWithoutForwardedWhenForwardedUserFlagsMessages() throws Exception { Flags flags = FlagsBuilder.builder() .add(Flag.ANSWERED, Flag.DELETED) .add(FORWARDED) .build(); MessageManager inbox = mailboxManager.getMailbox(inboxPath, session); ComposedMessageId message1 = inbox.appendMessage( AppendCommand.builder() .withFlags(flags) .build(messageContent1), session); GetMessagesRequest request = GetMessagesRequest.builder() .ids(ImmutableList.of(message1.getMessageId())) .build(); List<JmapResponse> result = testee.process(request, clientId, session).collect(Collectors.toList()); assertThat(result).hasSize(1) .extracting(JmapResponse::getResponse) .hasOnlyElementsOfType(GetMessagesResponse.class) .extracting(GetMessagesResponse.class::cast) .flatExtracting(GetMessagesResponse::list) .extracting(Message::getKeywords) .containsOnlyElementsOf( ImmutableList.of( ImmutableMap.of( "$Answered", true, FORWARDED, true))); }
@Test void reIndexShouldBeWellPerformed() throws Exception { // Given a mailbox with 1000 messages * 150 KB MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); mailboxManager.createMailbox(INBOX, systemSession); byte[] bigBody = (Strings.repeat("header: value\r\n", 10000) + "\r\nbody").getBytes(StandardCharsets.UTF_8); int threadCount = 10; int operationCount = 100; MessageManager mailbox = mailboxManager.getMailbox(INBOX, systemSession); ConcurrentTestRunner.builder() .operation((a, b) -> mailbox .appendMessage( MessageManager.AppendCommand.builder().build(bigBody), systemSession)) .threadCount(threadCount) .operationCount(operationCount) .runSuccessfullyWithin(Duration.ofMinutes(10)); // When We re-index reIndexer.reIndex(INBOX).run(); // The indexer is called for each message verify(messageSearchIndex).deleteAll(any(MailboxSession.class), any(Mailbox.class)); verify(messageSearchIndex, times(threadCount * operationCount)) .add(any(MailboxSession.class), any(Mailbox.class),any(MailboxMessage.class)); verifyNoMoreInteractions(messageSearchIndex); } }
@Test public void getMessageListFileNameFilterShouldNotReturnMessagesWithOnlyAttachmentContentMatching() throws Exception { mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "mailbox"); mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"), MessageManager.AppendCommand.builder() .build(Message.Builder.of() .setBody( MultipartBuilder.create("alternative") .addBodyPart(BodyPartBuilder.create() .setContentDisposition("attachment", "nomatch.md") .setBody(SingleBodyBuilder.create() .setText("matchme.txt ...") .setCharset(StandardCharsets.UTF_8) .build()) .build()) .build()))); await(); given() .header("Authorization", aliceAccessToken.serialize()) .body("[[\"getMessageList\", {\"filter\":{\"attachmentFileName\":\"matchme.txt\"}}, \"#0\"]]") .when() .post("/jmap") .then() .statusCode(200) .body(NAME, equalTo("messageList")) .body(ARGUMENTS + ".messageIds", hasSize(0)); }
public MessageFactory.MetaDataWithContent appendMessageInMailbox(org.apache.james.mime4j.dom.Message message, MessageManager messageManager, List<MessageAttachment> attachments, Flags flags, MailboxSession session) throws MailboxException { byte[] messageContent = asBytes(message); SharedByteArrayInputStream content = new SharedByteArrayInputStream(messageContent); Date internalDate = new Date(); ComposedMessageId appendedMessage = messageManager.appendMessage(MessageManager.AppendCommand.builder() .withFlags(flags) .build(content), session); return MessageFactory.MetaDataWithContent.builder() .uid(appendedMessage.getUid()) .keywords(Keywords.factory().fromFlags(flags)) .internalDate(internalDate.toInstant()) .sharedContent(content) .size(messageContent.length) .attachments(attachments) .mailboxId(messageManager.getId()) .messageId(appendedMessage.getMessageId()) .build(); }
@Test void userReIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(User.fromUsername(USERNAME)).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
@Test void messageReIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(INBOX, createdMessage.getUid()).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); } }
@Test void reIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(createdMessage.getMessageId()).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getComposedMessageIdWithMetaData().getComposedMessageId().getMessageId() .equals(createdMessage.getMessageId())); }
@Test void mailboxPathUserShouldBeUsedWhenReIndexing() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex().run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
@Test void reIndexShouldBeWellPerformed() throws Exception { MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME); MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get(); ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession) .appendMessage( MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"), systemSession); reIndexer.reIndex(INBOX).run(); ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class); ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class); ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class); verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture()); verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture()); verifyNoMoreInteractions(messageSearchIndex); assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId)); assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId) && message.getUid().equals(createdMessage.getUid())); }
public AppendCommand build(Message message) throws IOException { return build(DefaultMessageWriter.asBytes(message)); }
public static AppendCommand from(InputStream message) { return builder().build(message); }
public AppendCommand build(String msgIn) { return build(msgIn.getBytes(StandardCharsets.UTF_8)); }