This is an automated email from the ASF dual-hosted git repository.

rcordier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 63667e42115119aaaaa7148956e22aa26fdfbd80
Author: duc91 <[email protected]>
AuthorDate: Tue Sep 29 18:01:12 2020 +0700

    JAMES-3391 Implement for bodyFiltering
---
 .../contract/EmailQueryMethodContract.scala        | 245 ++-------------------
 .../james/jmap/utils/search/MailboxFilter.scala    |  10 +-
 2 files changed, 23 insertions(+), 232 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
index fdd2d2a..750eab4 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
@@ -592,13 +592,13 @@ trait EmailQueryMethodContract {
     }
   }
 
-  def 
bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenBody(server:
 GuiceJamesServer): Unit = {
+  def bodyFilterShouldMatchTextPlainOnBody(server: GuiceJamesServer): Unit = {
     val message: Message = simpleMessage("this message body are uniqueeee")
     val mailboxPath = MailboxPath.inbox(BOB)
     server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath)
     val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant)
     val messageId1: MessageId = sendMessageToBobInbox(server, message, 
requestDate)
-    server.getProbe(classOf[MailboxProbeImpl])
+    val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl])
       .appendMessage(BOB.asString, mailboxPath, AppendCommand.from(
         ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml")))
       .getMessageId
@@ -632,27 +632,14 @@ trait EmailQueryMethodContract {
         .body
         .asString
 
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId1)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId1.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
+      assertThatJson(response)
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(s"""["${messageId1.serialize}"]}""")
     }
   }
 
   @Test
-  def 
bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenAttachmentsContent(server:
 GuiceJamesServer): Unit = {
+  def bodyFilterShouldMatchTextPlainOnAttachmentsContent(server: 
GuiceJamesServer): Unit = {
     val message: Message = simpleMessage("this message body are uniqueeee")
     val mailboxPath = MailboxPath.inbox(BOB)
     server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath)
@@ -692,27 +679,14 @@ trait EmailQueryMethodContract {
         .body
         .asString
 
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId2)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId2.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
+      assertThatJson(response)
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(s"""["${messageId2.serialize}"]}""")
     }
   }
 
   @Test
-  def 
bodyFilterTextShouldSupportContainsOnBodyOrAttachmentsContentOrAttachmentsFileNameWhenAttachmentsFileName(server:
 GuiceJamesServer): Unit = {
+  def bodyFilterShouldMatchTextPlainOnAttachmentsFileName(server: 
GuiceJamesServer): Unit = {
     val message: Message = simpleMessage("this message body are uniqueeee")
     val mailboxPath = MailboxPath.inbox(BOB)
     server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath)
@@ -752,197 +726,10 @@ trait EmailQueryMethodContract {
         .body
         .asString
 
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId2)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId2.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
-    }
-  }
-
-  @Test
-  def bodyMessageShouldSupportContains(server: GuiceJamesServer): Unit = {
-    val message: Message = buildTestMessage
-    val mailboxPath = MailboxPath.inbox(BOB)
-    server.getProbe(classOf[MailboxProbeImpl]).createMailbox(mailboxPath)
-    val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant)
-    val messageId1: MessageId = sendMessageToBobInbox(server, message, 
requestDate)
-    val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, mailboxPath, AppendCommand.from(message))
-      .getMessageId
-
-    val request =
-      s"""{
-         |  "using": [
-         |    "urn:ietf:params:jmap:core",
-         |    "urn:ietf:params:jmap:mail"],
-         |  "methodCalls": [[
-         |    "Email/query",
-         |    {
-         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-         |      "filter": {
-         |        "body":"test"
-         |       }
-         |    },
-         |    "c1"]]
-         |}""".stripMargin
-
-    awaitAtMostTenSeconds.untilAsserted { () =>
-      val response = `given`
-        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
-        .body(request)
-      .when
-        .post
-      .`then`
-        .statusCode(SC_OK)
-        .contentType(JSON)
-        .extract
-        .body
-        .asString
-
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId2, 
messageId1)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId2.serialize}", 
"${messageId1.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
-    }
-  }
-
-  @Test
-  def attachmentsContentShouldSupportContains(server: GuiceJamesServer): Unit 
= {
-    
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
-    val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant)
-    sendMessageToBobInbox(server, buildTestMessage, requestDate)
-    val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.from(
-        ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml")))
-      .getMessageId
-
-    val request =
-      s"""{
-         |  "using": [
-         |    "urn:ietf:params:jmap:core",
-         |    "urn:ietf:params:jmap:mail"],
-         |  "methodCalls": [[
-         |    "Email/query",
-         |    {
-         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-         |      "filter": {
-         |        "body":"RSA PRIVATE"
-         |       }
-         |    },
-         |    "c1"]]
-         |}""".stripMargin
-
-    awaitAtMostTenSeconds.untilAsserted { () =>
-      val response = `given`
-        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
-        .body(request)
-      .when
-        .post
-      .`then`
-        .statusCode(SC_OK)
-        .contentType(JSON)
-        .extract
-        .body
-        .asString
-
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId2)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId2.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
-    }
-  }
-
-  @Test
-  def attachmentFileNameShouldSupportContains(server: GuiceJamesServer): Unit 
= {
-    
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
-    val requestDate = Date.from(ZonedDateTime.now().minusDays(1).toInstant)
-    sendMessageToBobInbox(server, buildTestMessage, requestDate)
-    val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl])
-      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), AppendCommand.from(
-        ClassLoader.getSystemResourceAsStream("eml/multipart_simple.eml")))
-      .getMessageId
-
-    val request =
-      s"""{
-         |  "using": [
-         |    "urn:ietf:params:jmap:core",
-         |    "urn:ietf:params:jmap:mail"],
-         |  "methodCalls": [[
-         |    "Email/query",
-         |    {
-         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-         |      "filter": {
-         |        "body":"text2"
-         |       }
-         |    },
-         |    "c1"]]
-         |}""".stripMargin
-
-    awaitAtMostTenSeconds.untilAsserted { () =>
-      val response = `given`
-        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
-        .body(request)
-      .when
-        .post
-      .`then`
-        .statusCode(SC_OK)
-        .contentType(JSON)
-        .extract
-        .body
-        .asString
-
-      assertThatJson(response).isEqualTo(
-        s"""{
-           |    "sessionState": "75128aab4b1b",
-           |    "methodResponses": [[
-           |            "Email/query",
-           |            {
-           |                "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
-           |                "queryState": "${generateQueryState(messageId2)}",
-           |                "canCalculateChanges": false,
-           |                "position": 0,
-           |                "limit": 256,
-           |                "ids": ["${messageId2.serialize}"]
-           |            },
-           |            "c1"
-           |        ]]
-           |}""".stripMargin)
+      assertThatJson(response)
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(
+        s"""["${messageId2.serialize}"]""")
     }
   }
 
@@ -1120,7 +907,6 @@ trait EmailQueryMethodContract {
             .setSubject("test")
             .setBody("testmail", StandardCharsets.UTF_8)
             .build))
-
       .getMessageId
 
     val request =
@@ -2339,8 +2125,7 @@ trait EmailQueryMethodContract {
   @ValueSource(strings = Array(
     "allInThreadHaveKeyword",
     "someInThreadHaveKeyword",
-    "noneInThreadHaveKeyword",
-    "body"
+    "noneInThreadHaveKeyword"
   ))
   def 
listMailsShouldReturnUnsupportedFilterWhenValidButUnsupported(unsupportedFilter:
 String): Unit = {
     val request =
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
index 6142886..c0580ed 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
@@ -27,7 +27,7 @@ import 
org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.mailbox.MailboxSession
 import 
org.apache.james.mailbox.model.MultimailboxesSearchQuery.{AccessibleNamespace, 
Namespace, PersonalNamespace}
 import org.apache.james.mailbox.model.SearchQuery.DateResolution.Second
-import org.apache.james.mailbox.model.SearchQuery.{AddressType, 
DateComparator, DateOperator, DateResolution, InternalDateCriterion}
+import org.apache.james.mailbox.model.SearchQuery.{Criterion, AddressType, 
DateComparator, DateOperator, DateResolution, InternalDateCriterion}
 import org.apache.james.mailbox.model.{MultimailboxesSearchQuery, SearchQuery}
 
 import scala.jdk.CollectionConverters._
@@ -237,7 +237,13 @@ object MailboxFilter {
   case object Body extends QueryFilter {
     override def toQuery(builder: SearchQuery.Builder, request: 
EmailQueryRequest): Either[UnsupportedFilterException, SearchQuery.Builder] =
       request.filter.flatMap(_.body) match {
-        case Some(_) => Left(UnsupportedFilterException("body"))
+        case Some(text) =>
+           val bodyFilterOr: List[Criterion] = List(
+            SearchQuery.attachmentContains(text.value),
+            SearchQuery.bodyContains(text.value),
+            SearchQuery.attachmentFileName(text.value))
+
+          Right(builder.andCriteria(SearchQuery.or(bodyFilterOr.asJava)))
         case None => Right(builder)
       }
   }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to