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 ma...@apache.org on 2016/07/26 07:46:45 UTC

[06/17] james-project git commit: JAMES-1804 Add Text capability to SimpleMessageSearchIndex

JAMES-1804 Add Text capability to SimpleMessageSearchIndex


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

Branch: refs/heads/master
Commit: 9af58b759647a4df395d7bd0d498b6e3f2eb4171
Parents: b3f60b8
Author: Antoine Duprat <ad...@linagora.com>
Authored: Thu Jul 21 15:00:57 2016 +0200
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Jul 26 08:57:05 2016 +0200

----------------------------------------------------------------------
 .../apache/james/mailbox/model/SearchQuery.java |  2 -
 .../search/SimpleMessageSearchIndexTest.java    | 10 ++++
 .../mailbox/store/search/MessageSearches.java   | 59 +++++++++++++++++---
 .../search/AbstractMessageSearchIndexTest.java  |  4 +-
 4 files changed, 64 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/9af58b75/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 8a62315..490a365 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
@@ -30,8 +30,6 @@ import java.util.Set;
 import javax.mail.Flags;
 import javax.mail.Flags.Flag;
 
-import org.apache.james.mailbox.model.SearchQuery.Sort;
-
 /**
  * <p>
  * Models a query used to search for messages. A query is the logical

http://git-wip-us.apache.org/repos/asf/james-project/blob/9af58b75/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index b974db9..1a084f8 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -222,6 +222,16 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
 
     @Ignore
     @Override
+    public void searchWithFullTextShouldReturnMailsWhenTextBodyMatchesAndNonContinuousWords() throws Exception {
+    }
+
+    @Ignore
+    @Override
     public void multimailboxSearchShouldReturnUidOfMessageWithExpectedFromInAllMailboxes() throws MailboxException {
     }
+
+    @Ignore
+    @Override
+    public void searchWithFullTextShouldReturnMailsWhenHtmlBodyMatchesAndNonContinuousWords() throws Exception {
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/9af58b75/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 75aa957..c378313 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
@@ -19,8 +19,11 @@
 
 package org.apache.james.mailbox.store.search;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.SequenceInputStream;
 import java.io.StringReader;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
@@ -48,16 +51,22 @@ import org.apache.james.mailbox.store.ResultUtils;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.comparator.CombinedComparator;
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.MimeIOException;
+import org.apache.james.mime4j.dom.Message;
 import org.apache.james.mime4j.dom.address.Address;
 import org.apache.james.mime4j.dom.address.AddressList;
 import org.apache.james.mime4j.dom.address.Group;
 import org.apache.james.mime4j.dom.address.Mailbox;
 import org.apache.james.mime4j.dom.address.MailboxList;
 import org.apache.james.mime4j.dom.datetime.DateTime;
+import org.apache.james.mime4j.field.Fields;
 import org.apache.james.mime4j.field.address.AddressFormatter;
 import org.apache.james.mime4j.field.address.LenientAddressParser;
 import org.apache.james.mime4j.field.datetime.parser.DateTimeParser;
 import org.apache.james.mime4j.field.datetime.parser.ParseException;
+import org.apache.james.mime4j.message.DefaultMessageBuilder;
+import org.apache.james.mime4j.message.DefaultMessageWriter;
+import org.apache.james.mime4j.message.HeaderImpl;
 import org.apache.james.mime4j.utils.search.MessageMatcher;
 
 import com.google.common.collect.Lists;
@@ -116,7 +125,7 @@ public class MessageSearches implements Iterable<Long> {
      *         <code>false</code> otherwise
      * @throws MailboxException
      */
-    protected boolean isMatch(SearchQuery query, MailboxMessage message) throws MailboxException {
+    private boolean isMatch(SearchQuery query, MailboxMessage message) throws MailboxException {
         final List<SearchQuery.Criterion> criteria = query.getCriterias();
         final Collection<Long> recentMessageUids = query.getRecentMessageUids();
         boolean result = true;
@@ -177,7 +186,7 @@ public class MessageSearches implements Iterable<Long> {
         return result;
     }
 
-    protected boolean matches(SearchQuery.TextCriterion criterion, MailboxMessage message)
+    private boolean matches(SearchQuery.TextCriterion criterion, MailboxMessage message)
             throws MailboxException {
         try {
             final SearchQuery.ContainsOperator operator = criterion.getOperator();
@@ -185,11 +194,12 @@ public class MessageSearches implements Iterable<Long> {
             switch (criterion.getType()) {
             case BODY:
                 return bodyContains(value, message);
+            case TEXT:
+                return textContains(value, message);
             case FULL:
                 return messageContains(value, message);
-            default:
-                throw new UnsupportedSearchException();
             }
+            throw new UnsupportedSearchException();
         } catch (IOException e) {
             throw new MailboxException("Unable to parse message", e);
         } catch (MimeException e) {
@@ -197,12 +207,12 @@ public class MessageSearches implements Iterable<Long> {
         }
     }
 
-    protected boolean bodyContains(String value, MailboxMessage message) throws IOException, MimeException {
+    private boolean bodyContains(String value, MailboxMessage message) throws IOException, MimeException {
         final InputStream input = message.getFullContent();
         return isInMessage(value, input, false);
     }
 
-    protected boolean isInMessage(String value, InputStream input, boolean header) throws IOException, MimeException {
+    private boolean isInMessage(String value, InputStream input, boolean header) throws IOException, MimeException {
         MessageMatcher.MessageMatcherBuilder builder = MessageMatcher.builder()
             .searchContents(Lists.<CharSequence>newArrayList(value))
             .caseInsensitive(true)
@@ -213,11 +223,46 @@ public class MessageSearches implements Iterable<Long> {
         return builder.build().messageMatches(input);
     }
 
-    protected boolean messageContains(String value, MailboxMessage message) throws IOException, MimeException {
+    private boolean messageContains(String value, MailboxMessage message) throws IOException, MimeException {
         final InputStream input = message.getFullContent();
         return isInMessage(value, input, true);
     }
 
+    private boolean textContains(String value, MailboxMessage message) throws IOException, MimeException, MailboxException {
+        InputStream bodyContent = message.getBodyContent();
+        return isInMessage(value, new SequenceInputStream(textHeaders(message), bodyContent), true);
+    }
+
+    private InputStream textHeaders(MailboxMessage message) throws MimeIOException, IOException {
+        ByteArrayOutputStream out = new ByteArrayOutputStream();
+        new DefaultMessageWriter()
+            .writeHeader(buildTextHeaders(message), out);
+        return new ByteArrayInputStream(out.toByteArray());
+    }
+
+    private HeaderImpl buildTextHeaders(MailboxMessage message) throws IOException, MimeIOException {
+        Message headersMessage = new DefaultMessageBuilder()
+            .parseMessage(message.getHeaderContent());
+        HeaderImpl headerImpl = new HeaderImpl();
+        addFrom(headerImpl, headersMessage.getFrom());
+        addAddressList(headerImpl, headersMessage.getTo());
+        addAddressList(headerImpl, headersMessage.getCc());
+        addAddressList(headerImpl, headersMessage.getBcc());
+        headerImpl.addField(Fields.subject(headersMessage.getSubject()));
+        return headerImpl;
+    }
+
+    private void addFrom(HeaderImpl headerImpl, MailboxList from) {
+        if (from != null) {
+            headerImpl.addField(Fields.from(Lists.newArrayList(from.iterator())));
+        }
+    }
+
+    private void addAddressList(HeaderImpl headerImpl, AddressList addressList) {
+        if (addressList != null) {
+            headerImpl.addField(Fields.to(Lists.newArrayList(addressList.iterator())));
+        }
+    }
     private boolean matches(SearchQuery.ConjunctionCriterion criterion, MailboxMessage message,
             final Collection<Long> recentMessageUids) throws MailboxException {
         final List<SearchQuery.Criterion> criteria = criterion.getCriteria();

http://git-wip-us.apache.org/repos/asf/james-project/blob/9af58b75/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 1ac6b37..d2b6ce7 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
@@ -826,7 +826,7 @@ public abstract class AbstractMessageSearchIndexTest {
 
     @Test
     public void searchWithFullTextShouldReturnMailsWhenHtmlBodyMatches() throws Exception {
-        Assume.assumeTrue(messageSearchIndex.hasCapability(MessageSearchIndexCapabilities.Text));
+        Assume.assumeTrue(storeMailboxManager.getSupportedSearchCapabilities().contains(MailboxManager.SearchCapabilities.Text));
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.textContains("Regarder"));
         assertThat(messageSearchIndex.search(session, mailbox, searchQuery))
@@ -835,7 +835,7 @@ public abstract class AbstractMessageSearchIndexTest {
 
     @Test
     public void searchWithFullTextShouldReturnMailsWhenHtmlBodyMatchesAndNonContinuousWords() throws Exception {
-        Assume.assumeTrue(messageSearchIndex.hasCapability(MessageSearchIndexCapabilities.Text));
+        Assume.assumeTrue(storeMailboxManager.getSupportedSearchCapabilities().contains(MailboxManager.SearchCapabilities.Text));
         SearchQuery searchQuery = new SearchQuery();
         searchQuery.andCriteria(SearchQuery.textContains("Regarder tendance"));
         assertThat(messageSearchIndex.search(session, mailbox, searchQuery))


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