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 2020/04/22 02:31:43 UTC
[james-project] 03/37: JAMES-2997 step #1 Rely on
AttachmentContentLoader within scanning search
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 75e04cd0924d956e27039f69525738052c74b31c
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Mon Dec 9 09:45:27 2019 +0100
JAMES-2997 step #1 Rely on AttachmentContentLoader within scanning search
---
...ntManager.java => AttachmentContentLoader.java} | 19 +++----------
.../apache/james/mailbox/AttachmentManager.java | 12 ++++++++-
.../cassandra/CassandraMailboxManagerProvider.java | 4 ++-
.../cassandra/CassandraTestSystemFixture.java | 4 ++-
.../CassandraMailboxManagerAttachmentTest.java | 4 ++-
.../mailbox/jpa/JPAAttachmentContentLoader.java} | 29 +++++++-------------
.../mailbox/jpa/JpaMailboxManagerProvider.java | 2 +-
.../maildir/MaildirAttachmentContentLoader.java} | 31 ++++++++--------------
.../maildir/MaildirMailboxManagerProvider.java | 2 +-
.../manager/InMemoryIntegrationResources.java | 2 +-
.../store/search/SimpleMessageSearchIndexTest.java | 3 ++-
.../mailbox/store/StoreAttachmentManager.java | 9 +++++++
.../james/mailbox/store/mail/AttachmentMapper.java | 6 +++++
.../mailbox/store/search/MessageSearches.java | 26 +++++++++++-------
.../store/search/SimpleMessageSearchIndex.java | 9 ++++---
.../store/SearchUtilsMultipartMixedTest.java | 5 +++-
.../james/mailbox/store/SearchUtilsRFC822Test.java | 5 +++-
.../james/mailbox/store/SearchUtilsTest.java | 5 +++-
.../mailbox/store/StoreMailboxManagerTest.java | 4 ++-
.../cassandra/host/CassandraHostSystem.java | 2 +-
.../mpt/imapmailbox/jpa/host/JPAHostSystem.java | 4 ++-
.../maildir/host/MaildirHostSystem.java | 2 +-
.../modules/mailbox/CassandraMailboxModule.java | 2 ++
.../james/modules/mailbox/JPAMailboxModule.java | 3 +++
.../james/modules/mailbox/MemoryMailboxModule.java | 2 ++
25 files changed, 114 insertions(+), 82 deletions(-)
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentContentLoader.java
similarity index 60%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
copy to mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentContentLoader.java
index 83e0094..1c084d5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentContentLoader.java
@@ -19,25 +19,14 @@
package org.apache.james.mailbox;
-import java.util.Collection;
-import java.util.List;
+import java.io.IOException;
+import java.io.InputStream;
import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.MessageId;
-import org.reactivestreams.Publisher;
-public interface AttachmentManager {
+public interface AttachmentContentLoader {
- boolean exists(AttachmentId attachmentId, MailboxSession session) throws MailboxException;
+ InputStream load(Attachment attachment, MailboxSession mailboxSession) throws IOException, AttachmentNotFoundException;
- Attachment getAttachment(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException, AttachmentNotFoundException;
-
- List<Attachment> getAttachments(List<AttachmentId> attachmentIds, MailboxSession mailboxSession) throws MailboxException;
-
- Publisher<Void> storeAttachment(Attachment attachment, MailboxSession mailboxSession);
-
- void storeAttachmentsForMessage(Collection<Attachment> attachments, MessageId ownerMessageId, MailboxSession mailboxSession) throws MailboxException;
}
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
index 83e0094..a23f2c7 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Collection;
import java.util.List;
@@ -29,7 +31,7 @@ import org.apache.james.mailbox.model.AttachmentId;
import org.apache.james.mailbox.model.MessageId;
import org.reactivestreams.Publisher;
-public interface AttachmentManager {
+public interface AttachmentManager extends AttachmentContentLoader {
boolean exists(AttachmentId attachmentId, MailboxSession session) throws MailboxException;
@@ -40,4 +42,12 @@ public interface AttachmentManager {
Publisher<Void> storeAttachment(Attachment attachment, MailboxSession mailboxSession);
void storeAttachmentsForMessage(Collection<Attachment> attachments, MessageId ownerMessageId, MailboxSession mailboxSession) throws MailboxException;
+
+ InputStream loadAttachmentContent(AttachmentId attachmentId, MailboxSession mailboxSession) throws AttachmentNotFoundException, IOException;
+
+ @Override
+ default InputStream load(Attachment attachment, MailboxSession mailboxSession) throws IOException, AttachmentNotFoundException {
+ return loadAttachmentContent(attachment.getAttachmentId(), mailboxSession);
+ }
+
}
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
index 0c1b448..f2bdb06 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerProvider.java
@@ -20,6 +20,7 @@
package org.apache.james.mailbox.cassandra;
import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
import org.apache.james.mailbox.acl.MailboxACLResolver;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
@@ -97,7 +98,8 @@ public class CassandraMailboxManagerProvider {
ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaUpdater, quotaRootResolver, eventBus, storeQuotaManager);
QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, storeQuotaManager, quotaRootResolver);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor());
+ AttachmentContentLoader attachmentContentLoader = null;
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, sessionProvider, new NoMailboxPathLocker(),
messageParser, messageIdFactory, eventBus, annotationManager, storeRightManager,
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 5acf657..b55ea11 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.cassandra;
import static org.mockito.Mockito.mock;
import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -72,7 +73,8 @@ class CassandraTestSystemFixture {
SessionProviderImpl sessionProvider = new SessionProviderImpl(mock(Authenticator.class), mock(Authorizator.class));
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mapperFactory);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor());
+ AttachmentContentLoader attachmentContentLoader = null;
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new NoMailboxPathLocker(), new MessageParser(), new CassandraMessageId.Factory(),
eventBus, annotationManager, storeRightManager, quotaComponents, index, MailboxManagerConfiguration.DEFAULT, PreDeletionHooks.NO_PRE_DELETION_HOOK);
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index 63fa332..1c90f3a 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
@@ -83,7 +84,8 @@ class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManagerAttach
SessionProviderImpl sessionProvider = new SessionProviderImpl(noAuthenticator, noAuthorizator);
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mailboxSessionMapperFactory);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory, mailboxSessionMapperFactory, new DefaultTextExtractor());
+ AttachmentContentLoader attachmentContentLoader = null;
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory, mailboxSessionMapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, sessionProvider, new NoMailboxPathLocker(), new MessageParser(),
messageIdFactory, eventBus, annotationManager, storeRightManager, quotaComponents,
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAAttachmentContentLoader.java
similarity index 55%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
copy to mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAAttachmentContentLoader.java
index 83e0094..b368084 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAAttachmentContentLoader.java
@@ -17,27 +17,18 @@
* under the License. *
****************************************************************/
-package org.apache.james.mailbox;
+package org.apache.james.mailbox.jpa;
-import java.util.Collection;
-import java.util.List;
+import java.io.InputStream;
-import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.MessageId;
-import org.reactivestreams.Publisher;
-public interface AttachmentManager {
-
- boolean exists(AttachmentId attachmentId, MailboxSession session) throws MailboxException;
-
- Attachment getAttachment(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException, AttachmentNotFoundException;
-
- List<Attachment> getAttachments(List<AttachmentId> attachmentIds, MailboxSession mailboxSession) throws MailboxException;
-
- Publisher<Void> storeAttachment(Attachment attachment, MailboxSession mailboxSession);
-
- void storeAttachmentsForMessage(Collection<Attachment> attachments, MessageId ownerMessageId, MailboxSession mailboxSession) throws MailboxException;
+public class JPAAttachmentContentLoader implements AttachmentContentLoader {
+ @Override
+ public InputStream load(Attachment attachment, MailboxSession mailboxSession) {
+ throw new NotImplementedException("JPA doesn't support loading attachment separately from Message");
+ }
}
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
index d881da5..8c23ea2 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JpaMailboxManagerProvider.java
@@ -68,7 +68,7 @@ public class JpaMailboxManagerProvider {
LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
SessionProviderImpl sessionProvider = new SessionProviderImpl(noAuthenticator, noAuthorizator);
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mf);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mf, mf, new DefaultTextExtractor());
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mf, mf, new DefaultTextExtractor(), new JPAAttachmentContentLoader());
return new OpenJPAMailboxManager(mf, sessionProvider,
messageParser, new DefaultMessageId.Factory(),
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirAttachmentContentLoader.java
similarity index 55%
copy from mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
copy to mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirAttachmentContentLoader.java
index 83e0094..f3e486a 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/AttachmentManager.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirAttachmentContentLoader.java
@@ -17,27 +17,18 @@
* under the License. *
****************************************************************/
-package org.apache.james.mailbox;
+package org.apache.james.mailbox.maildir;
-import java.util.Collection;
-import java.util.List;
+import java.io.InputStream;
-import org.apache.james.mailbox.exception.AttachmentNotFoundException;
-import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.commons.lang3.NotImplementedException;
+import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.model.Attachment;
-import org.apache.james.mailbox.model.AttachmentId;
-import org.apache.james.mailbox.model.MessageId;
-import org.reactivestreams.Publisher;
-public interface AttachmentManager {
-
- boolean exists(AttachmentId attachmentId, MailboxSession session) throws MailboxException;
-
- Attachment getAttachment(AttachmentId attachmentId, MailboxSession mailboxSession) throws MailboxException, AttachmentNotFoundException;
-
- List<Attachment> getAttachments(List<AttachmentId> attachmentIds, MailboxSession mailboxSession) throws MailboxException;
-
- Publisher<Void> storeAttachment(Attachment attachment, MailboxSession mailboxSession);
-
- void storeAttachmentsForMessage(Collection<Attachment> attachments, MessageId ownerMessageId, MailboxSession mailboxSession) throws MailboxException;
-}
+public class MaildirAttachmentContentLoader implements AttachmentContentLoader {
+ @Override
+ public InputStream load(Attachment attachment, MailboxSession mailboxSession) {
+ throw new NotImplementedException("Maildir doesn't support loading attachment separately from Message");
+ }
+}
\ No newline at end of file
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
index c5da05b..6c02820 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerProvider.java
@@ -65,7 +65,7 @@ public class MaildirMailboxManagerProvider {
StoreMailboxAnnotationManager annotationManager = new StoreMailboxAnnotationManager(mf, storeRightManager);
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mf);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mf, mf, new DefaultTextExtractor());
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mf, mf, new DefaultTextExtractor(), new MaildirAttachmentContentLoader());
StoreMailboxManager manager = new StoreMailboxManager(mf, sessionProvider, new JVMMailboxPathLocker(),
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager,
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index fcb95e7..7d702ff 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -129,7 +129,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
RequirePreDeletionHooks listeningSearchIndex(Function<MailboxManagerPreInstanciationStage, ListeningMessageSearchIndex> searchIndex);
default RequirePreDeletionHooks scanningSearchIndex() {
- return searchIndex(stage -> new SimpleMessageSearchIndex(stage.mapperFactory, stage.mapperFactory, new DefaultTextExtractor()));
+ return searchIndex(stage -> new SimpleMessageSearchIndex(stage.mapperFactory, stage.mapperFactory, new DefaultTextExtractor(), null));
}
}
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 81dc1de..4cadd0e 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
@@ -39,7 +39,8 @@ class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest {
.searchIndex(preInstanciationStage -> new SimpleMessageSearchIndex(
preInstanciationStage.getMapperFactory(),
preInstanciationStage.getMapperFactory(),
- new PDFTextExtractor()))
+ new PDFTextExtractor(),
+ null))
.noPreDeletionHooks()
.storeQuotaManager()
.build();
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
index f32d60b..75e1552 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreAttachmentManager.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.store;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Collection;
import java.util.List;
@@ -113,4 +115,11 @@ public class StoreAttachmentManager implements AttachmentManager {
return attachmentMapperFactory.getAttachmentMapper(mailboxSession).getRelatedMessageIds(attachmentId);
}
+ @Override
+ public InputStream loadAttachmentContent(AttachmentId attachmentId, MailboxSession mailboxSession) throws AttachmentNotFoundException, IOException {
+ if (!userHasAccessToAttachment(attachmentId, mailboxSession)) {
+ throw new AttachmentNotFoundException(attachmentId.getId());
+ }
+ return attachmentMapperFactory.getAttachmentMapper(mailboxSession).loadAttachmentContent(attachmentId);
+ }
}
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
index ced1530..eb495ae 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/AttachmentMapper.java
@@ -18,6 +18,8 @@
****************************************************************/
package org.apache.james.mailbox.store.mail;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.Collection;
import java.util.List;
@@ -32,6 +34,10 @@ import org.reactivestreams.Publisher;
public interface AttachmentMapper extends Mapper {
+ default InputStream loadAttachmentContent(AttachmentId attachmentId) throws AttachmentNotFoundException, IOException {
+ return getAttachment(attachmentId).getStream();
+ }
+
Attachment getAttachment(AttachmentId attachmentId) throws AttachmentNotFoundException;
List<Attachment> getAttachments(Collection<AttachmentId> attachmentIds);
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 a255e61..03915fb 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
@@ -39,6 +39,8 @@ import java.util.stream.Stream;
import javax.mail.Flags;
+import org.apache.james.mailbox.AttachmentContentLoader;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.ModSeq;
import org.apache.james.mailbox.exception.MailboxException;
@@ -92,11 +94,15 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
private final Iterator<MailboxMessage> messages;
private final SearchQuery query;
private final TextExtractor textExtractor;
+ private final AttachmentContentLoader attachmentContentLoader;
+ private final MailboxSession mailboxSession;
- public MessageSearches(Iterator<MailboxMessage> messages, SearchQuery query, TextExtractor textExtractor) {
+ public MessageSearches(Iterator<MailboxMessage> messages, SearchQuery query, TextExtractor textExtractor, AttachmentContentLoader attachmentContentLoader, MailboxSession mailboxSession) {
this.messages = messages;
this.query = query;
this.textExtractor = textExtractor;
+ this.attachmentContentLoader = attachmentContentLoader;
+ this.mailboxSession = mailboxSession;
}
@Override
@@ -254,19 +260,19 @@ public class MessageSearches implements Iterable<SimpleMessageSearchIndex.Search
private boolean isInAttachments(String value, List<MessageAttachment> attachments) {
return attachments.stream()
.map(MessageAttachment::getAttachment)
- .flatMap(this::toAttachmentContent)
+ .flatMap(attachment -> toAttachmentContent(attachment, mailboxSession))
.anyMatch(string -> string.contains(value));
}
- private Stream<String> toAttachmentContent(Attachment attachment) {
- try {
+ private Stream<String> toAttachmentContent(Attachment attachment, MailboxSession mailboxSession) {
+ try (InputStream rawData = attachmentContentLoader.load(attachment, mailboxSession)) {
return OptionalUtils.toStream(
- textExtractor
- .extractContent(
- attachment.getStream(),
- attachment.getType())
- .getTextualContent());
- } catch (Exception e) {
+ textExtractor
+ .extractContent(
+ rawData,
+ attachment.getType())
+ .getTextualContent());
+ } catch (Exception e) {
LOGGER.error("Error while parsing attachment content", e);
return Stream.of();
}
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 ed6fd17..b33f980 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
@@ -30,6 +30,7 @@ import java.util.stream.Stream;
import javax.inject.Inject;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.MailboxManager.MessageCapabilities;
import org.apache.james.mailbox.MailboxManager.SearchCapabilities;
import org.apache.james.mailbox.MailboxSession;
@@ -70,12 +71,14 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
private final MessageMapperFactory messageMapperFactory;
private final MailboxMapperFactory mailboxMapperFactory;
private final TextExtractor textExtractor;
-
+ private final AttachmentContentLoader attachmentContentLoader;
+
@Inject
- public SimpleMessageSearchIndex(MessageMapperFactory messageMapperFactory, MailboxMapperFactory mailboxMapperFactory, TextExtractor textExtractor) {
+ public SimpleMessageSearchIndex(MessageMapperFactory messageMapperFactory, MailboxMapperFactory mailboxMapperFactory, TextExtractor textExtractor, AttachmentContentLoader attachmentContentLoader) {
this.messageMapperFactory = messageMapperFactory;
this.mailboxMapperFactory = mailboxMapperFactory;
this.textExtractor = textExtractor;
+ this.attachmentContentLoader = attachmentContentLoader;
}
@Override
@@ -139,7 +142,7 @@ public class SimpleMessageSearchIndex implements MessageSearchIndex {
hitSet.add(m);
}
}
- return ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, textExtractor).iterator());
+ return ImmutableList.copyOf(new MessageSearches(hitSet.iterator(), query, textExtractor, attachmentContentLoader, session).iterator());
}
@Override
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
index 5fae690..ff26f19 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsMultipartMixedTest.java
@@ -27,8 +27,10 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.extractor.TextExtractor;
+import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.SearchQuery;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import org.apache.james.mailbox.store.search.MessageSearches;
@@ -129,7 +131,8 @@ class SearchUtilsMultipartMixedTest {
Iterator<MailboxMessage> messages = null;
SearchQuery query = null;
TextExtractor textExtractor = null;
- messageSearches = new MessageSearches(messages, query, textExtractor);
+ MailboxSession session = null;
+ messageSearches = new MessageSearches(messages, query, textExtractor, (attachment, ignore) -> attachment.getStream(), session);
}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
index f983904..62b8921 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsRFC822Test.java
@@ -27,8 +27,10 @@ import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.extractor.TextExtractor;
+import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.SearchQuery;
import org.apache.james.mailbox.store.mail.model.MailboxMessage;
import org.apache.james.mailbox.store.search.MessageSearches;
@@ -69,7 +71,8 @@ class SearchUtilsRFC822Test {
Iterator<MailboxMessage> messages = null;
SearchQuery query = null;
TextExtractor textExtractor = null;
- messageSearches = new MessageSearches(messages, query, textExtractor);
+ MailboxSession session = null;
+ messageSearches = new MessageSearches(messages, query, textExtractor, (attachment, ignore) -> attachment.getStream(), session);
}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
index f71d8df..d263af7 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/SearchUtilsTest.java
@@ -31,8 +31,10 @@ import java.util.TimeZone;
import javax.mail.Flags;
+import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MessageUid;
import org.apache.james.mailbox.extractor.TextExtractor;
+import org.apache.james.mailbox.model.Attachment;
import org.apache.james.mailbox.model.SearchQuery;
import org.apache.james.mailbox.model.SearchQuery.AddressType;
import org.apache.james.mailbox.model.SearchQuery.DateResolution;
@@ -84,7 +86,8 @@ class SearchUtilsTest {
Iterator<MailboxMessage> messages = null;
SearchQuery query = null;
TextExtractor textExtractor = null;
- messageSearches = new MessageSearches(messages, query, textExtractor);
+ MailboxSession session = null;
+ messageSearches = new MessageSearches(messages, query, textExtractor, (attachment, ignore) -> attachment.getStream(), session);
}
@Test
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index 9ffdee2..7feaceb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -26,6 +26,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.james.core.Username;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.MailboxSessionUtil;
import org.apache.james.mailbox.MessageManager;
@@ -96,7 +97,8 @@ class StoreMailboxManagerTest {
StoreMailboxAnnotationManager annotationManager = new StoreMailboxAnnotationManager(mockedMapperFactory, storeRightManager);
SessionProviderImpl sessionProvider = new SessionProviderImpl(authenticator, FakeAuthorizator.forUserAndAdmin(ADMIN, CURRENT_USER));
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mockedMapperFactory);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mockedMapperFactory, mockedMapperFactory, new DefaultTextExtractor());
+ AttachmentContentLoader attachmentContentLoader = null;
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mockedMapperFactory, mockedMapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index d2ba763..f79b732 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -109,7 +109,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, quotaManager);
QuotaComponents quotaComponents = new QuotaComponents(perUserMaxQuotaManager, quotaManager, quotaRootResolver);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor());
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), null);
mailboxManager = new CassandraMailboxManager(mapperFactory, sessionProvider,
new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index b8d8aa8..e97a29c 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -28,6 +28,7 @@ import org.apache.james.imap.api.process.ImapProcessor;
import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
import org.apache.james.imap.main.DefaultImapDecoderFactory;
import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.acl.GroupMembershipResolver;
@@ -113,7 +114,8 @@ public class JPAHostSystem extends JamesImapHostSystem {
StoreQuotaManager storeQuotaManager = new StoreQuotaManager(currentQuotaManager, maxQuotaManager);
ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, storeQuotaManager);
QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, storeQuotaManager, quotaRootResolver);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor());
+ AttachmentContentLoader attachmentContentLoader = null;
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mapperFactory, mapperFactory, new DefaultTextExtractor(), attachmentContentLoader);
mailboxManager = new OpenJPAMailboxManager(mapperFactory, sessionProvider, messageParser, new DefaultMessageId.Factory(),
eventBus, annotationManager, storeRightManager, quotaComponents, index);
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index 2f52724..be3d8f1 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -84,7 +84,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
StoreMailboxAnnotationManager annotationManager = new StoreMailboxAnnotationManager(mailboxSessionMapperFactory, storeRightManager);
SessionProviderImpl sessionProvider = new SessionProviderImpl(authenticator, authorizator);
QuotaComponents quotaComponents = QuotaComponents.disabled(sessionProvider, mailboxSessionMapperFactory);
- MessageSearchIndex index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory, mailboxSessionMapperFactory, new DefaultTextExtractor());
+ MessageSearchIndex index = new SimpleMessageSearchIndex(mailboxSessionMapperFactory, mailboxSessionMapperFactory, new DefaultTextExtractor(), null);
mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, sessionProvider, locker,
messageParser, new DefaultMessageId.Factory(), annotationManager, eventBus, storeRightManager, quotaComponents,
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index 80d5579..03f864e 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -25,6 +25,7 @@ import javax.inject.Singleton;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.AttachmentManager;
import org.apache.james.mailbox.BlobManager;
import org.apache.james.mailbox.MailboxManager;
@@ -169,6 +170,7 @@ public class CassandraMailboxModule extends AbstractModule {
bind(AttachmentManager.class).to(StoreAttachmentManager.class);
bind(RightManager.class).to(StoreRightManager.class);
bind(SessionProvider.class).to(SessionProviderImpl.class);
+ bind(AttachmentContentLoader.class).to(AttachmentManager.class);
bind(ReIndexer.class).to(ReIndexerImpl.class);
bind(MessageIdReIndexer.class).to(MessageIdReIndexerImpl.class);
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index f405a03..3a9dd02 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -24,6 +24,7 @@ import javax.inject.Singleton;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxPathLocker;
import org.apache.james.mailbox.SessionProvider;
@@ -34,6 +35,7 @@ import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
import org.apache.james.mailbox.events.MailboxListener;
import org.apache.james.mailbox.indexer.ReIndexer;
+import org.apache.james.mailbox.jpa.JPAAttachmentContentLoader;
import org.apache.james.mailbox.jpa.JPAId;
import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory;
import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
@@ -107,6 +109,7 @@ public class JPAMailboxModule extends AbstractModule {
bind(MailboxId.Factory.class).to(JPAId.Factory.class);
bind(GroupMembershipResolver.class).to(SimpleGroupMembershipResolver.class);
bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
+ bind(AttachmentContentLoader.class).to(JPAAttachmentContentLoader.class);
bind(ReIndexer.class).to(ReIndexerImpl.class);
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index b683510..5433f94 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -25,6 +25,7 @@ import javax.inject.Singleton;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
+import org.apache.james.mailbox.AttachmentContentLoader;
import org.apache.james.mailbox.AttachmentManager;
import org.apache.james.mailbox.BlobManager;
import org.apache.james.mailbox.MailboxManager;
@@ -109,6 +110,7 @@ public class MemoryMailboxModule extends AbstractModule {
bind(MessageSearchIndex.class).to(SimpleMessageSearchIndex.class);
bind(TextExtractor.class).to(JsoupTextExtractor.class);
bind(RightManager.class).to(StoreRightManager.class);
+ bind(AttachmentContentLoader.class).to(AttachmentManager.class);
bind(DeletedMessageMetadataVault.class).to(MemoryDeletedMessageMetadataVault.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org