MAILBOX-357 SpamAssassinListener should not rely on AddedImpl
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/37131092 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/37131092 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/37131092 Branch: refs/heads/master Commit: 371310927977afb47740ff56bc869dc5e2f1e6a8 Parents: a8a5b01 Author: Benoit Tellier <[email protected]> Authored: Mon Dec 10 14:13:11 2018 +0700 Committer: Benoit Tellier <[email protected]> Committed: Wed Dec 12 17:50:57 2018 +0700 ---------------------------------------------------------------------- .../spamassassin/SpamAssassinListener.java | 76 ++++++++++++++------ .../spamassassin/SpamAssassinListenerTest.java | 2 +- 2 files changed, 54 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/37131092/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java ---------------------------------------------------------------------- diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java index 74443c9..8ac45e1 100644 --- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java +++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassinListener.java @@ -20,19 +20,27 @@ package org.apache.james.mailbox.spamassassin; import java.io.InputStream; import java.util.List; +import java.util.stream.Stream; import javax.inject.Inject; import org.apache.james.mailbox.Event; +import org.apache.james.mailbox.MailboxManager; +import org.apache.james.mailbox.MailboxSession; +import org.apache.james.mailbox.MessageUid; import org.apache.james.mailbox.Role; import org.apache.james.mailbox.SystemMailboxesProvider; import org.apache.james.mailbox.exception.MailboxException; import org.apache.james.mailbox.model.MailboxId; -import org.apache.james.mailbox.store.event.EventFactory; +import org.apache.james.mailbox.model.MessageRange; +import org.apache.james.mailbox.store.MailboxSessionMapperFactory; import org.apache.james.mailbox.store.event.MessageMoveEvent; import org.apache.james.mailbox.store.event.SpamEventListener; +import org.apache.james.mailbox.store.mail.MessageMapper; +import org.apache.james.mailbox.store.mail.model.Mailbox; import org.apache.james.mailbox.store.mail.model.MailboxMessage; import org.apache.james.mailbox.store.mail.model.Message; +import org.apache.james.util.streams.Iterators; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,15 +52,20 @@ import com.google.common.collect.ImmutableList; public class SpamAssassinListener implements SpamEventListener { private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinListener.class); + private static final int LIMIT = 1; private final SpamAssassin spamAssassin; private final SystemMailboxesProvider systemMailboxesProvider; + private final MailboxManager mailboxManager; + private final MailboxSessionMapperFactory mapperFactory; private final ExecutionMode executionMode; @Inject - SpamAssassinListener(SpamAssassin spamAssassin, SystemMailboxesProvider systemMailboxesProvider, ExecutionMode executionMode) { + SpamAssassinListener(SpamAssassin spamAssassin, SystemMailboxesProvider systemMailboxesProvider, MailboxManager mailboxManager, MailboxSessionMapperFactory mapperFactory, ExecutionMode executionMode) { this.spamAssassin = spamAssassin; this.systemMailboxesProvider = systemMailboxesProvider; + this.mailboxManager = mailboxManager; + this.mapperFactory = mapperFactory; this.executionMode = executionMode; } @@ -68,32 +81,49 @@ public class SpamAssassinListener implements SpamEventListener { @Override public void event(Event event) { - if (event instanceof MessageMoveEvent) { - MessageMoveEvent messageMoveEvent = (MessageMoveEvent) event; - if (isMessageMovedToSpamMailbox(messageMoveEvent)) { - LOGGER.debug("Spam event detected"); - ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent); - spamAssassin.learnSpam(messages, event.getUser()); + try { + MailboxSession session = mailboxManager.createSystemSession(getClass().getCanonicalName()); + if (event instanceof MessageMoveEvent) { + MessageMoveEvent messageMoveEvent = (MessageMoveEvent) event; + if (isMessageMovedToSpamMailbox(messageMoveEvent)) { + LOGGER.debug("Spam event detected"); + ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent); + spamAssassin.learnSpam(messages, event.getUser()); + } + if (isMessageMovedOutOfSpamMailbox(messageMoveEvent)) { + ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent); + spamAssassin.learnHam(messages, event.getUser()); + } } - if (isMessageMovedOutOfSpamMailbox(messageMoveEvent)) { - ImmutableList<InputStream> messages = retrieveMessages(messageMoveEvent); - spamAssassin.learnHam(messages, event.getUser()); + if (event instanceof Added) { + Added addedEvent = (Added) event; + if (isAppendedToInbox(addedEvent)) { + Mailbox mailbox = mapperFactory.getMailboxMapper(session).findMailboxById(addedEvent.getMailboxId()); + MessageMapper messageMapper = mapperFactory.getMessageMapper(session); + + List<InputStream> contents = addedEvent.getUids() + .stream() + .flatMap(uid -> retrieveMessage(messageMapper, mailbox, uid)) + .map(Throwing.function(MailboxMessage::getFullContent)) + .collect(Guavate.toImmutableList()); + spamAssassin.learnHam(contents, event.getUser()); + } } + } catch (MailboxException e) { + LOGGER.warn("Error while processing SPAM listener", e); } - if (event instanceof EventFactory.AddedImpl) { - EventFactory.AddedImpl addedEvent = (EventFactory.AddedImpl) event; - if (isAppendedToInbox(addedEvent)) { - List<InputStream> contents = addedEvent.getAvailableMessages() - .values() - .stream() - .map(Throwing.function(MailboxMessage::getFullContent)) - .collect(Guavate.toImmutableList()); - spamAssassin.learnHam(contents, event.getUser()); - } + } + + private Stream<MailboxMessage> retrieveMessage(MessageMapper messageMapper, Mailbox mailbox, MessageUid uid) { + try { + return Iterators.toStream(messageMapper.findInMailbox(mailbox, MessageRange.one(uid), MessageMapper.FetchType.Full, LIMIT)); + } catch (MailboxException e) { + LOGGER.warn("Can not retrieve message {} {}", mailbox.getMailboxId(), uid.asLong(), e); + return Stream.empty(); } } - private boolean isAppendedToInbox(EventFactory.AddedImpl addedEvent) { + private boolean isAppendedToInbox(Added addedEvent) { try { return systemMailboxesProvider.findMailbox(Role.INBOX, addedEvent.getUser()) .getId().equals(addedEvent.getMailboxId()); @@ -103,7 +133,7 @@ public class SpamAssassinListener implements SpamEventListener { } } - public ImmutableList<InputStream> retrieveMessages(MessageMoveEvent messageMoveEvent) { + private ImmutableList<InputStream> retrieveMessages(MessageMoveEvent messageMoveEvent) { return messageMoveEvent.getMessages() .values() .stream() http://git-wip-us.apache.org/repos/asf/james-project/blob/37131092/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java ---------------------------------------------------------------------- diff --git a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java index 19e7755..bc8aaeb 100644 --- a/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java +++ b/mailbox/plugin/spamassassin/src/test/java/org/apache/james/mailbox/spamassassin/SpamAssassinListenerTest.java @@ -98,7 +98,7 @@ public class SpamAssassinListenerTest { spamCapitalMailboxId = mailboxMapper.save(new SimpleMailbox(MailboxPath.forUser(USER, "SPAM"), UID_VALIDITY)); trashMailboxId = mailboxMapper.save(new SimpleMailbox(MailboxPath.forUser(USER, "Trash"), UID_VALIDITY)); - listener = new SpamAssassinListener(spamAssassin, systemMailboxesProvider, MailboxListener.ExecutionMode.SYNCHRONOUS); + listener = new SpamAssassinListener(spamAssassin, systemMailboxesProvider, mailboxManager, mapperFactory, MailboxListener.ExecutionMode.SYNCHRONOUS); } @After --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
