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