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]

Reply via email to