You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2016/07/01 15:30:36 UTC

[2/4] james-project git commit: JAMES-1777 Add name in Attachment table

JAMES-1777 Add name in Attachment table


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9d0b3b41
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9d0b3b41
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9d0b3b41

Branch: refs/heads/master
Commit: 9d0b3b41954f08831e9feab6a0028adda1e98bb6
Parents: f643c18
Author: Antoine Duprat <ad...@linagora.com>
Authored: Thu Jun 23 21:47:28 2016 +0200
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Fri Jul 1 16:32:41 2016 +0200

----------------------------------------------------------------------
 .../mail/CassandraAttachmentMapper.java         |  5 +-
 .../modules/CassandraAttachmentModule.java      |  1 +
 .../table/CassandraAttachmentTable.java         |  3 +-
 .../mailbox/store/mail/model/Attachment.java    | 47 +++++++++++------
 .../store/mail/model/impl/MessageParser.java    |  5 +-
 .../store/mail/model/AttachmentMapperTest.java  | 18 +++++--
 .../store/mail/model/AttachmentTest.java        | 54 ++++++++++++++------
 .../james/jmap/model/MailboxMessageTest.java    |  1 -
 8 files changed, 94 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
index c36d824..fcbfec8 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/mail/CassandraAttachmentMapper.java
@@ -24,6 +24,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.FIELDS;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.ID;
+import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.NAME;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.PAYLOAD;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.SIZE;
 import static org.apache.james.mailbox.cassandra.table.CassandraAttachmentTable.TABLE_NAME;
@@ -46,6 +47,7 @@ import com.datastax.driver.core.Row;
 import com.datastax.driver.core.Session;
 import com.github.fge.lambdas.Throwing;
 import com.github.fge.lambdas.ThrownByLambdaException;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 
 public class CassandraAttachmentMapper implements AttachmentMapper {
@@ -82,7 +84,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
                 .attachmentId(AttachmentId.from(row.getString(ID)))
                 .bytes(row.getBytes(PAYLOAD).array())
                 .type(row.getString(TYPE))
-                .size(row.getLong(SIZE))
+                .name(Optional.fromNullable(row.getString(NAME)))
                 .build();
     }
 
@@ -101,6 +103,7 @@ public class CassandraAttachmentMapper implements AttachmentMapper {
                 .value(ID, attachment.getAttachmentId().getId())
                 .value(PAYLOAD, ByteBuffer.wrap(IOUtils.toByteArray(attachment.getStream())))
                 .value(TYPE, attachment.getType())
+                .value(NAME, attachment.getName().orNull())
                 .value(SIZE, attachment.getSize())
         );
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
index 0108161..b26fe71 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/modules/CassandraAttachmentModule.java
@@ -48,6 +48,7 @@ public class CassandraAttachmentModule implements CassandraModule {
                     .addPartitionKey(CassandraAttachmentTable.ID, text())
                     .addColumn(CassandraAttachmentTable.PAYLOAD, blob())
                     .addColumn(CassandraAttachmentTable.TYPE, text())
+                    .addColumn(CassandraAttachmentTable.NAME, text())
                     .addColumn(CassandraAttachmentTable.SIZE, bigint())));
         index = Collections.emptyList();
         types = Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentTable.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentTable.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentTable.java
index a7115eb..17158d1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentTable.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/table/CassandraAttachmentTable.java
@@ -25,7 +25,8 @@ public interface CassandraAttachmentTable {
     String ID = "id";
     String PAYLOAD = "payload";
     String TYPE = "type";
+    String NAME = "name";
     String SIZE = "size";
-    String[] FIELDS = { ID, PAYLOAD, TYPE, SIZE };
+    String[] FIELDS = { ID, PAYLOAD, TYPE, NAME, SIZE };
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Attachment.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Attachment.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Attachment.java
index 5af2b28..6205647 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Attachment.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/Attachment.java
@@ -26,6 +26,7 @@ import java.util.Arrays;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 
@@ -35,23 +36,15 @@ public class Attachment {
         return new Builder();
     }
 
-    public static Attachment from(byte[] bytes, String type) {
-        return builder()
-                .attachmentId(AttachmentId.forPayload(bytes))
-                .bytes(bytes)
-                .type(type)
-                .size(bytes.length)
-                .build();
-    }
-
     public static class Builder {
 
         private AttachmentId attachmentId;
         private byte[] bytes;
         private String type;
-        private Long size;
+        private Optional<String> name;
 
         private Builder() {
+            name = Optional.absent();
         }
 
         public Builder attachmentId(AttachmentId attachmentId) {
@@ -72,29 +65,43 @@ public class Attachment {
             return this;
         }
 
-        public Builder size(long size) {
-            this.size = size;
+        public Builder name(Optional<String> name) {
+            Preconditions.checkArgument(name != null);
+            this.name = name;
             return this;
         }
 
         public Attachment build() {
-            Preconditions.checkState(attachmentId != null, "'attachmentId' is mandatory");
             Preconditions.checkState(bytes != null, "'bytes' is mandatory");
+            AttachmentId builtAttachmentId = attachmentId();
+            Preconditions.checkState(builtAttachmentId != null, "'attachmentId' is mandatory");
             Preconditions.checkState(type != null, "'type' is mandatory");
-            Preconditions.checkState(size != null, "'size' is mandatory");
-            return new Attachment(bytes, attachmentId, type, size);
+            return new Attachment(bytes, builtAttachmentId, type, name, size());
+        }
+
+        private AttachmentId attachmentId() {
+            if (attachmentId != null) {
+                return attachmentId;
+            }
+            return AttachmentId.forPayload(bytes);
+        }
+
+        private long size() {
+            return bytes.length;
         }
     }
 
     private final byte[] bytes;
     private final AttachmentId attachmentId;
     private final String type;
+    private final Optional<String> name;
     private final long size;
 
-    private Attachment(byte[] bytes, AttachmentId attachmentId, String type, long size) {
+    private Attachment(byte[] bytes, AttachmentId attachmentId, String type, Optional<String> name, long size) {
         this.bytes = bytes;
         this.attachmentId = attachmentId;
         this.type = type;
+        this.name = name;
         this.size = size;
     }
 
@@ -106,6 +113,10 @@ public class Attachment {
         return type;
     }
 
+    public Optional<String> getName() {
+        return name;
+    }
+
     public long getSize() {
         return size;
     }
@@ -121,6 +132,7 @@ public class Attachment {
             return Objects.equal(attachmentId, other.attachmentId)
                 && Arrays.equals(bytes, other.bytes)
                 && Objects.equal(type, other.type)
+                && Objects.equal(name, other.name)
                 && Objects.equal(size, other.size);
         }
         return false;
@@ -128,7 +140,7 @@ public class Attachment {
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(attachmentId, bytes, type, size);
+        return Objects.hashCode(attachmentId, bytes, type, name, size);
     }
 
     @Override
@@ -138,6 +150,7 @@ public class Attachment {
                 .add("attachmentId", attachmentId)
                 .add("bytes", bytes)
                 .add("type", type)
+                .add("name", name)
                 .add("size", size)
                 .toString();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
index c784474..be342d8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/model/impl/MessageParser.java
@@ -96,6 +96,9 @@ public class MessageParser {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         messageWriter.writeBody(body, out);
         byte[] bytes = out.toByteArray();
-        return Attachment.from(bytes, contentType);
+        return Attachment.builder()
+                .bytes(bytes)
+                .type(contentType)
+                .build();
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
index 0fbfe1a..39b26e6 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentMapperTest.java
@@ -31,6 +31,7 @@ import org.xenei.junit.contract.Contract;
 import org.xenei.junit.contract.ContractTest;
 import org.xenei.junit.contract.IProducer;
 
+import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 
 @Contract(MapperProvider.class)
@@ -62,13 +63,16 @@ public class AttachmentMapperTest<T extends MapperProvider> {
     @ContractTest
     public void getAttachmentShouldThrowWhenNonReferencedAttachmentId() throws Exception {
         expected.expect(AttachmentNotFoundException.class);
-        attachmentMapper.getAttachment(AttachmentId.forPayload("unknown".getBytes()));
+        attachmentMapper.getAttachment(AttachmentId.forPayload("unknown".getBytes(Charsets.UTF_8)));
     }
 
     @ContractTest
     public void getAttachmentShouldReturnTheAttachmentWhenReferenced() throws Exception {
         //Given
-        Attachment expected = Attachment.from("payload".getBytes(), "content");
+        Attachment expected = Attachment.builder()
+                .bytes("payload".getBytes(Charsets.UTF_8))
+                .type("content")
+                .build();
         AttachmentId attachmentId = expected.getAttachmentId();
         attachmentMapper.storeAttachment(expected);
         //When
@@ -80,8 +84,14 @@ public class AttachmentMapperTest<T extends MapperProvider> {
     @ContractTest
     public void getAttachmentShouldReturnTheAttachmentsWhenMultipleStored() throws Exception {
         //Given
-        Attachment expected1 = Attachment.from("payload1".getBytes(), "content1");
-        Attachment expected2 = Attachment.from("payload2".getBytes(), "content2");
+        Attachment expected1 = Attachment.builder()
+                .bytes("payload1".getBytes(Charsets.UTF_8))
+                .type("content1")
+                .build();
+        Attachment expected2 = Attachment.builder()
+                .bytes("payload2".getBytes(Charsets.UTF_8))
+                .type("content2")
+                .build();
         AttachmentId attachmentId1 = expected1.getAttachmentId();
         AttachmentId attachmentId2 = expected2.getAttachmentId();
         //When

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentTest.java
index 5e96c7d..f3505f4 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/AttachmentTest.java
@@ -27,12 +27,17 @@ import java.io.InputStream;
 import org.apache.commons.io.IOUtils;
 import org.junit.Test;
 
+import com.google.common.base.Optional;
+
 public class AttachmentTest {
 
     @Test
     public void streamShouldBeConsumedOneTime() throws Exception {
         String input = "mystream";
-        Attachment attachment = Attachment.from(input.getBytes(), "content");
+        Attachment attachment = Attachment.builder()
+                .bytes(input.getBytes())
+                .type("content")
+                .build();
 
         InputStream stream = attachment.getStream();
         assertThat(stream).isNotNull();
@@ -42,7 +47,10 @@ public class AttachmentTest {
     @Test
     public void streamShouldBeConsumedMoreThanOneTime() throws Exception {
         String input = "mystream";
-        Attachment attachment = Attachment.from(input.getBytes(), "content");
+        Attachment attachment = Attachment.builder()
+                .bytes(input.getBytes())
+                .type("content")
+                .build();
 
         attachment.getStream();
         InputStream stream = attachment.getStream();
@@ -74,6 +82,12 @@ public class AttachmentTest {
             .type("");
     }
 
+    @Test (expected = IllegalArgumentException.class)
+    public void builderShouldThrowWhenNameIsNull() {
+        Attachment.builder()
+            .name(null);
+    }
+
     @Test (expected = IllegalStateException.class)
     public void buildShouldThrowWhenAttachmentIdIsNotProvided() {
         Attachment.builder().build();
@@ -94,29 +108,39 @@ public class AttachmentTest {
             .build();
     }
 
-    @Test (expected = IllegalStateException.class)
-    public void buildShouldThrowWhenSizeIsNotProvided() {
-        Attachment.builder()
-            .attachmentId(AttachmentId.forPayload("mystream".getBytes()))
-            .bytes("mystream".getBytes())
-            .type("content")
-            .build();
-    }
-
     @Test
-    public void fromShouldSetTheAttachmentId() throws Exception {
+    public void buildShouldSetTheAttachmentId() throws Exception {
         byte[] bytes = "mystream".getBytes();
-        Attachment attachment = Attachment.from(bytes, "content");
+        Attachment attachment = Attachment.builder()
+                .bytes(bytes)
+                .type("content")
+                .build();
         AttachmentId expected = AttachmentId.forPayload(bytes);
 
         assertThat(attachment.getAttachmentId()).isEqualTo(expected);
     }
 
     @Test
-    public void fromShouldSetTheSize() throws Exception {
+    public void buildShouldSetTheSize() throws Exception {
         String input = "mystream";
-        Attachment attachment = Attachment.from(input.getBytes(), "content");
+        Attachment attachment = Attachment.builder()
+                .bytes(input.getBytes())
+                .type("content")
+                .build();
 
         assertThat(attachment.getSize()).isEqualTo(input.getBytes().length);
     }
+
+    @Test
+    public void buildShouldSetTheName() throws Exception {
+        String input = "mystream";
+        Optional<String> expectedName = Optional.of("myName");
+        Attachment attachment = Attachment.builder()
+                .bytes(input.getBytes())
+                .type("content")
+                .name(expectedName)
+                .build();
+
+        assertThat(attachment.getName()).isEqualTo(expectedName);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9d0b3b41/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxMessageTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxMessageTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxMessageTest.java
index f356460..eae0c49 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxMessageTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxMessageTest.java
@@ -422,7 +422,6 @@ public class MailboxMessageTest {
                         .attachmentId(AttachmentId.from(blodId))
                         .bytes(payload.getBytes())
                         .type(type)
-                        .size(payload.length())
                         .build()), 
                 x -> MessageId.of("user|box|" + x));
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org