Repository: james-project Updated Branches: refs/heads/master 3dc216295 -> 3f2f8a709
JAMES-2291 Store should not increase size when mail is already stored Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/f65401b2 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/f65401b2 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/f65401b2 Branch: refs/heads/master Commit: f65401b2f01e8e7cbce3cb207cf0c4ab9283a78b Parents: a986912 Author: Benoit Tellier <[email protected]> Authored: Tue Sep 4 11:53:50 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Tue Sep 4 17:09:01 2018 +0700 ---------------------------------------------------------------------- .../mailrepository/MailRepositoryContract.java | 11 +++++++++ .../cassandra/CassandraMailRepository.java | 26 ++++++++++++-------- .../CassandraMailRepositoryKeysDAO.java | 5 ++-- .../CassandraMailRepositoryKeysDAOTest.java | 17 +++++++++++++ 4 files changed, 47 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/f65401b2/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java index 0ba857d..7c1d83e 100644 --- a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java +++ b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java @@ -346,6 +346,17 @@ public interface MailRepositoryContract { } @Test + default void storeShouldHaveNoEffectOnSizeWhenAlreadyStoredMail() throws Exception { + MailRepository testee = retrieveRepository(); + + Mail mail1 = createMail(MAIL_1); + testee.store(mail1); + testee.store(mail1); + + assertThat(testee.size()).isEqualTo(1); + } + + @Test default void removeShouldHaveNoEffectForUnknownMail() throws Exception { MailRepository testee = retrieveRepository(); http://git-wip-us.apache.org/repos/asf/james-project/blob/f65401b2/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java index d576369..35d6383 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java +++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepository.java @@ -80,9 +80,8 @@ public class CassandraMailRepository implements MailRepository { blobIds.thenCompose(Throwing.function(pair -> mailDAO.store(url, mail, pair.getLeft(), pair.getRight()))) - .thenCompose(any -> CompletableFuture.allOf( - countDAO.increment(url), - keysDAO.store(url, mailKey))) + .thenCompose(any -> keysDAO.store(url, mailKey)) + .thenCompose(this::increaseSizeIfStored) .join(); return mailKey; } catch (IOException e) { @@ -90,7 +89,14 @@ public class CassandraMailRepository implements MailRepository { } } - public Pair<byte[], byte[]> splitHeaderBody(MimeMessage message) throws IOException, MessagingException { + private CompletionStage<Void> increaseSizeIfStored(Boolean isStored) { + if (isStored) { + return countDAO.increment(url); + } + return CompletableFuture.completedFuture(null); + } + + private Pair<byte[], byte[]> splitHeaderBody(MimeMessage message) throws IOException, MessagingException { byte[] messageAsArray = messageToArray(message); int bodyStartOctet = computeBodyStartOctet(messageAsArray); @@ -99,20 +105,20 @@ public class CassandraMailRepository implements MailRepository { getBodyBytes(messageAsArray, bodyStartOctet)); } - public byte[] messageToArray(MimeMessage message) throws IOException, MessagingException { + private byte[] messageToArray(MimeMessage message) throws IOException, MessagingException { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); message.writeTo(byteArrayOutputStream); return byteArrayOutputStream.toByteArray(); } - public byte[] getHeaderBytes(byte[] messageContentAsArray, int bodyStartOctet) { + private byte[] getHeaderBytes(byte[] messageContentAsArray, int bodyStartOctet) { ByteBuffer headerContent = ByteBuffer.wrap(messageContentAsArray, 0, bodyStartOctet); byte[] headerBytes = new byte[bodyStartOctet]; headerContent.get(headerBytes); return headerBytes; } - public byte[] getBodyBytes(byte[] messageContentAsArray, int bodyStartOctet) { + private byte[] getBodyBytes(byte[] messageContentAsArray, int bodyStartOctet) { if (bodyStartOctet < messageContentAsArray.length) { ByteBuffer bodyContent = ByteBuffer.wrap(messageContentAsArray, bodyStartOctet, @@ -125,7 +131,7 @@ public class CassandraMailRepository implements MailRepository { } } - public int computeBodyStartOctet(byte[] messageAsArray) throws IOException { + private int computeBodyStartOctet(byte[] messageAsArray) throws IOException { try (BodyOffsetInputStream bodyOffsetInputStream = new BodyOffsetInputStream(new ByteArrayInputStream(messageAsArray))) { consume(bodyOffsetInputStream); @@ -157,7 +163,7 @@ public class CassandraMailRepository implements MailRepository { .orElse(null); } - public CompletableFuture<Mail> toMail(CassandraMailRepositoryMailDAO.MailDTO mailDTO) { + private CompletableFuture<Mail> toMail(CassandraMailRepositoryMailDAO.MailDTO mailDTO) { return CompletableFutureUtil.combine( blobStore.readBytes(mailDTO.getHeaderBlobId()), blobStore.readBytes(mailDTO.getBodyBlobId()), @@ -168,7 +174,7 @@ public class CassandraMailRepository implements MailRepository { .build()); } - public MimeMessage toMimeMessage(byte[] bytes) { + private MimeMessage toMimeMessage(byte[] bytes) { try { return new MimeMessage(Session.getInstance(new Properties()), new ByteArrayInputStream(bytes)); } catch (MessagingException e) { http://git-wip-us.apache.org/repos/asf/james-project/blob/f65401b2/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java index 2a640c8..93bffec 100644 --- a/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java +++ b/server/mailrepository/mailrepository-cassandra/src/main/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAO.java @@ -75,12 +75,13 @@ public class CassandraMailRepositoryKeysDAO { private PreparedStatement prepareInsert(Session session) { return session.prepare(insertInto(KEYS_TABLE_NAME) + .ifNotExists() .value(REPOSITORY_NAME, bindMarker(REPOSITORY_NAME)) .value(MAIL_KEY, bindMarker(MAIL_KEY))); } - public CompletableFuture<Void> store(MailRepositoryUrl url, MailKey key) { - return executor.executeVoid(insertKey.bind() + public CompletableFuture<Boolean> store(MailRepositoryUrl url, MailKey key) { + return executor.executeReturnApplied(insertKey.bind() .setString(REPOSITORY_NAME, url.asString()) .setString(MAIL_KEY, key.asString())); } http://git-wip-us.apache.org/repos/asf/james-project/blob/f65401b2/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java ---------------------------------------------------------------------- diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java index 2b303c7..7763ae4 100644 --- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java +++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryKeysDAOTest.java @@ -140,4 +140,21 @@ class CassandraMailRepositoryKeysDAOTest { assertThat(isDeleted).isFalse(); } + + @Test + void storeShouldReturnTrueWhenNotPreviouslyStored() { + boolean isStored = testee.store(URL, KEY_1).join(); + + assertThat(isStored).isTrue(); + } + + @Test + void storeShouldReturnFalseWhenPreviouslyStored() { + testee.store(URL, KEY_1).join(); + + boolean isStored = testee.store(URL, KEY_1).join(); + + assertThat(isStored).isFalse(); + } + } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
