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 <matth...@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-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org