Skip to content

Commit

Permalink
JAMES-2094 Move and Copy message should not save message again
Browse files Browse the repository at this point in the history
  • Loading branch information
quynhn authored and aduprat committed Jul 13, 2017
1 parent c4e25df commit 985ab86
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 6 deletions.
Expand Up @@ -165,6 +165,23 @@ public void save(MailboxMessage mailboxMessage) throws MailboxException {
.join();
}

@Override
public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxException {
CassandraId mailboxId = (CassandraId) mailboxMessage.getMailboxId();
mailboxMapper.findMailboxById(mailboxId);
CassandraMessageId messageId = (CassandraMessageId) mailboxMessage.getMessageId();
ComposedMessageIdWithMetaData composedMessageIdWithMetaData = ComposedMessageIdWithMetaData.builder()
.composedMessageId(new ComposedMessageId(mailboxId, messageId, mailboxMessage.getUid()))
.flags(mailboxMessage.createFlags())
.modSeq(mailboxMessage.getModSeq())
.build();
CompletableFuture.allOf(
imapUidDAO.insert(composedMessageIdWithMetaData),
messageIdDAO.insert(composedMessageIdWithMetaData))
.thenCompose(voidValue -> indexTableHandler.updateIndexOnAdd(mailboxMessage, mailboxId))
.join();
}

@Override
public void delete(MessageId messageId, List<MailboxId> mailboxIds) {
CassandraMessageId cassandraMessageId = (CassandraMessageId) messageId;
Expand Down
Expand Up @@ -267,6 +267,13 @@ public long getHighestModSeq(Mailbox mailbox) throws MailboxException {
public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws MailboxException {
CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();

save(mailbox, addUidAndModseq(message, mailboxId))
.thenCompose(voidValue -> indexTableHandler.updateIndexOnAdd(message, mailboxId))
.join();
return new SimpleMessageMetaData(message);
}

private MailboxMessage addUidAndModseq(MailboxMessage message, CassandraId mailboxId) throws MailboxException {
CompletableFuture<Optional<MessageUid>> uidFuture = uidProvider.nextUid(mailboxId);
CompletableFuture<Optional<Long>> modseqFuture = modSeqProvider.nextModSeq(mailboxId);
CompletableFuture.allOf(uidFuture, modseqFuture).join();
Expand All @@ -276,10 +283,7 @@ public MessageMetaData add(Mailbox mailbox, MailboxMessage message) throws Mailb
message.setModSeq(modseqFuture.join()
.orElseThrow(() -> new MailboxException("Can not find a MODSEQ to save " + message.getMessageId() + " in " + mailboxId)));

save(mailbox, message)
.thenCompose(voidValue -> indexTableHandler.updateIndexOnAdd(message, mailboxId))
.join();
return new SimpleMessageMetaData(message);
return message;
}

@Override
Expand Down Expand Up @@ -354,7 +358,7 @@ public <T> T execute(Transaction<T> transaction) throws MailboxException {
@Override
public MessageMetaData copy(Mailbox mailbox, MailboxMessage original) throws MailboxException {
original.setFlags(new FlagsBuilder().add(original.createFlags()).add(Flag.RECENT).build());
return add(mailbox, original);
return setInMailbox(mailbox, original);
}

@Override
Expand All @@ -371,6 +375,15 @@ public Flags getApplicableFlag(Mailbox mailbox) throws MailboxException {
.build();
}

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);
}

private CompletableFuture<Void> save(Mailbox mailbox, MailboxMessage message) throws MailboxException {
CassandraId mailboxId = (CassandraId) mailbox.getMailboxId();
return messageDAOV2.save(message)
Expand Down
Expand Up @@ -239,7 +239,7 @@ private void save(MailboxSession mailboxSession, MessageIdMapper messageIdMapper
MessageUid uid = mailboxSessionMapperFactory.getUidProvider().nextUid(mailboxSession, mailboxMessage.getMailboxId());
mailboxMessage.setModSeq(modSeq);
mailboxMessage.setUid(uid);
messageIdMapper.save(mailboxMessage);
messageIdMapper.copyInMailbox(mailboxMessage);
}

private Function<MailboxMessage, MessageResult> messageResultConverter(final MessageResult.FetchGroup fetchGroup) {
Expand Down
Expand Up @@ -40,6 +40,8 @@ public interface MessageIdMapper {

void save(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;

void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException;

void delete(MessageId messageId);

void delete(MessageId messageId, List<MailboxId> mailboxIds);
Expand Down
Expand Up @@ -35,6 +35,7 @@
import org.apache.james.mailbox.MessageManager;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.exception.MailboxNotFoundException;
import org.apache.james.mailbox.exception.SubscriptionException;
import org.apache.james.mailbox.manager.MailboxManagerFixture;
import org.apache.james.mailbox.model.MailboxACL;
Expand Down Expand Up @@ -179,6 +180,11 @@ public void save(MailboxMessage mailboxMessage) throws MailboxException {
messages.add(mailboxMessage);
}

@Override
public void copyInMailbox(MailboxMessage mailboxMessage) throws MailboxNotFoundException, MailboxException {
messages.add(mailboxMessage);
}

@Override
public void delete(final MessageId messageId) {
messages.removeAll(
Expand Down
Expand Up @@ -209,6 +209,54 @@ public void saveShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId()
assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaInboxMailbox.getMailboxId());
}

@Test
public void copyInMailboxShouldThrowWhenMailboxDoesntExist() throws Exception {
message1.setUid(mapperProvider.generateMessageUid());
message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
sut.save(message1);

SimpleMailbox notPersistedMailbox = new SimpleMailbox(new MailboxPath("#private", "benwa", "mybox"), UID_VALIDITY);
notPersistedMailbox.setMailboxId(mapperProvider.generateId());

SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(notPersistedMailbox.getMailboxId(), message1);
message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));

expectedException.expect(MailboxNotFoundException.class);
sut.copyInMailbox(message1InOtherMailbox);
}

@Test
public void copyInMailboxShouldSaveMessageInAnotherMailbox() throws Exception {
message1.setUid(mapperProvider.generateMessageUid());
message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
sut.save(message1);

SimpleMailboxMessage message1InOtherMailbox = SimpleMailboxMessage.copy(benwaWorkMailbox.getMailboxId(), message1);
message1InOtherMailbox.setUid(mapperProvider.generateMessageUid());
message1InOtherMailbox.setModSeq(mapperProvider.generateModSeq(benwaWorkMailbox));
sut.copyInMailbox(message1InOtherMailbox);

List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
assertThat(mailboxes).containsOnly(benwaInboxMailbox.getMailboxId(), benwaWorkMailbox.getMailboxId());
}

@Test
public void copyInMailboxShouldWorkWhenSavingTwoTimesWithSameMessageIdAndSameMailboxId() throws Exception {
message1.setUid(mapperProvider.generateMessageUid());
message1.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));
sut.save(message1);
SimpleMailboxMessage copiedMessage = SimpleMailboxMessage.copy(message1.getMailboxId(), message1);
copiedMessage.setUid(mapperProvider.generateMessageUid());
copiedMessage.setModSeq(mapperProvider.generateModSeq(benwaInboxMailbox));

sut.copyInMailbox(copiedMessage);
sut.copyInMailbox(copiedMessage);

List<MailboxId> mailboxes = sut.findMailboxes(message1.getMessageId());
assertThat(mailboxes).isEqualTo(ImmutableList.of(benwaInboxMailbox.getMailboxId(), benwaInboxMailbox.getMailboxId()));
}

@Test
public void deleteShouldNotThrowWhenUnknownMessage() {
sut.delete(message1.getMessageId());
Expand Down

0 comments on commit 985ab86

Please sign in to comment.