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 2018/12/12 10:51:55 UTC
[02/16] james-project git commit: MAILBOX-357 SpamAssassinListener
should not rely on AddedImpl
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 <bt...@linagora.com>
Authored: Mon Dec 10 14:13:11 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org