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 bt...@apache.org on 2018/04/18 00:36:53 UTC

[01/10] james-project git commit: JAMES-2361 Make some MIME4J build calls implicit

Repository: james-project
Updated Branches:
  refs/heads/master 2387fd8ee -> 3c379ddb4


JAMES-2361 Make some MIME4J build calls implicit


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

Branch: refs/heads/master
Commit: 68d013ff0e7a18d61222ff3ece2418c95722eb8f
Parents: 2387fd8
Author: benwa <bt...@linagora.com>
Authored: Tue Apr 17 10:46:47 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Apr 17 10:46:47 2018 +0700

----------------------------------------------------------------------
 .../search/AbstractMessageSearchIndexTest.java  | 13 ++++-----
 mdn/src/main/java/org/apache/james/mdn/MDN.java |  6 ++--
 .../util/mime/MessageContentExtractorTest.java  | 29 ++++++++------------
 .../integration/GetMessageListMethodTest.java   | 25 +++++++----------
 .../jmap/methods/MIMEMessageConverter.java      |  8 ++----
 .../jmap/methods/GetMessagesMethodTest.java     |  6 ++--
 6 files changed, 34 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 47c5bb5..9a3803f 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -50,7 +50,6 @@ import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
-import org.apache.james.mime4j.message.BodyPart;
 import org.apache.james.mime4j.message.BodyPartBuilder;
 import org.apache.james.mime4j.message.MultipartBuilder;
 import org.apache.james.util.ClassLoaderUtils;
@@ -1327,14 +1326,12 @@ public abstract class AbstractMessageSearchIndexTest {
     public void searchWithPDFAttachmentShouldReturnMailsWhenAttachmentContentMatches() throws Exception {
         Assume.assumeTrue(storeMailboxManager.getSupportedSearchCapabilities().contains(MailboxManager.SearchCapabilities.Attachment));
         byte[] attachmentContent = ClassLoaderUtils.getSystemResourceAsByteArray("eml/attachment.pdf");
-        BodyPart attachment = BodyPartBuilder.create()
-                .setBody(attachmentContent, "application/pdf")
-                .setContentDisposition("attachment")
-                .build();
-        BodyPart textPart = BodyPartBuilder.create().setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8).build();
         Multipart multipart = MultipartBuilder.create("mixed")
-                .addBodyPart(attachment)
-                .addBodyPart(textPart)
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody(attachmentContent, "application/pdf")
+                    .setContentDisposition("attachment"))
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8))
                 .build();
         Message message = Message.Builder.of()
                 .setBody(multipart)

http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/mdn/src/main/java/org/apache/james/mdn/MDN.java
----------------------------------------------------------------------
diff --git a/mdn/src/main/java/org/apache/james/mdn/MDN.java b/mdn/src/main/java/org/apache/james/mdn/MDN.java
index 02e1ac4..4a69548 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDN.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDN.java
@@ -140,13 +140,11 @@ public class MDN {
         builder.addBodyPart(BodyPartBuilder.create()
             .use(new BasicBodyFactory())
             .setBody(humanReadableText, Charsets.UTF_8)
-            .setContentType("text/plain", UTF_8_CHARSET)
-            .build());
+            .setContentType("text/plain", UTF_8_CHARSET));
         builder.addBodyPart(BodyPartBuilder.create()
             .use(new BasicBodyFactory())
             .setBody(report.formattedValue(), Charsets.UTF_8)
-            .setContentType(DISPOSITION_CONTENT_TYPE, UTF_8_CHARSET)
-            .build());
+            .setContentType(DISPOSITION_CONTENT_TYPE, UTF_8_CHARSET));
 
         return builder.build();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/server/container/util-java8/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java
----------------------------------------------------------------------
diff --git a/server/container/util-java8/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java b/server/container/util-java8/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java
index 7f4a620..deae849 100644
--- a/server/container/util-java8/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java
+++ b/server/container/util-java8/src/test/java/org/apache/james/util/mime/MessageContentExtractorTest.java
@@ -68,29 +68,26 @@ public class MessageContentExtractorTest {
 
     private MessageContentExtractor testee;
 
-    private BodyPart htmlPart;
-    private BodyPart textPart;
-    private BodyPart textAttachment;
-    private BodyPart inlineText;
-    private BodyPart inlineImage;
+    private BodyPartBuilder htmlPart;
+    private BodyPartBuilder textPart;
+    private BodyPartBuilder textAttachment;
+    private BodyPartBuilder inlineText;
+    private BodyPartBuilder inlineImage;
 
     @Before
     public void setup() throws IOException {
         testee = new MessageContentExtractor();
-        textPart = BodyPartBuilder.create().setBody(TEXT_CONTENT, "plain", StandardCharsets.UTF_8).build();
-        htmlPart = BodyPartBuilder.create().setBody(HTML_CONTENT, "html", StandardCharsets.UTF_8).build();
+        textPart = BodyPartBuilder.create().setBody(TEXT_CONTENT, "plain", StandardCharsets.UTF_8);
+        htmlPart = BodyPartBuilder.create().setBody(HTML_CONTENT, "html", StandardCharsets.UTF_8);
         textAttachment = BodyPartBuilder.create()
                 .setBody(ATTACHMENT_CONTENT, "plain", StandardCharsets.UTF_8)
-                .setContentDisposition("attachment")
-                .build();
+                .setContentDisposition("attachment");
         inlineText = BodyPartBuilder.create()
                 .setBody(ATTACHMENT_CONTENT, "plain", StandardCharsets.UTF_8)
-                .setContentDisposition("inline")
-                .build();
+                .setContentDisposition("inline");
         inlineImage = BodyPartBuilder.create()
                 .setBody(new byte[0], "image/png")
-                .setContentDisposition("inline")
-                .build();
+                .setContentDisposition("inline");
     }
 
     @Test
@@ -184,12 +181,10 @@ public class MessageContentExtractorTest {
         Multipart multipart = MultipartBuilder.create("report")
             .addBodyPart(BodyPartBuilder.create()
                 .setBody(textBody, "plain", StandardCharsets.UTF_8)
-                .setContentDisposition("inline")
-                .build())
+                .setContentDisposition("inline"))
             .addBodyPart(BodyPartBuilder.create()
                 .setBody("body 2", "rfc822-headers", StandardCharsets.UTF_8)
-                .setContentDisposition("inline")
-                .build())
+                .setContentDisposition("inline"))
             .build();
         Message message = Message.Builder.of()
             .setBody(multipart)

http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index c6337bb..65c464e 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -60,7 +60,6 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.probe.MailboxProbe;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
-import org.apache.james.mime4j.message.BodyPart;
 import org.apache.james.mime4j.message.BodyPartBuilder;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
 import org.apache.james.mime4j.message.MultipartBuilder;
@@ -1124,14 +1123,12 @@ public abstract class GetMessageListMethodTest {
     public void getMessageListShouldExcludeMessagesWhenAttachmentFilterDoesntMatch() throws Exception {
         mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "mailbox");
         byte[] attachmentContent = ClassLoaderUtils.getSystemResourceAsByteArray("eml/attachment.pdf");
-        BodyPart attachment = BodyPartBuilder.create()
-                .setBody(attachmentContent, "application/pdf")
-                .setContentDisposition("attachment")
-                .build();
-        BodyPart textPart = BodyPartBuilder.create().setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8).build();
         Multipart multipart = MultipartBuilder.create("mixed")
-                .addBodyPart(attachment)
-                .addBodyPart(textPart)
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody(attachmentContent, "application/pdf")
+                    .setContentDisposition("attachment"))
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8))
                 .build();
         Message message = Message.Builder.of()
                 .setBody(multipart)
@@ -1154,14 +1151,12 @@ public abstract class GetMessageListMethodTest {
     public void getMessageListShouldIncludeMessagesWhenAttachmentFilterMatches() throws Exception {
         mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "mailbox");
         byte[] attachmentContent = ClassLoaderUtils.getSystemResourceAsByteArray("eml/attachment.pdf");
-        BodyPart attachment = BodyPartBuilder.create()
-                .setBody(attachmentContent, "application/pdf")
-                .setContentDisposition("attachment")
-                .build();
-        BodyPart textPart = BodyPartBuilder.create().setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8).build();
         Multipart multipart = MultipartBuilder.create("mixed")
-                .addBodyPart(attachment)
-                .addBodyPart(textPart)
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody(attachmentContent, "application/pdf")
+                    .setContentDisposition("attachment"))
+                .addBodyPart(BodyPartBuilder.create()
+                    .setBody("The message has a PDF attachment.", "plain", StandardCharsets.UTF_8))
                 .build();
         Message message = Message.Builder.of()
                 .setBody(multipart)

http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
index 63f999f..90a3ebd 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/methods/MIMEMessageConverter.java
@@ -224,7 +224,7 @@ public class MIMEMessageConverter {
     private void addBody(CreationMessage newMessage, MultipartBuilder builder) throws IOException {
         if (newMessage.getHtmlBody().isPresent() && newMessage.getTextBody().isPresent()) {
             Multipart body = createMultipartAlternativeBody(newMessage);
-            builder.addBodyPart(BodyPartBuilder.create().setBody(body).build());
+            builder.addBodyPart(BodyPartBuilder.create().setBody(body));
         } else {
             addText(builder, newMessage.getTextBody());
             addHtml(builder, newMessage.getHtmlBody());
@@ -244,8 +244,7 @@ public class MIMEMessageConverter {
                 .use(bodyFactory)
                 .setBody(textBody.get(), Charsets.UTF_8)
                 .setContentType(PLAIN_TEXT_MEDIA_TYPE, UTF_8_CHARSET)
-                .setContentTransferEncoding(QUOTED_PRINTABLE)
-                .build());
+                .setContentTransferEncoding(QUOTED_PRINTABLE));
         }
     }
 
@@ -255,8 +254,7 @@ public class MIMEMessageConverter {
                 .use(bodyFactory)
                 .setBody(htmlBody.get(), Charsets.UTF_8)
                 .setContentType(HTML_MEDIA_TYPE, UTF_8_CHARSET)
-                .setContentTransferEncoding(QUOTED_PRINTABLE)
-                .build());
+                .setContentTransferEncoding(QUOTED_PRINTABLE));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/68d013ff/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
index 05a148a..f237073 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMessagesMethodTest.java
@@ -374,11 +374,9 @@ public class GetMessagesMethodTest {
                     .setBody(MultipartBuilder.create()
                         .setSubType("alternative")
                         .addBodyPart(BodyPartBuilder.create()
-                            .setBody("My plain message", "plain", StandardCharsets.UTF_8)
-                            .build())
+                            .setBody("My plain message", "plain", StandardCharsets.UTF_8))
                         .addBodyPart(BodyPartBuilder.create()
-                            .setBody("<a>The </a> <strong>HTML</strong> message", "html", StandardCharsets.UTF_8)
-                            .build())
+                            .setBody("<a>The </a> <strong>HTML</strong> message", "html", StandardCharsets.UTF_8))
                         .build())),
             session);
 


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


[06/10] james-project git commit: JAMES-2370 Define fileName criterion in Search Query

Posted by bt...@apache.org.
JAMES-2370 Define fileName criterion in Search Query


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

Branch: refs/heads/master
Commit: 49b6e7668d33f954a76470c5e25c23dfd9a6d573
Parents: d33bf76
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 13:19:22 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:38 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/mailbox/model/SearchQuery.java  | 10 +++++++++-
 .../apache/james/jmap/utils/FilterToSearchQuery.java | 15 +++------------
 .../james/jmap/utils/FilterToSearchQueryTest.java    | 15 +++++++++------
 3 files changed, 21 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/49b6e766/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
index fedab42..7925368 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/SearchQuery.java
@@ -670,6 +670,10 @@ public class SearchQuery implements Serializable {
         }
     }
 
+    public static Criterion attachmentFileName(String fileName) {
+        return new TextCriterion(fileName, Scope.ATTACHMENT_FILE_NAME);
+    }
+
     public static Criterion hasAttachment() {
         return hasAttachment(true);
     }
@@ -1105,7 +1109,11 @@ public class SearchQuery implements Serializable {
         /** Full message content including headers and attachments */
         FULL,
         /** Attachment content */
-        ATTACHMENTS
+        ATTACHMENTS,
+
+        /** Attachment file name, specified on Content-Disposition
+         * header of mime body parts */
+        ATTACHMENT_FILE_NAME
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/49b6e766/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
index 9e47c86..5f14323 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
@@ -24,7 +24,6 @@ import java.util.Optional;
 
 import javax.mail.Flags.Flag;
 
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -81,17 +80,9 @@ public class FilterToSearchQuery {
         filter.getMaxSize().ifPresent(maxSize -> searchQuery.andCriteria(SearchQuery.sizeLessThan(maxSize.asLong())));
         filter.getMinSize().ifPresent(minSize -> searchQuery.andCriteria(SearchQuery.sizeGreaterThan(minSize.asLong())));
         filter.getHasAttachment().ifPresent(hasAttachment -> searchQuery.andCriteria(SearchQuery.hasAttachment(hasAttachment)));
-        filter.getHasKeyword().ifPresent(hasKeyword -> {
-            keywordQuery(hasKeyword, true).ifPresent(hasKeywordCriterion
-                -> searchQuery.andCriteria(hasKeywordCriterion));
-        });
-        filter.getNotKeyword().ifPresent(notKeyword -> {
-            keywordQuery(notKeyword, false).ifPresent(notKeywordCriterion
-                -> searchQuery.andCriteria(notKeywordCriterion));
-        });
-        filter.getAttachmentFileName().ifPresent(attachmentFileName -> {
-            throw new NotImplementedException("`attachmentFileName` criterion is not yet handled by `mailbox-api`");
-        });
+        filter.getHasKeyword().ifPresent(hasKeyword -> keywordQuery(hasKeyword, true).ifPresent(searchQuery::andCriteria));
+        filter.getNotKeyword().ifPresent(notKeyword -> keywordQuery(notKeyword, false).ifPresent(searchQuery::andCriteria));
+        filter.getAttachmentFileName().ifPresent(attachmentFileName -> searchQuery.andCriteria(SearchQuery.attachmentFileName(attachmentFileName)));
 
         return searchQuery;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/49b6e766/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
index 693e856..5ff9a2a 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
@@ -28,7 +28,6 @@ import java.util.Optional;
 
 import javax.mail.Flags.Flag;
 
-import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -543,10 +542,14 @@ public class FilterToSearchQueryTest {
     }
 
     @Test
-    public void attachmentFileNameShouldNotBeImplemented() {
-        assertThatThrownBy(() -> new FilterToSearchQuery().convert(FilterCondition.builder()
-                .attachmentFileName(Optional.of("file.gz"))
-                .build()))
-            .isInstanceOf(NotImplementedException.class);
+    public void attachmentFileNameShouldMapWhenHasAttachmentFileName() {
+        String fileName = "file.gz";
+
+        SearchQuery expectedResult = new SearchQuery(SearchQuery.attachmentFileName(fileName));
+
+        assertThat(new FilterToSearchQuery().convert(FilterCondition.builder()
+            .attachmentFileName(Optional.of(fileName))
+            .build()))
+            .isEqualTo(expectedResult);
     }
 }


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


[08/10] james-project git commit: JAMES-2370 Allow mailboxProbeImpl to use AppendCommand

Posted by bt...@apache.org.
JAMES-2370 Allow mailboxProbeImpl to use AppendCommand


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

Branch: refs/heads/master
Commit: f4a32161990853cded85ffd48481200616a26560
Parents: 8063fc2
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 14:04:08 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:39 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MessageManager.java    |  4 +++
 .../apache/james/FixingGhostMailboxTest.java    | 25 ++++++++--------
 .../apache/james/modules/MailboxProbeImpl.java  |  8 ++++++
 .../integration/GetMailboxesMethodTest.java     | 30 ++++++++++----------
 .../integration/cucumber/DownloadStepdefs.java  | 11 ++++---
 .../integration/cucumber/MainStepdefs.java      |  3 +-
 .../cucumber/SetMailboxesMethodStepdefs.java    | 16 +++++------
 7 files changed, 53 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
index 00d8ef9..fbae11d 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MessageManager.java
@@ -157,6 +157,10 @@ public interface MessageManager {
             return builder().build(message);
         }
 
+        public static AppendCommand from(InputStream message) {
+            return builder().build(message);
+        }
+
         public static class Builder {
             private Optional<Date> internalDate;
             private Optional<Boolean> isRecent;

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
index f5d30e3..a7fa339 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/FixingGhostMailboxTest.java
@@ -37,15 +37,13 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.nullValue;
 
-import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.Date;
-
-import javax.mail.Flags;
 
 import org.apache.james.backends.cassandra.ContainerLifecycleConfiguration;
 import org.apache.james.backends.cassandra.init.CassandraTypesProvider;
 import org.apache.james.jmap.api.access.AccessToken;
+import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.cassandra.mail.task.MailboxMergingTask;
 import org.apache.james.mailbox.cassandra.mail.utils.MailboxBaseTupleUtil;
 import org.apache.james.mailbox.cassandra.modules.CassandraMailboxModule;
@@ -58,7 +56,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.probe.ACLProbe;
-import org.apache.james.mailbox.store.probe.MailboxProbe;
+import org.apache.james.mime4j.dom.Message;
 import org.apache.james.modules.ACLProbeImpl;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
@@ -110,7 +108,7 @@ public class FixingGhostMailboxTest {
     private String bob;
     private String cedric;
     private GuiceJamesServer jmapServer;
-    private MailboxProbe mailboxProbe;
+    private MailboxProbeImpl mailboxProbe;
     private ACLProbe aclProbe;
     private Session session;
     private CassandraTypesProvider cassandraTypesProvider;
@@ -164,14 +162,13 @@ public class FixingGhostMailboxTest {
         simulateGhostMailboxBug();
     }
 
-    private void simulateGhostMailboxBug() throws MailboxException {
+    private void simulateGhostMailboxBug() throws MailboxException, IOException {
         // State before ghost mailbox bug
         // Alice INBOX is delegated to Bob and contains one message
         aliceInboxPath = MailboxPath.forUser(alice, MailboxConstants.INBOX);
         aliceGhostInboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, MailboxConstants.INBOX);
         aclProbe.addRights(aliceInboxPath, bob, MailboxACL.FULL_RIGHTS);
-        message1 = mailboxProbe.appendMessage(alice, aliceInboxPath,
-            generateMessageContent(), new Date(), !RECENT, new Flags());
+        message1 = mailboxProbe.appendMessage(alice, aliceInboxPath, AppendCommand.from(generateMessageContent()));
         rule.await();
 
         // Simulate ghost mailbox bug
@@ -189,13 +186,15 @@ public class FixingGhostMailboxTest {
             .statusCode(200);
 
         // Received a new message
-        message2 = mailboxProbe.appendMessage(alice, aliceInboxPath,
-            generateMessageContent(), new Date(), !RECENT, new Flags());
+        message2 = mailboxProbe.appendMessage(alice, aliceInboxPath, AppendCommand.from(generateMessageContent()));
         rule.await();
     }
 
-    private ByteArrayInputStream generateMessageContent() {
-        return new ByteArrayInputStream("Subject: toto\r\n\r\ncontent".getBytes(StandardCharsets.UTF_8));
+    private Message generateMessageContent() throws IOException {
+        return Message.Builder.of()
+            .setSubject("toto")
+            .setBody("content", StandardCharsets.UTF_8)
+            .build();
     }
 
     @After

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
index a603408..ce3d08d 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/MailboxProbeImpl.java
@@ -168,6 +168,14 @@ public class MailboxProbeImpl implements GuiceProbe, MailboxProbe {
         return messageManager.appendMessage(message, internalDate, mailboxSession, isRecent, flags);
     }
 
+    public ComposedMessageId appendMessage(String username, MailboxPath mailboxPath, MessageManager.AppendCommand appendCommand)
+            throws MailboxException {
+
+        MailboxSession mailboxSession = mailboxManager.createSystemSession(username);
+        MessageManager messageManager = mailboxManager.getMailbox(mailboxPath, mailboxSession);
+        return messageManager.appendMessage(appendCommand, mailboxSession);
+    }
+
     @Override
     public void copyMailbox(String srcBean, String dstBean) throws Exception {
         throw new NotImplementedException();

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
index 0cda516..35c2063 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
@@ -46,20 +46,17 @@ import static org.hamcrest.Matchers.isEmptyOrNullString;
 import static org.hamcrest.Matchers.not;
 import static org.hamcrest.Matchers.nullValue;
 
-import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
 
-import javax.mail.Flags;
-
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.model.mailbox.MailboxNamespace;
 import org.apache.james.mailbox.DefaultMailboxes;
+import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxConstants;
@@ -70,8 +67,8 @@ import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.SerializableQuotaValue;
 import org.apache.james.mailbox.store.probe.ACLProbe;
-import org.apache.james.mailbox.store.probe.MailboxProbe;
 import org.apache.james.mailbox.store.probe.QuotaProbe;
+import org.apache.james.mime4j.dom.Message;
 import org.apache.james.modules.ACLProbeImpl;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.QuotaProbesImpl;
@@ -96,9 +93,11 @@ public abstract class GetMailboxesMethodTest {
 
     private AccessToken accessToken;
     private GuiceJamesServer jmapServer;
-    private MailboxProbe mailboxProbe;
+    private MailboxProbeImpl mailboxProbe;
     private ACLProbe aclProbe;
     private QuotaProbe quotaProbe;
+
+    private Message message;
     
     @Before
     public void setup() throws Throwable {
@@ -118,6 +117,11 @@ public abstract class GetMailboxesMethodTest {
         dataProbe.addUser(ALICE, ALICE_PASSWORD);
         dataProbe.addUser(BOB, BOB_PASSWORD);
         accessToken = authenticateJamesUser(baseUri(jmapServer), ALICE, ALICE_PASSWORD);
+
+        message = Message.Builder.of()
+            .setSubject("test")
+            .setBody("testmail", StandardCharsets.UTF_8)
+            .build();
     }
 
     @After
@@ -379,8 +383,7 @@ public abstract class GetMailboxesMethodTest {
     public void getMailboxesShouldReturnMailboxesWhenAvailable() throws Exception {
         mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "name");
 
-        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "name"),
-                new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "name"), AppendCommand.from(message));
 
         given()
             .header("Authorization", accessToken.serialize())
@@ -397,8 +400,7 @@ public abstract class GetMailboxesMethodTest {
     public void getMailboxesShouldReturnMailboxPropertiesWhenAvailable() throws Exception {
         String myMailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "name").serialize();
 
-        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "name"),
-                new ByteArrayInputStream("Subject: test\r\n\r\ntestmail".getBytes()), new Date(), false, new Flags());
+        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "name"), AppendCommand.from(message));
 
         given()
             .header("Authorization", accessToken.serialize())
@@ -865,10 +867,8 @@ public abstract class GetMailboxesMethodTest {
     @Test
     public void getMailboxesShouldReturnUpdatedQuotasForInboxWhenMailReceived() throws Exception {
         String mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, DefaultMailboxes.INBOX).serialize();
-        String message = "Subject: hello\r\n\r\nContent";
-        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, DefaultMailboxes.INBOX),
-                new ByteArrayInputStream(message.getBytes(StandardCharsets.UTF_8)),
-                new Date(), true, new Flags());
+
+        mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, DefaultMailboxes.INBOX), AppendCommand.from(message));
 
         given()
             .header("Authorization", accessToken.serialize())
@@ -879,7 +879,7 @@ public abstract class GetMailboxesMethodTest {
             .statusCode(200)
             .body(NAME, equalTo("mailboxes"))
             .body(ARGUMENTS + ".list", hasSize(1))
-            .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['STORAGE'].used", equalTo(message.length()))
+            .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['STORAGE'].used", equalTo(85))
             .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['MESSAGE'].used", equalTo(1));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/DownloadStepdefs.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/DownloadStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/DownloadStepdefs.java
index a4365ac..1ff185b 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/DownloadStepdefs.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/DownloadStepdefs.java
@@ -26,13 +26,11 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.http.Header;
@@ -42,6 +40,7 @@ import org.apache.http.client.fluent.Response;
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.model.AttachmentAccessToken;
+import org.apache.james.mailbox.MessageManager.AppendCommand;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -96,7 +95,7 @@ public class DownloadStepdefs {
         MailboxPath mailboxPath = MailboxPath.forUser(user, mailbox);
 
         ComposedMessageId composedMessageId = mainStepdefs.mailboxProbe.appendMessage(user, mailboxPath,
-            ClassLoader.getSystemResourceAsStream("eml/oneAttachment.eml"), new Date(), false, new Flags());
+            AppendCommand.from(ClassLoader.getSystemResourceAsStream("eml/oneAttachment.eml")));
 
         inputToMessageId.put(messageId, composedMessageId.getMessageId());
     }
@@ -106,7 +105,7 @@ public class DownloadStepdefs {
         MailboxPath mailboxPath = MailboxPath.forUser(user, mailbox);
 
         ComposedMessageId composedMessageId = mainStepdefs.mailboxProbe.appendMessage(user, mailboxPath,
-                ClassLoader.getSystemResourceAsStream("eml/oneAttachment.eml"), new Date(), false, new Flags());
+            AppendCommand.from(ClassLoader.getSystemResourceAsStream("eml/oneAttachment.eml")));
 
         inputToMessageId.put(messageId, composedMessageId.getMessageId());
         attachmentsByMessageId.put(messageId, attachmentId);
@@ -118,7 +117,7 @@ public class DownloadStepdefs {
         MailboxPath mailboxPath = MailboxPath.forUser(user, mailbox);
 
         mainStepdefs.mailboxProbe.appendMessage(user, mailboxPath,
-                ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml"), new Date(), false, new Flags());
+                AppendCommand.from(ClassLoader.getSystemResourceAsStream("eml/oneInlinedImage.eml")));
         
         attachmentsByMessageId.put(messageId, attachmentId);
     }
@@ -128,7 +127,7 @@ public class DownloadStepdefs {
         MailboxPath mailboxPath = MailboxPath.forUser(user, mailbox);
 
         mainStepdefs.mailboxProbe.appendMessage(user, mailboxPath,
-            ClassLoader.getSystemResourceAsStream("eml/sameInlinedImages.eml"), new Date(), false, new Flags());
+            AppendCommand.from(ClassLoader.getSystemResourceAsStream("eml/sameInlinedImages.eml")));
 
         attachmentsByMessageId.put(messageName, attachmentId);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/MainStepdefs.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/MainStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/MainStepdefs.java
index 3eefebb..567cd0e 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/MainStepdefs.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/MainStepdefs.java
@@ -28,7 +28,6 @@ import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.probe.ACLProbe;
-import org.apache.james.mailbox.store.probe.MailboxProbe;
 import org.apache.james.modules.ACLProbeImpl;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
@@ -46,7 +45,7 @@ public class MainStepdefs {
 
     public GuiceJamesServer jmapServer;
     public DataProbe dataProbe;
-    public MailboxProbe mailboxProbe;
+    public MailboxProbeImpl mailboxProbe;
     public ACLProbe aclProbe;
     public MessageIdProbe messageIdProbe;
     public Runnable awaitMethod = () -> { };

http://git-wip-us.apache.org/repos/asf/james-project/blob/f4a32161/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMailboxesMethodStepdefs.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMailboxesMethodStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMailboxesMethodStepdefs.java
index a02db3d..6e85a8a 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMailboxesMethodStepdefs.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/SetMailboxesMethodStepdefs.java
@@ -24,22 +24,21 @@ import static org.apache.james.jmap.TestingConstants.NAME;
 import static org.apache.james.jmap.TestingConstants.calmlyAwait;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.io.ByteArrayInputStream;
-import java.util.Date;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import javax.inject.Inject;
-import javax.mail.Flags;
 
-import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mime4j.dom.Message;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.Maps;
@@ -75,11 +74,12 @@ public class SetMailboxesMethodStepdefs {
         mainStepdefs.awaitMethod.run();
     }
 
-    private void appendMessage(MailboxPath mailboxPath, int i) throws MailboxException {
-        String content = "Subject: test" + i + "\r\n\r\n"
-                + "testBody" + i;
+    private void appendMessage(MailboxPath mailboxPath, int i) throws Exception {
         mainStepdefs.mailboxProbe.appendMessage(userStepdefs.getConnectedUser(), mailboxPath,
-                new ByteArrayInputStream(content.getBytes()), new Date(), false, new Flags());
+                MessageManager.AppendCommand.from(Message.Builder.of()
+                    .setSubject("test" + i)
+                    .setBody("testBody" + i, StandardCharsets.UTF_8)
+                    .build()));
     }
 
     @Given("^\"([^\"]*)\" has a mailbox \"([^\"]*)\"$")


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


[02/10] james-project git commit: JAMES-2355 setenv vs setenv.sh

Posted by bt...@apache.org.
JAMES-2355 setenv vs setenv.sh

Fixes a bug where two of the scripts (run.sh and james-cli.sh)
attempts to source 'setenv.sh' while the script james will attempt
to source 'setenv'. (JAMES-2355)

Adds extra feature to setenv.sh:  Can now optionally be put
in conf dir instead of bin dir (where configuration-like data do
not really belong)

Added extra comments in the setenv files.

Changed semi-bug in setenv.bat:  The CLASSPATH_PREFIX variable was
using Unix syntax, not Windows syntax. This has been changed to 
Windows syntax. I'm not sure this has had any negative effect in
the past as the Java classpath variable on Windows seems to be 
forgiving about use of Unix path separator. However, this is an 
undocumented feature and we should not rely on undocumented features.

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

Branch: refs/heads/master
Commit: 356b47ecdd5cc033bba3d4cf00879216ecd75400
Parents: 68d013f
Author: phansson <pe...@yahoo.com>
Authored: Mon Mar 26 08:08:51 2018 +0200
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:34:25 2018 +0700

----------------------------------------------------------------------
 server/app/pom.xml                     |  1 +
 server/app/src/main/app/bin/setenv.bat | 50 ++++++++++++++++++-----------
 server/app/src/main/app/bin/setenv.sh  | 49 ++++++++++++++++------------
 3 files changed, 61 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/356b47ec/server/app/pom.xml
----------------------------------------------------------------------
diff --git a/server/app/pom.xml b/server/app/pom.xml
index 3b91ff5..027e1cc 100644
--- a/server/app/pom.xml
+++ b/server/app/pom.xml
@@ -829,6 +829,7 @@
                                 <!-- this is needed because appassembler is not really smart on some settings -->
                                 <replace file="${project.build.directory}/appassembler/jsw/james/conf/wrapper.conf" token="lib/wrapper.jar" value="%REPO_DIR%/wrapper.jar" />
                                 <replace file="${project.build.directory}/appassembler/jsw/james/bin/james" token="logs" value="var" />
+                                <replace file="${project.build.directory}/appassembler/jsw/james/bin/james" token="setenv" value="setenv.sh" />
 
                                 <!-- copy the linux wrapper-linux-x86-32 to wrapper, so use it as default if no matching wrapper was found -->
                                 <copy file="${project.build.directory}/appassembler/jsw/james/bin/wrapper-linux-x86-32" tofile="${project.build.directory}/appassembler/jsw/james/bin/wrapper" />

http://git-wip-us.apache.org/repos/asf/james-project/blob/356b47ec/server/app/src/main/app/bin/setenv.bat
----------------------------------------------------------------------
diff --git a/server/app/src/main/app/bin/setenv.bat b/server/app/src/main/app/bin/setenv.bat
index cc22659..3a96a1e 100644
--- a/server/app/src/main/app/bin/setenv.bat
+++ b/server/app/src/main/app/bin/setenv.bat
@@ -1,19 +1,31 @@
-@REM ----------------------------------------------------------------------------
-@REM Copyright 2001-2010 The Apache Software Foundation.
-@REM
-@REM Licensed under the Apache License, Version 2.0 (the "License");
-@REM you may not use this file except in compliance with the License.
-@REM You may obtain a copy of the License at
-@REM
-@REM      http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing, software
-@REM distributed under the License is distributed on an "AS IS" BASIS,
-@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@REM See the License for the specific language governing permissions and
-@REM limitations under the License.
-@REM ----------------------------------------------------------------------------
-@REM
-
-@REM Add every needed extra jar to this 
-set CLASSPATH_PREFIX=../conf/lib/*
\ No newline at end of file
+@REM ----------------------------------------------------------------------------
+@REM Copyright 2001-2018 The Apache Software Foundation.
+@REM
+@REM Licensed under the Apache License, Version 2.0 (the "License");
+@REM you may not use this file except in compliance with the License.
+@REM You may obtain a copy of the License at
+@REM
+@REM      http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing, software
+@REM distributed under the License is distributed on an "AS IS" BASIS,
+@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@REM See the License for the specific language governing permissions and
+@REM limitations under the License.
+@REM ----------------------------------------------------------------------------
+@REM
+
+@REM   This file is sourced (using 'CALL') by the various start scripts. 
+@REM   You can use it to add extra environment variables to the startup 
+@REM   procedure.
+@REM   
+@REM   NOTE:  Instead of changing this file it is better to create a new file
+@REM          named setenv.bat in the ../conf directory as the files in the
+@REM          bin directory should generally not be changed.
+
+
+@REM Add every needed extra jar to this 
+set CLASSPATH_PREFIX=..\conf\lib\*
+
+
+if exist "%BASEDIR%\conf\setenv.bat" call "%BASEDIR%\conf\setenv.bat"

http://git-wip-us.apache.org/repos/asf/james-project/blob/356b47ec/server/app/src/main/app/bin/setenv.sh
----------------------------------------------------------------------
diff --git a/server/app/src/main/app/bin/setenv.sh b/server/app/src/main/app/bin/setenv.sh
index 1e6094c..5488469 100644
--- a/server/app/src/main/app/bin/setenv.sh
+++ b/server/app/src/main/app/bin/setenv.sh
@@ -1,20 +1,29 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Copyright 2001-2010 The Apache Software Foundation.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ----------------------------------------------------------------------------
-#
-# Add every needed extra jar to this
-CLASSPATH_PREFIX=../conf/lib/*
-export CLASSPATH_PREFIX
\ No newline at end of file
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Copyright 2001-2018 The Apache Software Foundation.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# ----------------------------------------------------------------------------
+#
+# This file is sourced by the various start scripts. You can use it to
+# add extra environment variables to the startup procedure.
+#
+#   NOTE:  Instead of changing this file it is better to create a file
+#          named setenv.sh in the ../conf directory as the files in the
+#          bin directory should generally not be changed.
+
+# Add every needed extra jar to this
+CLASSPATH_PREFIX=../conf/lib/*
+export CLASSPATH_PREFIX
+
+[ -f "$BASEDIR"/conf/setenv.sh ] && . "$BASEDIR"/conf/setenv.sh


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


[04/10] james-project git commit: JAMES-2370 JMAP layer should define `attachmentFileName` filter for GetMessageList

Posted by bt...@apache.org.
JAMES-2370 JMAP layer should define `attachmentFileName` filter for GetMessageList


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

Branch: refs/heads/master
Commit: d33bf76d10a9dfea460b705df1d7c47fe91740f5
Parents: 7f0b2f8
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 13:10:46 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:07 2018 +0700

----------------------------------------------------------------------
 .../james/jmap/model/FilterCondition.java       | 23 ++++++++++++++++----
 .../james/jmap/utils/FilterToSearchQuery.java   |  4 ++++
 .../james/jmap/model/FilterConditionTest.java   |  4 +++-
 .../jmap/utils/FilterToSearchQueryTest.java     |  9 ++++++++
 4 files changed, 35 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d33bf76d/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
index f98cec0..f6b89aa 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/FilterCondition.java
@@ -65,12 +65,14 @@ public class FilterCondition implements Filter {
         private Header header;
         private Optional<String> hasKeyword;
         private Optional<String> notKeyword;
+        private Optional<String> attachmentFileName;
 
         private Builder() {
             inMailboxes = Optional.empty();
             notInMailboxes = Optional.empty();
             hasKeyword = Optional.empty();
             notKeyword = Optional.empty();
+            attachmentFileName = Optional.empty();
         }
 
         public Builder inMailboxes(String... inMailboxes) {
@@ -204,6 +206,11 @@ public class FilterCondition implements Filter {
             return this;
         }
 
+        public Builder attachmentFileName(Optional<String> attachmentFileName) {
+            this.attachmentFileName = attachmentFileName;
+            return this;
+        }
+
         public FilterCondition build() {
             Preconditions.checkArgument(!hasKeyword.isPresent() || (new Keyword(hasKeyword.get()) != null), "hasKeyword is not valid");
             Preconditions.checkArgument(!notKeyword.isPresent() || (new Keyword(notKeyword.get()) != null), "notKeyword is not valid");
@@ -211,7 +218,7 @@ public class FilterCondition implements Filter {
                     Optional.ofNullable(isFlagged), Optional.ofNullable(isUnread), Optional.ofNullable(isAnswered), Optional.ofNullable(isDraft), Optional.ofNullable(isForwarded),
                     Optional.ofNullable(hasAttachment),
                     Optional.ofNullable(text), Optional.ofNullable(from), Optional.ofNullable(to), Optional.ofNullable(cc), Optional.ofNullable(bcc), Optional.ofNullable(subject),
-                    Optional.ofNullable(body), Optional.ofNullable(attachments), Optional.ofNullable(header), hasKeyword, notKeyword);
+                    Optional.ofNullable(body), Optional.ofNullable(attachments), Optional.ofNullable(header), hasKeyword, notKeyword, attachmentFileName);
         }
     }
 
@@ -238,12 +245,13 @@ public class FilterCondition implements Filter {
     private final Optional<Header> header;
     private final Optional<String> hasKeyword;
     private final Optional<String> notKeyword;
+    private final Optional<String> attachmentFileName;
 
     @VisibleForTesting FilterCondition(Optional<List<String>> inMailboxes, Optional<List<String>> notInMailboxes, Optional<ZonedDateTime> before, Optional<ZonedDateTime> after, Optional<Number> minSize, Optional<Number> maxSize,
                                        Optional<Boolean> isFlagged, Optional<Boolean> isUnread, Optional<Boolean> isAnswered, Optional<Boolean> isDraft, Optional<Boolean> isForwarded,
                                        Optional<Boolean> hasAttachment,
                                        Optional<String> text, Optional<String> from, Optional<String> to, Optional<String> cc, Optional<String> bcc, Optional<String> subject,
-                                       Optional<String> body, Optional<String> attachments, Optional<Header> header, Optional<String> hasKeyword, Optional<String> notKeyword) {
+                                       Optional<String> body, Optional<String> attachments, Optional<Header> header, Optional<String> hasKeyword, Optional<String> notKeyword, Optional<String> attachmentFileName) {
 
         this.inMailboxes = inMailboxes;
         this.notInMailboxes = notInMailboxes;
@@ -268,6 +276,7 @@ public class FilterCondition implements Filter {
         this.header = header;
         this.hasKeyword = hasKeyword;
         this.notKeyword = notKeyword;
+        this.attachmentFileName = attachmentFileName;
     }
 
     public Optional<List<String>> getInMailboxes() {
@@ -362,6 +371,10 @@ public class FilterCondition implements Filter {
         return notKeyword;
     }
 
+    public Optional<String> getAttachmentFileName() {
+        return attachmentFileName;
+    }
+
     @Override
     public final boolean equals(Object obj) {
         if (obj instanceof FilterCondition) {
@@ -388,7 +401,8 @@ public class FilterCondition implements Filter {
                 && Objects.equals(this.attachments, other.attachments)
                 && Objects.equals(this.header, other.header)
                 && Objects.equals(this.hasKeyword, other.hasKeyword)
-                && Objects.equals(this.notKeyword, other.notKeyword);
+                && Objects.equals(this.notKeyword, other.notKeyword)
+                && Objects.equals(this.attachmentFileName, other.attachmentFileName);
         }
         return false;
     }
@@ -396,7 +410,7 @@ public class FilterCondition implements Filter {
     @Override
     public final int hashCode() {
         return Objects.hash(inMailboxes, notInMailboxes, before, after, minSize, maxSize, isFlagged, isUnread, isAnswered, isDraft, isForwarded, hasAttachment,
-                text, from, to, cc, bcc, subject, body, attachments, header, hasKeyword, notKeyword);
+                text, from, to, cc, bcc, subject, body, attachments, header, hasKeyword, notKeyword, attachmentFileName);
     }
 
     @Override
@@ -425,6 +439,7 @@ public class FilterCondition implements Filter {
         header.ifPresent(x -> helper.add("header", x));
         hasKeyword.ifPresent(x -> helper.add("hasKeyword", x));
         notKeyword.ifPresent(x -> helper.add("notKeyword", x));
+        attachmentFileName.ifPresent(x -> helper.add("attachmentFileName", x));
         return helper.toString();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/d33bf76d/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
index af1abf0..9e47c86 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 
 import javax.mail.Flags.Flag;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -88,6 +89,9 @@ public class FilterToSearchQuery {
             keywordQuery(notKeyword, false).ifPresent(notKeywordCriterion
                 -> searchQuery.andCriteria(notKeywordCriterion));
         });
+        filter.getAttachmentFileName().ifPresent(attachmentFileName -> {
+            throw new NotImplementedException("`attachmentFileName` criterion is not yet handled by `mailbox-api`");
+        });
 
         return searchQuery;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/d33bf76d/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
index 73bfcf7..246cf70 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/FilterConditionTest.java
@@ -98,12 +98,13 @@ public class FilterConditionTest {
         Header header = Header.from(ImmutableList.of("name", "value"));
         Optional<String> hasKeyword = Optional.of("$Draft");
         Optional<String> notKeyword = Optional.of("$Flagged");
+        Optional<String> attachmentFileName = Optional.of("file.txt");
 
         FilterCondition expectedFilterCondition = new FilterCondition(Optional.of(ImmutableList.of("1")), Optional.of(ImmutableList.of("2")), Optional.of(before), Optional.of(after),
                 Optional.of(Number.fromLong(minSize)), Optional.of(Number.fromLong(maxSize)),
                 Optional.of(isFlagged), Optional.of(isUnread), Optional.of(isAnswered), Optional.of(isDraft), Optional.of(isForwarded), Optional.of(hasAttachment), Optional.of(text), Optional.of(from),
                 Optional.of(to), Optional.of(cc), Optional.of(bcc), Optional.of(subject), Optional.of(body), Optional.of(attachments), Optional.of(header),
-                hasKeyword, notKeyword);
+                hasKeyword, notKeyword, attachmentFileName);
 
         FilterCondition filterCondition = FilterCondition.builder()
                 .inMailboxes(Optional.of(ImmutableList.of("1")))
@@ -129,6 +130,7 @@ public class FilterConditionTest {
                 .header(header)
                 .hasKeyword(hasKeyword)
                 .notKeyword(notKeyword)
+                .attachmentFileName(attachmentFileName)
                 .build();
 
         assertThat(filterCondition).isEqualToComparingFieldByField(expectedFilterCondition);

http://git-wip-us.apache.org/repos/asf/james-project/blob/d33bf76d/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
index bb36e15..693e856 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
@@ -28,6 +28,7 @@ import java.util.Optional;
 
 import javax.mail.Flags.Flag;
 
+import org.apache.commons.lang3.NotImplementedException;
 import org.apache.james.jmap.model.Filter;
 import org.apache.james.jmap.model.FilterCondition;
 import org.apache.james.jmap.model.FilterOperator;
@@ -540,4 +541,12 @@ public class FilterToSearchQueryTest {
 
         assertThat(searchQuery).isEqualTo(expectedSearchQuery);
     }
+
+    @Test
+    public void attachmentFileNameShouldNotBeImplemented() {
+        assertThatThrownBy(() -> new FilterToSearchQuery().convert(FilterCondition.builder()
+                .attachmentFileName(Optional.of("file.gz"))
+                .build()))
+            .isInstanceOf(NotImplementedException.class);
+    }
 }


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


[05/10] james-project git commit: JAMES-2370 Mailbox should support attachment fileName search criterion

Posted by bt...@apache.org.
JAMES-2370 Mailbox should support attachment fileName search criterion


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

Branch: refs/heads/master
Commit: 8063fc25121943fdc9ed018f79e8927563428df2
Parents: 49b6e76
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 13:46:34 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:38 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxManager.java    |  3 +-
 ...lasticSearchListeningMessageSearchIndex.java |  1 +
 .../elasticsearch/query/CriterionConverter.java |  4 +++
 .../mailbox/store/search/MessageSearches.java   |  9 ++++++
 .../store/search/SimpleMessageSearchIndex.java  |  3 +-
 .../search/AbstractMessageSearchIndexTest.java  | 29 ++++++++++++++++++++
 6 files changed, 47 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index e027103..e00deb2 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -100,7 +100,8 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport, Ri
          */
         Text,
         FullText,
-        Attachment
+        Attachment,
+        AttachmentFileName
     }
     
     EnumSet<SearchCapabilities> getSupportedSearchCapabilities();

http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
index ed47b44..eaced67 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/events/ElasticSearchListeningMessageSearchIndex.java
@@ -84,6 +84,7 @@ public class ElasticSearchListeningMessageSearchIndex extends ListeningMessageSe
             SearchCapabilities.Text,
             SearchCapabilities.FullText,
             SearchCapabilities.Attachment,
+            SearchCapabilities.AttachmentFileName,
             SearchCapabilities.PartialEmailMatch);
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
index 71ab35b..5499a50 100644
--- a/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
+++ b/mailbox/elasticsearch/src/main/java/org/apache/james/mailbox/elasticsearch/query/CriterionConverter.java
@@ -168,6 +168,10 @@ public class CriterionConverter {
             return boolQuery()
                     .should(matchQuery(JsonMessageConstants.ATTACHMENTS + "." + JsonMessageConstants.Attachment.TEXT_CONTENT,
                         textCriterion.getOperator().getValue()));
+        case ATTACHMENT_FILE_NAME:
+            return boolQuery()
+                .should(termQuery(JsonMessageConstants.ATTACHMENTS + "." + JsonMessageConstants.Attachment.FILENAME,
+                    textCriterion.getOperator().getValue()));
         }
         throw new RuntimeException("Unknown SCOPE for text criterion");
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
index b8907df..6f98523 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/MessageSearches.java
@@ -206,6 +206,8 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
                 return messageContains(value, message);
             case ATTACHMENTS:
                 return attachmentsContain(value, message);
+            case ATTACHMENT_FILE_NAME:
+                return hasFileName(value, message);
             }
             throw new UnsupportedSearchException();
         } catch (IOException | MimeException e) {
@@ -243,6 +245,13 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
         return isInAttachments(value, attachments);
     }
 
+    private boolean hasFileName(String value, MailboxMessage message) throws IOException, MimeException {
+        return message.getAttachments()
+            .stream()
+            .map(MessageAttachment::getName)
+            .anyMatch(nameOptional -> nameOptional.map(value::equals).orElse(false));
+    }
+
     private boolean isInAttachments(String value, List<MessageAttachment> attachments) {
         return attachments.stream()
             .map(MessageAttachment::getAttachment)

http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
index d9b4c1d..299e538 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndex.java
@@ -82,7 +82,8 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
             return EnumSet.of(SearchCapabilities.MultimailboxSearch,
                 SearchCapabilities.Text,
                 SearchCapabilities.Attachment,
-                SearchCapabilities.PartialEmailMatch);
+                SearchCapabilities.PartialEmailMatch,
+                SearchCapabilities.AttachmentFileName);
         }
         return EnumSet.of(SearchCapabilities.MultimailboxSearch,
             SearchCapabilities.Text);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8063fc25/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
index 9a3803f..4e0d5b2 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/search/AbstractMessageSearchIndexTest.java
@@ -52,6 +52,7 @@ import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
 import org.apache.james.mime4j.message.BodyPartBuilder;
 import org.apache.james.mime4j.message.MultipartBuilder;
+import org.apache.james.mime4j.message.SingleBodyBuilder;
 import org.apache.james.util.ClassLoaderUtils;
 import org.junit.Assume;
 import org.junit.Before;
@@ -1450,4 +1451,32 @@ public abstract class AbstractMessageSearchIndexTest {
         assertThat(messageSearchIndex.search(session, mailbox, searchQuery))
             .containsOnly(m3.getUid());
     }
+
+    @Test
+    public void searchShouldRetrieveMailByAttachmentFileName() throws Exception {
+        Assume.assumeTrue(messageSearchIndex.getSupportedCapabilities(storeMailboxManager.getSupportedMessageCapabilities())
+            .contains(MailboxManager.SearchCapabilities.AttachmentFileName));
+
+        String fileName = "matchme.txt";
+        ComposedMessageId mWithFileName = inboxMessageManager.appendMessage(MessageManager.AppendCommand.builder()
+                .build(Message.Builder.of()
+                    .setBody(
+                        MultipartBuilder.create("alternative")
+                            .addBodyPart(BodyPartBuilder.create()
+                                .setContentDisposition("attachment", fileName)
+                                .setBody(SingleBodyBuilder.create()
+                                    .setText("this is the file content...")
+                                    .setCharset(StandardCharsets.UTF_8)
+                                    .build())
+                                .build())
+                            .build())),
+            session);
+
+        await();
+
+        SearchQuery searchQuery = new SearchQuery(SearchQuery.attachmentFileName(fileName));
+
+        assertThat(messageSearchIndex.search(session, mailbox, searchQuery))
+            .containsOnly(mWithFileName.getUid());
+    }
 }


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


[07/10] james-project git commit: JAMES-2370 Attachment file name search is required to start a JMAP server

Posted by bt...@apache.org.
JAMES-2370 Attachment file name search is required to start a JMAP server


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

Branch: refs/heads/master
Commit: 67984d5ad6e3912e70e2c07845d8a10dc00630a9
Parents: f4a3216
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 14:14:50 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:39 2018 +0700

----------------------------------------------------------------------
 .../apache/james/JamesCapabilitiesServerTest.java    | 15 +++++++++++++++
 .../main/java/org/apache/james/jmap/JMAPModule.java  |  2 ++
 2 files changed, 17 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/67984d5a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index 1bce059..8572be6 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -129,6 +129,21 @@ public class JamesCapabilitiesServerTest {
 
         assertThatThrownBy(() -> server.start()).isInstanceOf(IllegalArgumentException.class);
     }
+
+    @Test
+    public void startShouldFailWhenNoAttachmentFileNameSearchCapability() throws Exception {
+        MailboxManager mailboxManager = mock(MailboxManager.class);
+        when(mailboxManager.getSupportedMailboxCapabilities())
+            .thenReturn(EnumSet.allOf(MailboxManager.MailboxCapabilities.class));
+        when(mailboxManager.getSupportedMessageCapabilities())
+            .thenReturn(EnumSet.allOf(MailboxManager.MessageCapabilities.class));
+        when(mailboxManager.getSupportedSearchCapabilities())
+            .thenReturn(EnumSet.complementOf(EnumSet.of(MailboxManager.SearchCapabilities.AttachmentFileName)));
+
+        server = createCassandraJamesServer(mailboxManager);
+
+        assertThatThrownBy(() -> server.start()).isInstanceOf(IllegalArgumentException.class);
+    }
     
     @Test
     public void startShouldFailWhenNoMultimailboxSearchCapability() throws Exception {

http://git-wip-us.apache.org/repos/asf/james-project/blob/67984d5a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java
index ad16a2f..b5bd236 100644
--- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java
+++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPModule.java
@@ -159,6 +159,8 @@ public class JMAPModule extends AbstractModule {
                     "Multimailbox search in MailboxManager is required by JMAP Module");
             Preconditions.checkArgument(searchCapabilities.contains(MailboxManager.SearchCapabilities.Attachment),
                     "Attachment Search support in MailboxManager is required by JMAP Module");
+            Preconditions.checkArgument(searchCapabilities.contains(SearchCapabilities.AttachmentFileName),
+                    "Attachment file name Search support in MailboxManager is required by JMAP Module");
         }
 
         @Override


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


[10/10] james-project git commit: JAMES-2370 JMAP text search filter should include attachmentFileName

Posted by bt...@apache.org.
JAMES-2370 JMAP text search filter should include attachmentFileName


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

Branch: refs/heads/master
Commit: 3c379ddb4a601dbac88eaff51a228eca752addeb
Parents: c778ee1
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 14:21:48 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:36:01 2018 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 67 ++++++++++++++++++++
 .../james/jmap/utils/FilterToSearchQuery.java   |  3 +-
 .../jmap/utils/FilterToSearchQueryTest.java     |  3 +-
 3 files changed, 71 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3c379ddb/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index 16f5805..0bf5c62 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -2036,6 +2036,73 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize()));
     }
 
+    @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));
+    }
+
+    @Test
+    public void getMessageListTextFilterShouldReturnOnlyMessagesWithMatchingAttachmentFileNames() throws Exception {
+        mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "mailbox");
+
+        ComposedMessageId message1 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"),
+            MessageManager.AppendCommand.builder()
+                .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")
+                            .addBodyPart(BodyPartBuilder.create()
+                                .setContentDisposition("attachment", "matchme.txt")
+                                .setBody(SingleBodyBuilder.create()
+                                    .setText("this is the file content...")
+                                    .setCharset(StandardCharsets.UTF_8)
+                                    .build())
+                                .build())
+                            .build())));
+
+        await();
+
+        given()
+            .header("Authorization", aliceAccessToken.serialize())
+            .body("[[\"getMessageList\", {\"filter\":{\"text\":\"matchme.txt\"}}, \"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("messageList"))
+            .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize()));
+    }
+
     private Date convertToDate(LocalDate localDate) {
         return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c379ddb/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
index 5f14323..ac5b97e 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/utils/FilterToSearchQuery.java
@@ -60,7 +60,8 @@ public class FilterToSearchQuery {
                         SearchQuery.address(AddressType.Bcc, text),
                         SearchQuery.headerContains("Subject", text),
                         SearchQuery.attachmentContains(text),
-                        SearchQuery.bodyContains(text)))
+                        SearchQuery.bodyContains(text),
+                        SearchQuery.attachmentFileName(text)))
                 ));
         filter.getFrom().ifPresent(from -> searchQuery.andCriteria(SearchQuery.address(AddressType.From, from)));
         filter.getTo().ifPresent(to -> searchQuery.andCriteria(SearchQuery.address(AddressType.To, to)));

http://git-wip-us.apache.org/repos/asf/james-project/blob/3c379ddb/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
index 5ff9a2a..0d54306 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/utils/FilterToSearchQueryTest.java
@@ -184,7 +184,8 @@ public class FilterToSearchQueryTest {
                 SearchQuery.address(AddressType.Bcc, text),
                 SearchQuery.headerContains("Subject", text),
                 SearchQuery.bodyContains(text),
-                SearchQuery.attachmentContains(text))));
+                SearchQuery.attachmentContains(text),
+                SearchQuery.attachmentFileName(text))));
 
         SearchQuery searchQuery = new FilterToSearchQuery().convert(FilterCondition.builder()
                 .text(text)


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


[03/10] james-project git commit: JAMES-2355 Add a sample, empty setenv.sh script

Posted by bt...@apache.org.
JAMES-2355 Add a sample, empty setenv.sh script


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

Branch: refs/heads/master
Commit: 7f0b2f82a29325d8959302707499dafe94e84de1
Parents: 356b47e
Author: benwa <bt...@linagora.com>
Authored: Tue Apr 17 10:13:45 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:34:33 2018 +0700

----------------------------------------------------------------------
 server/app/src/main/resources/setenv.sh | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/7f0b2f82/server/app/src/main/resources/setenv.sh
----------------------------------------------------------------------
diff --git a/server/app/src/main/resources/setenv.sh b/server/app/src/main/resources/setenv.sh
new file mode 100644
index 0000000..2adce0e
--- /dev/null
+++ b/server/app/src/main/resources/setenv.sh
@@ -0,0 +1,22 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+# In this script, one can define environment variables to run James server with in UNIX environment
+
+# This example shows you how you can, for instance, add specific folders to your CLASSPATH_PREFIX
+# 
+# export CLASSPATH_PREFIX=$CLASSPATH_PREFIX:/my/new/classpath/
\ No newline at end of file


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


[09/10] james-project git commit: JAMES-2370 Add a JMAP integration test for attachment filename searching

Posted by bt...@apache.org.
JAMES-2370 Add a JMAP integration test for attachment filename searching


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

Branch: refs/heads/master
Commit: c778ee17267e500073727fd7d21091e075fb068b
Parents: 67984d5
Author: benwa <bt...@linagora.com>
Authored: Mon Apr 9 14:19:55 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Wed Apr 18 07:35:39 2018 +0700

----------------------------------------------------------------------
 .../integration/GetMessageListMethodTest.java   | 41 +++++++++++++++++++-
 1 file changed, 39 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c778ee17/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
index 65c464e..16f5805 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMessageListMethodTest.java
@@ -51,18 +51,19 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.model.Number;
 import org.apache.james.mailbox.FlagsBuilder;
+import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.probe.MailboxProbe;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.Multipart;
 import org.apache.james.mime4j.message.BodyPartBuilder;
 import org.apache.james.mime4j.message.DefaultMessageWriter;
 import org.apache.james.mime4j.message.MultipartBuilder;
+import org.apache.james.mime4j.message.SingleBodyBuilder;
 import org.apache.james.modules.ACLProbeImpl;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
@@ -88,7 +89,7 @@ public abstract class GetMessageListMethodTest {
     private AccessToken aliceAccessToken;
     private AccessToken bobAccessToken;
     private GuiceJamesServer jmapServer;
-    private MailboxProbe mailboxProbe;
+    private MailboxProbeImpl mailboxProbe;
     private DataProbe dataProbe;
     
     @Before
@@ -1999,6 +2000,42 @@ public abstract class GetMessageListMethodTest {
             .body(ARGUMENTS + ".messageIds", contains(message2.getMessageId().serialize(), message1.getMessageId().serialize()));
     }
 
+    @Test
+    public void getMessageListFileNameFilterShouldReturnOnlyMessagesWithMatchingAttachmentFileNames() throws Exception {
+        mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, ALICE, "mailbox");
+
+        ComposedMessageId message1 = mailboxProbe.appendMessage(ALICE, MailboxPath.forUser(ALICE, "mailbox"),
+            MessageManager.AppendCommand.builder()
+                .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")
+                            .addBodyPart(BodyPartBuilder.create()
+                                .setContentDisposition("attachment", "matchme.txt")
+                                .setBody(SingleBodyBuilder.create()
+                                    .setText("this is the file content...")
+                                    .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", contains(message2.getMessageId().serialize()));
+    }
+
     private Date convertToDate(LocalDate localDate) {
         return Date.from(localDate.atStartOfDay(ZONE_ID).toInstant());
     }


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