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/10/12 08:28:52 UTC

[01/12] james-project git commit: JAMES-2559 Add original branch parameter in merging tool

Repository: james-project
Updated Branches:
  refs/heads/master 8f5df4978 -> 02f8d6f73


JAMES-2559 Add original branch parameter in merging tool


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/57b8e7d6
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/57b8e7d6
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/57b8e7d6

Branch: refs/heads/master
Commit: 57b8e7d6903021bc5f98798483261961cdad754c
Parents: 8f5df49
Author: Antoine Duprat <ad...@linagora.com>
Authored: Wed Oct 10 15:24:26 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:24:58 2018 +0700

----------------------------------------------------------------------
 dockerfiles/merge/merge.sh | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/57b8e7d6/dockerfiles/merge/merge.sh
----------------------------------------------------------------------
diff --git a/dockerfiles/merge/merge.sh b/dockerfiles/merge/merge.sh
index 36b321f..a589cb9 100755
--- a/dockerfiles/merge/merge.sh
+++ b/dockerfiles/merge/merge.sh
@@ -2,30 +2,39 @@
 
 printUsage() {
    echo "Usage : "
-   echo "./merge.sh SHA1 RESULTING_BRANCH"
-   echo "    SHA1: SHA1 to merge with master"
+   echo "./merge.sh SHA1 RESULTING_BRANCH ORIGINAL_BRANCH"
+   echo "    SHA1: SHA1 to merge with the branch"
    echo "    RESULTING_BRANCH : Resulting branch of the merge"
+   echo "    ORIGINAL_BRANCH: the original branch used for merge (if none, then `master` will be used)"
    exit 1
 }
 
-if [ "$#" -ne 2 ]; then
+if [ "$#" -lt 2 ] || [ "$#" -gt 3 ]; then
     printUsage
 fi
 
 SHA1=$1
 RESULTING_BRANCH=$2
+if [ "$#" -eq 3 ]; then
+    ORIGINAL_BRANCH=$3
+else
+    ORIGINAL_BRANCH=master
+fi
 
 APACHE_REPO=`git remote show | grep apache || true`
 if [ -z "$APACHE_REPO" ]; then
     git remote add apache https://github.com/apache/james-project.git
 fi 
+# Getting original branch from apache repo
 git fetch apache
-git checkout apache/master -b master
+git checkout apache/$ORIGINAL_BRANCH -B $ORIGINAL_BRANCH
 
+# Getting the branch to be merged from /origin
 git fetch origin
 git checkout $SHA1
 git checkout -b SHA1_BRANCH
 
-git checkout master
+# Merging the branch to be merged in the original branch
+git checkout $ORIGINAL_BRANCH
 git checkout -b $RESULTING_BRANCH
 git merge --no-edit SHA1_BRANCH


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[10/12] james-project git commit: JAMES-2555 Migrate ReIndexuing tests to JUNIT 5

Posted by bt...@apache.org.
JAMES-2555 Migrate ReIndexuing tests to JUNIT 5


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/02f8d6f7
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/02f8d6f7
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/02f8d6f7

Branch: refs/heads/master
Commit: 02f8d6f73b03b004c39e58948e627b3f384d815f
Parents: 962683d
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 16:47:50 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:34 2018 +0700

----------------------------------------------------------------------
 mailbox/tools/indexer/pom.xml                   | 18 +++++++--
 .../indexer/CassandraReIndexerImplTest.java     | 40 +++++---------------
 .../tools/indexer/ReIndexerImplTest.java        | 12 +++---
 .../registrations/GlobalRegistrationTest.java   | 26 ++++++-------
 .../registrations/MailboxRegistrationTest.java  | 28 +++++++-------
 5 files changed, 56 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/02f8d6f7/mailbox/tools/indexer/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/pom.xml b/mailbox/tools/indexer/pom.xml
index 4395bba..34ab140 100644
--- a/mailbox/tools/indexer/pom.xml
+++ b/mailbox/tools/indexer/pom.xml
@@ -105,13 +105,23 @@
             <artifactId>javax.inject</artifactId>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.assertj</groupId>
-            <artifactId>assertj-core</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/02f8d6f7/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
index 7af0646..26f68cc 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
@@ -29,7 +29,7 @@ import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 
 import org.apache.james.backends.cassandra.CassandraCluster;
-import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
@@ -42,12 +42,9 @@ import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
 import org.apache.james.util.concurrency.ConcurrentTestRunner;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.google.common.base.Strings;
 
@@ -57,38 +54,21 @@ public class CassandraReIndexerImplTest {
     private CassandraMailboxManager mailboxManager;
     private ListeningMessageSearchIndex messageSearchIndex;
 
-    private ReIndexer reIndexer;
-
-    @ClassRule
-    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
-
-    private static CassandraCluster cassandra;
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(MailboxAggregateModule.MODULE_WITH_QUOTA);
 
-    @BeforeClass
-    public static void setUpClass() {
-        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraServer.getHost());
-    }
+    private ReIndexer reIndexer;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp(CassandraCluster cassandra) {
         mailboxManager = CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider());
         MailboxSessionMapperFactory mailboxSessionMapperFactory = mailboxManager.getMapperFactory();
         messageSearchIndex = mock(ListeningMessageSearchIndex.class);
         reIndexer = new ReIndexerImpl(mailboxManager, messageSearchIndex, mailboxSessionMapperFactory);
     }
 
-    @After
-    public void tearDown() {
-        cassandra.clearTables();
-    }
-
-    @AfterClass
-    public static void tearDownClass() {
-        cassandra.closeCluster();
-    }
-
     @Test
-    public void reIndexShouldBeWellPerformed() throws Exception {
+    void reIndexShouldBeWellPerformed() throws Exception {
         // Given a mailbox with 1000 messages * 150 KB
         MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
         mailboxManager.createMailbox(INBOX, systemSession);

http://git-wip-us.apache.org/repos/asf/james-project/blob/02f8d6f7/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
index cab234b..76f8a00 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
@@ -39,8 +39,8 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
 public class ReIndexerImplTest {
@@ -52,8 +52,8 @@ public class ReIndexerImplTest {
 
     private ReIndexer reIndexer;
 
-    @Before
-    public void setUp() throws MailboxException {
+    @BeforeEach
+    void setUp() throws MailboxException {
         mailboxManager = new InMemoryIntegrationResources().createMailboxManager(new SimpleGroupMembershipResolver());
         MailboxSessionMapperFactory mailboxSessionMapperFactory = mailboxManager.getMapperFactory();
         messageSearchIndex = mock(ListeningMessageSearchIndex.class);
@@ -61,7 +61,7 @@ public class ReIndexerImplTest {
     }
 
     @Test
-    public void reIndexShouldBeWellPerformed() throws Exception {
+    void reIndexShouldBeWellPerformed() throws Exception {
         MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
         MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
         ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession)
@@ -86,7 +86,7 @@ public class ReIndexerImplTest {
     }
 
     @Test
-    public void mailboxPathUserShouldBeUsedWhenReIndexing() throws Exception {
+    void mailboxPathUserShouldBeUsedWhenReIndexing() throws Exception {
         MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
         MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
         ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession)

http://git-wip-us.apache.org/repos/asf/james-project/blob/02f8d6f7/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/GlobalRegistrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/GlobalRegistrationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/GlobalRegistrationTest.java
index 7ebd5d3..e0b06f7 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/GlobalRegistrationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/GlobalRegistrationTest.java
@@ -31,41 +31,41 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 public class GlobalRegistrationTest {
     public static final MailboxPath INBOX = MailboxPath.forUser("btellier@apache.org", "INBOX");
-    public static final MailboxPath NEW_PATH = MailboxPath.forUser("btellier@apache.org", "INBOX.new");
-    public static final int UID_VALIDITY = 45;
-    public static final SimpleMailbox MAILBOX = new SimpleMailbox(INBOX, UID_VALIDITY);
-    public static final SimpleMailbox NEW_MAILBOX = new SimpleMailbox(NEW_PATH, UID_VALIDITY);
+    private static final MailboxPath NEW_PATH = MailboxPath.forUser("btellier@apache.org", "INBOX.new");
+    private static final int UID_VALIDITY = 45;
+    private static final SimpleMailbox MAILBOX = new SimpleMailbox(INBOX, UID_VALIDITY);
+    private static final SimpleMailbox NEW_MAILBOX = new SimpleMailbox(NEW_PATH, UID_VALIDITY);
 
     private GlobalRegistration globalRegistration;
     private EventFactory eventFactory;
     private MockMailboxSession session;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         eventFactory = new EventFactory();
         session = new MockMailboxSession("test");
         globalRegistration = new GlobalRegistration();
     }
 
     @Test
-    public void pathToIndexShouldNotBeChangedByDefault() {
+    void pathToIndexShouldNotBeChangedByDefault() {
         assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(INBOX);
     }
 
     @Test
-    public void pathToIndexShouldNotBeChangedByAddedEvents() {
+    void pathToIndexShouldNotBeChangedByAddedEvents() {
         MailboxListener.MailboxEvent event = eventFactory.mailboxAdded(session, MAILBOX);
         globalRegistration.event(event);
         assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(INBOX);
     }
 
     @Test
-    public void pathToIndexShouldBeNullifiedByDeletedEvents() {
+    void pathToIndexShouldBeNullifiedByDeletedEvents() {
         QuotaRoot quotaRoot = QuotaRoot.quotaRoot("root", Optional.empty());
         QuotaCount quotaCount = QuotaCount.count(123);
         QuotaSize quotaSize = QuotaSize.size(456);
@@ -75,11 +75,9 @@ public class GlobalRegistrationTest {
     }
 
     @Test
-    public void pathToIndexShouldBeModifiedByRenamedEvents() {
+    void pathToIndexShouldBeModifiedByRenamedEvents() {
         MailboxListener.MailboxEvent event = eventFactory.mailboxRenamed(session, INBOX, NEW_MAILBOX);
         globalRegistration.event(event);
         assertThat(globalRegistration.getPathToIndex(INBOX).get()).isEqualTo(NEW_PATH);
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/02f8d6f7/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
index 33a19b7..3b9bad2 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
@@ -39,8 +39,8 @@ import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.FlagsMessageEvent;
 import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.MessageDeletedEvent;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
@@ -48,31 +48,31 @@ import com.google.common.collect.Lists;
 public class MailboxRegistrationTest {
 
     public static final MailboxPath INBOX = MailboxPath.forUser("btellier@apache.org", "INBOX");
-    public static final MessageUid UID = MessageUid.of(18);
-    public static final int UID_VALIDITY = 45;
-    public static final SimpleMailbox MAILBOX = new SimpleMailbox(INBOX, UID_VALIDITY);
-    public static final int MOD_SEQ = 21;
-    public static final int SIZE = 41;
-    public static final Flags NEW_FLAGS = new Flags(Flags.Flag.ANSWERED);
+    private static final MessageUid UID = MessageUid.of(18);
+    private static final int UID_VALIDITY = 45;
+    private static final SimpleMailbox MAILBOX = new SimpleMailbox(INBOX, UID_VALIDITY);
+    private static final int MOD_SEQ = 21;
+    private static final int SIZE = 41;
+    private static final Flags NEW_FLAGS = new Flags(Flags.Flag.ANSWERED);
     private MailboxRegistration mailboxRegistration;
     private EventFactory eventFactory;
     private MockMailboxSession session;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         session = new MockMailboxSession("test");
         eventFactory = new EventFactory();
         mailboxRegistration = new MailboxRegistration(INBOX);
     }
 
     @Test
-    public void reportedEventsShouldBeInitiallyEmpty() {
+    void reportedEventsShouldBeInitiallyEmpty() {
         assertThat(mailboxRegistration.getImpactingEvents(UID)).isEmpty();
     }
 
 
     @Test
-    public void addedEventsShouldNotBeReported() {
+    void addedEventsShouldNotBeReported() {
         TreeMap<MessageUid, MessageMetaData> treeMap = new TreeMap<>();
         treeMap.put(UID, new SimpleMessageMetaData(UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()));
         MailboxListener.MailboxEvent event = eventFactory.added(session, treeMap, MAILBOX, ImmutableMap.<MessageUid, MailboxMessage>of());
@@ -81,7 +81,7 @@ public class MailboxRegistrationTest {
     }
 
     @Test
-    public void expungedEventsShouldBeReported() {
+    void expungedEventsShouldBeReported() {
         TreeMap<MessageUid, MessageMetaData> treeMap = new TreeMap<>();
         treeMap.put(UID, new SimpleMessageMetaData(UID, MOD_SEQ, new Flags(), SIZE, new Date(), new DefaultMessageId()));
         MailboxListener.MailboxEvent event = eventFactory.expunged(session, treeMap, MAILBOX);
@@ -90,7 +90,7 @@ public class MailboxRegistrationTest {
     }
 
     @Test
-    public void flagsEventsShouldBeReported() {
+    void flagsEventsShouldBeReported() {
         MailboxListener.MailboxEvent event = eventFactory.flagsUpdated(session,
             Lists.newArrayList(UID),
             MAILBOX,


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[04/12] james-project git commit: JAMES-2560 Integration test for ICSSanitizer

Posted by bt...@apache.org.
JAMES-2560 Integration test for ICSSanitizer


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/d722432d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/d722432d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/d722432d

Branch: refs/heads/master
Commit: d722432dde9161c7e210273692b132311ed7566a
Parents: 09b4165
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 12:24:40 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:26:53 2018 +0700

----------------------------------------------------------------------
 server/container/guice/memory-guice/pom.xml     |  5 +++
 .../src/test/resources/mailetcontainer.xml      |  1 +
 .../cucumber/GetMessagesMethodStepdefs.java     | 26 +++++++++++
 .../test/resources/cucumber/GetMessages.feature | 15 +++++++
 .../src/test/resources/eml/ics_in_header.eml    | 46 ++++++++++++++++++++
 .../src/test/resources/mailetcontainer.xml      |  1 +
 6 files changed, 94 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/container/guice/memory-guice/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/pom.xml b/server/container/guice/memory-guice/pom.xml
index 661634c..3bb24f2 100644
--- a/server/container/guice/memory-guice/pom.xml
+++ b/server/container/guice/memory-guice/pom.xml
@@ -60,6 +60,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-mailet-icalendar</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>event-sourcing-event-store-memory</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
index 2ecff3f..3dc8bbf 100644
--- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
+++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/resources/mailetcontainer.xml
@@ -57,6 +57,7 @@
             <mailet match="All" class="RemoveMimeHeader">
                 <name>bcc</name>
             </mailet>
+            <mailet match="All" class="ICSSanitizer"/>
             <mailet match="All" class="org.apache.james.jmap.mailet.TextCalendarBodyToAttachment"/>
             <mailet match="All" class="RecipientRewriteTable">
                 <errorProcessor>rrt-error</errorProcessor>

http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
index efc15e6..13819e5 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/cucumber/GetMessagesMethodStepdefs.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.methods.integration.cucumber;
 
 import static org.apache.james.jmap.TestingConstants.ARGUMENTS;
 import static org.apache.james.jmap.TestingConstants.NAME;
+import static org.apache.james.mailbox.model.MailboxConstants.INBOX;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.ByteArrayInputStream;
@@ -40,12 +41,17 @@ import javax.mail.Flags;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.text.StringEscapeUtils;
+import org.apache.james.jmap.TestingConstants;
 import org.apache.james.jmap.methods.integration.cucumber.util.TableRow;
 import org.apache.james.jmap.model.MessagePreviewGenerator;
+import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.modules.protocols.SmtpGuiceProbe;
+import org.apache.james.util.ClassLoaderUtils;
 import org.apache.james.utils.JmapGuiceProbe;
+import org.apache.james.utils.SMTPMessageSender;
 import org.javatuples.Pair;
 
 import com.github.fge.lambdas.Throwing;
@@ -373,6 +379,26 @@ public class GetMessagesMethodStepdefs {
         appendMessage(messageName, mailbox, StringListToFlags.fromFlagList(flagList));
     }
 
+    @Given("^\"([^\"]*)\" receives a SMTP message specified in file \"([^\"]*)\" as message \"([^\"]*)\"$")
+    public void smtpSend(String user, String fileName, String messageName) throws Exception {
+        MailboxId mailboxId = mainStepdefs.mailboxProbe.getMailboxId(MailboxConstants.USER_NAMESPACE, user, INBOX);
+        SMTPMessageSender smtpMessageSender = new SMTPMessageSender("domain.com");
+        smtpMessageSender
+            .connect("127.0.0.1", mainStepdefs.jmapServer.getProbe(SmtpGuiceProbe.class).getSmtpPort())
+            .sendMessageWithHeaders("from@domain.com", user,
+                ClassLoaderUtils.getSystemResourceAsString(fileName));
+        smtpMessageSender.close();
+
+        TestingConstants.calmlyAwait.until(() -> !retrieveIds(user, mailboxId).isEmpty());
+        List<String> ids = retrieveIds(user, mailboxId);
+        messageIdStepdefs.addMessageId(messageName, mainStepdefs.messageIdFactory.fromString(ids.get(0)));
+    }
+
+    public List<String> retrieveIds(String user, MailboxId mailboxId) {
+        userStepdefs.execWithUser(user, () -> httpClient.post("[[\"getMessageList\", {\"filter\":{\"inMailboxes\":[\"" + mailboxId.serialize() + "\"]}}, \"#0\"]]"));
+        return httpClient.jsonPath.read(ARGUMENTS + ".messageIds.[*]");
+    }
+
     private void appendMessage(String messageName, String mailbox, Flags flags) throws Exception {
         ZonedDateTime dateTime = ZonedDateTime.parse("2014-10-30T14:12:00Z");
         boolean isRecent = flags.contains(Flags.Flag.RECENT);

http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
index 828f068..7e79e5c 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/cucumber/GetMessages.feature
@@ -419,3 +419,18 @@ Feature: GetMessages method
     |cid      |null                          |
     |name     |"IMG_6112.JPG"                |
     |isInline |false                         |
+
+  @Only
+  Scenario: Header only text calendar should be read as normal calendar attachment by JMAP
+    Given "alice@domain.tld" receives a SMTP message specified in file "eml/ics_in_header.eml" as message "m1"
+    When "alice@domain.tld" ask for messages "m1"
+    Then no error is returned
+    And the list should contain 1 message
+    And the hasAttachment of the message is "true"
+    And the list of attachments of the message contains 1 attachments
+    And the first attachment is:
+    |key      | value                        |
+    |type     |"text/calendar"               |
+    |size     |1056                          |
+    |name     |"event.ics"                |
+    |isInline |false                         |

http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/ics_in_header.eml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/ics_in_header.eml b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/ics_in_header.eml
new file mode 100644
index 0000000..76ca1b7
--- /dev/null
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/resources/eml/ics_in_header.eml
@@ -0,0 +1,46 @@
+MIME-Version: 1.0
+Content-Type: multipart/mixed; 
+	boundary="----=_Part_80_888179120.1536742699653"
+From: Alice <al...@linagora.com>
+Message-ID: <82...@linagora.com>
+To: Bob <bo...@linagora.com>
+Date: Wed, 12 Sep 2018 10:58:18 +0200
+Subject: Event Invitation Reply (Accepted):
+ Point Produit
+
+------=_Part_80_888179120.1536742699653
+BEGIN:VCALENDAR
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+CREATED:20180911T144134Z
+LAST-MODIFIED:20180912T085818Z
+DTSTAMP:20180912T085818Z
+UID:f1514f44bf39311568d64072945fc3b2973debebb0d550e8c841f3f0604b2481e047fe
+ b2aab16e43439a608f28671ab7c10e754cbbe63441a01ba232a553df751eb0931728d67672
+ 
+SUMMARY:Point Produit
+PRIORITY:5
+ORGANIZER;CN=Bob;X-OBM-ID=348:mailto:bob@linagora.com
+ATTENDEE;CN=Alice;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810:
+ mailto:alice@linagora.com
+DTSTART:20180919T123000Z
+DURATION:PT1H
+TRANSP:OPAQUE
+SEQUENCE:0
+X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for X property. Rem
+ oving entire property:
+CLASS:PUBLIC
+X-OBM-DOMAIN:linagora.com
+X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922
+LOCATION:Téléphone
+END:VEVENT
+END:VCALENDAR
+Content-class: urn:content-classes:calendarmessage
+Content-type: text/calendar; method=REPLY; charset=UTF-8
+Content-transfer-encoding: 8BIT
+Content-Disposition: attachment
+
+
+------=_Part_80_888179120.1536742699653--

http://git-wip-us.apache.org/repos/asf/james-project/blob/d722432d/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
index c890709..8201e60 100644
--- a/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
+++ b/server/protocols/jmap-integration-testing/memory-jmap-integration-testing/src/test/resources/mailetcontainer.xml
@@ -58,6 +58,7 @@
             <mailet match="All" class="RemoveMimeHeader">
                 <name>bcc</name>
             </mailet>
+            <mailet match="All" class="ICSSanitizer"/>
             <mailet match="All" class="org.apache.james.jmap.mailet.TextCalendarBodyToAttachment"/>
             <mailet match="All" class="RecipientRewriteTable">
                 <errorProcessor>rrt-error</errorProcessor>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[05/12] james-project git commit: JAMES-2560 Introduce a mailet for sanitizing header only ICS

Posted by bt...@apache.org.
JAMES-2560 Introduce a mailet for sanitizing header only ICS


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ac82719f
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ac82719f
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ac82719f

Branch: refs/heads/master
Commit: ac82719fd460f5bc8a7306fb944cb4d7715b9dac
Parents: c7b1600
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 11:38:34 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:26:53 2018 +0700

----------------------------------------------------------------------
 mailet/icalendar/pom.xml                        |  20 +++-
 .../james/transport/mailets/ICSSanitizer.java   | 110 +++++++++++++++++
 .../transport/mailets/ICSSanitizerTest.java     | 118 +++++++++++++++++++
 .../src/test/resources/ics_in_header.eml        |  46 ++++++++
 4 files changed, 289 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/ac82719f/mailet/icalendar/pom.xml
----------------------------------------------------------------------
diff --git a/mailet/icalendar/pom.xml b/mailet/icalendar/pom.xml
index 78cddde..a7d03f4 100644
--- a/mailet/icalendar/pom.xml
+++ b/mailet/icalendar/pom.xml
@@ -80,11 +80,6 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
             <groupId>net.javacrumbs.json-unit</groupId>
             <artifactId>json-unit-assertj</artifactId>
             <scope>test</scope>
@@ -104,6 +99,21 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.platform</groupId>
+            <artifactId>junit-platform-launcher</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.vintage</groupId>
+            <artifactId>junit-vintage-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mnode.ical4j</groupId>
             <artifactId>ical4j</artifactId>
             <version>3.0.1</version>

http://git-wip-us.apache.org/repos/asf/james-project/blob/ac82719f/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
new file mode 100644
index 0000000..a2b268d
--- /dev/null
+++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
@@ -0,0 +1,110 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.transport.mailets;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import javax.mail.BodyPart;
+import javax.mail.Header;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.apache.mailet.Mail;
+import org.apache.mailet.base.GenericMailet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.fge.lambdas.Throwing;
+
+public class ICSSanitizer extends GenericMailet {
+    private static final Logger LOGGER = LoggerFactory.getLogger(ICSSanitizer.class);
+    private static final int TEXT_PREFIX_SIZE = 5;
+
+    @Override
+    public void service(Mail mail) {
+        try {
+            MimeMessage mimeMessage = mail.getMessage();
+
+            if (mimeMessage.getContent() instanceof Multipart) {
+                Multipart multipart = (Multipart) mimeMessage.getContent();
+
+                if (needsSanitizing(multipart)) {
+                    mimeMessage.setContent(sanitize(multipart));
+                    mimeMessage.saveChanges();
+                }
+            }
+        } catch (Exception e) {
+            LOGGER.warn("Could not sanitize {}", mail.getName(), e);
+        }
+    }
+
+    private boolean needsSanitizing(Multipart multipart) throws MessagingException {
+        return bodyPartStream(multipart)
+            .anyMatch(Throwing.predicate(this::needsSanitizing));
+    }
+
+    private boolean needsSanitizing(BodyPart bodyPart) throws MessagingException {
+        return bodyPart.isMimeType("text/calendar") && bodyPart.getSize() <= 0;
+    }
+
+    private MimeMultipart sanitize(Multipart multipart) throws MessagingException {
+        MimeMultipart mimeMultipart = new MimeMultipart();
+        bodyPartStream(multipart)
+            .map(Throwing.function(this::sanitize))
+            .forEach(Throwing.consumer(mimeMultipart::addBodyPart));
+        return mimeMultipart;
+    }
+
+    private BodyPart sanitize(BodyPart bodyPart) throws MessagingException {
+        if (needsSanitizing(bodyPart)) {
+            if (bodyPart instanceof MimeBodyPart) {
+                MimeBodyPart mimeBodyPart = (MimeBodyPart) bodyPart;
+                mimeBodyPart.setText(
+                    computeBodyFromOriginalCalendar(bodyPart),
+                    StandardCharsets.UTF_8.name(),
+                    bodyPart.getContentType().substring(TEXT_PREFIX_SIZE));
+            }
+        }
+        return bodyPart;
+    }
+
+    private String computeBodyFromOriginalCalendar(BodyPart bodyPart) throws MessagingException {
+        return headerStream(bodyPart)
+            .map(header -> header.getName() + ": " + header.getValue())
+            .collect(Collectors.joining("\r\n"));
+    }
+
+    private Stream<Header> headerStream(BodyPart bodyPart) throws MessagingException {
+        return Collections.list(bodyPart.getAllHeaders()).stream();
+    }
+
+    private Stream<BodyPart> bodyPartStream(Multipart multipart) throws MessagingException {
+        return IntStream.range(0, multipart.getCount())
+            .boxed()
+            .map(Throwing.function(multipart::getBodyPart));
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/ac82719f/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICSSanitizerTest.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICSSanitizerTest.java b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICSSanitizerTest.java
new file mode 100644
index 0000000..1e39fa2
--- /dev/null
+++ b/mailet/icalendar/src/test/java/org/apache/james/transport/mailets/ICSSanitizerTest.java
@@ -0,0 +1,118 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.transport.mailets;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.nio.charset.StandardCharsets;
+
+import javax.mail.Multipart;
+import javax.mail.util.SharedByteArrayInputStream;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.james.core.builder.MimeMessageBuilder;
+import org.apache.james.util.ClassLoaderUtils;
+import org.apache.james.util.MimeMessageUtil;
+import org.apache.mailet.base.test.FakeMail;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class ICSSanitizerTest {
+    private ICSSanitizer testee;
+
+    @BeforeEach
+    void setUp() {
+        testee = new ICSSanitizer();
+    }
+
+    @Test
+    void serviceShouldEnhanceTextCalendarOnlyHeaders() throws Exception {
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(MimeMessageUtil.mimeMessageFromStream(ClassLoaderUtils.getSystemResourceAsSharedStream("ics_in_header.eml")))
+            .build();
+
+        testee.service(mail);
+
+        Object content = mail.getMessage().getContent();
+
+        assertThat(content).isInstanceOf(Multipart.class);
+        Multipart multipart = (Multipart) content;
+        assertThat(multipart.getCount()).isEqualTo(1);
+
+        assertThat(multipart.getBodyPart(0).getContent())
+            .isEqualTo("BEGIN: VCALENDAR\r\n" +
+                "PRODID: -//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r\n" +
+                "VERSION: 2.0\r\n" +
+                "METHOD: REPLY\r\n" +
+                "BEGIN: VEVENT\r\n" +
+                "CREATED: 20180911T144134Z\r\n" +
+                "LAST-MODIFIED: 20180912T085818Z\r\n" +
+                "DTSTAMP: 20180912T085818Z\r\n" +
+                "UID: f1514f44bf39311568d64072945fc3b2973debebb0d550e8c841f3f0604b2481e047fe\r\n" +
+                " b2aab16e43439a608f28671ab7c10e754cbbe63441a01ba232a553df751eb0931728d67672\r\n" +
+                " \r\n" +
+                "SUMMARY: Point Produit\r\n" +
+                "PRIORITY: 5\r\n" +
+                "ORGANIZER;CN=Bob;X-OBM-ID=348: mailto:bob@linagora.com\r\n" +
+                "ATTENDEE;CN=Alice;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810: mailto:alice@linagora.com\r\n" +
+                "DTSTART: 20180919T123000Z\r\n" +
+                "DURATION: PT1H\r\n" +
+                "TRANSP: OPAQUE\r\n" +
+                "SEQUENCE: 0\r\n" +
+                "X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR: No value for X property. Rem\r\n" +
+                " oving entire property:\r\n" +
+                "CLASS: PUBLIC\r\n" +
+                "X-OBM-DOMAIN: linagora.com\r\n" +
+                "X-OBM-DOMAIN-UUID: 02874f7c-d10e-102f-acda-0015176f7922\r\n" +
+                "LOCATION: TÃ\u0083©lÃ\u0083©phone\r\n" +
+                "END: VEVENT\r\n" +
+                "END: VCALENDAR\r\n" +
+                "Content-class: urn:content-classes:calendarmessage\r\n" +
+                "Content-type: text/calendar; method=REPLY; charset=UTF-8\r\n" +
+                "Content-transfer-encoding: 8BIT\r\n" +
+                "Content-Disposition: attachment");
+        assertThat(multipart.getBodyPart(0).getContentType()).startsWith("text/calendar; method=REPLY; charset=UTF-8");
+    }
+
+    @Test
+    void validTextCalendarShouldNotBeSanitized() throws Exception {
+        FakeMail mail = FakeMail.builder()
+            .mimeMessage(
+                MimeMessageBuilder.mimeMessageBuilder()
+                    .setMultipartWithBodyParts(
+                        MimeMessageBuilder.bodyPartBuilder()
+                            .type("text/calendar")
+                            .data("Not empty")
+                            .addHeader("X-CUSTOM", "Because it is a valid ICS it should not be pushed in body")))
+            .build();
+
+        testee.service(mail);
+
+        Object content = mail.getMessage().getContent();
+
+        assertThat(content).isInstanceOf(Multipart.class);
+        Multipart multipart = (Multipart) content;
+        assertThat(multipart.getCount()).isEqualTo(1);
+
+        SharedByteArrayInputStream inputStream = (SharedByteArrayInputStream) multipart.getBodyPart(0).getContent();
+        assertThat(IOUtils.toString(inputStream, StandardCharsets.UTF_8))
+            .doesNotContain("X-CUSTOM");
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/ac82719f/mailet/icalendar/src/test/resources/ics_in_header.eml
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/test/resources/ics_in_header.eml b/mailet/icalendar/src/test/resources/ics_in_header.eml
new file mode 100644
index 0000000..76ca1b7
--- /dev/null
+++ b/mailet/icalendar/src/test/resources/ics_in_header.eml
@@ -0,0 +1,46 @@
+MIME-Version: 1.0
+Content-Type: multipart/mixed; 
+	boundary="----=_Part_80_888179120.1536742699653"
+From: Alice <al...@linagora.com>
+Message-ID: <82...@linagora.com>
+To: Bob <bo...@linagora.com>
+Date: Wed, 12 Sep 2018 10:58:18 +0200
+Subject: Event Invitation Reply (Accepted):
+ Point Produit
+
+------=_Part_80_888179120.1536742699653
+BEGIN:VCALENDAR
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+VERSION:2.0
+METHOD:REPLY
+BEGIN:VEVENT
+CREATED:20180911T144134Z
+LAST-MODIFIED:20180912T085818Z
+DTSTAMP:20180912T085818Z
+UID:f1514f44bf39311568d64072945fc3b2973debebb0d550e8c841f3f0604b2481e047fe
+ b2aab16e43439a608f28671ab7c10e754cbbe63441a01ba232a553df751eb0931728d67672
+ 
+SUMMARY:Point Produit
+PRIORITY:5
+ORGANIZER;CN=Bob;X-OBM-ID=348:mailto:bob@linagora.com
+ATTENDEE;CN=Alice;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL;X-OBM-ID=810:
+ mailto:alice@linagora.com
+DTSTART:20180919T123000Z
+DURATION:PT1H
+TRANSP:OPAQUE
+SEQUENCE:0
+X-LIC-ERROR;X-LIC-ERRORTYPE=VALUE-PARSE-ERROR:No value for X property. Rem
+ oving entire property:
+CLASS:PUBLIC
+X-OBM-DOMAIN:linagora.com
+X-OBM-DOMAIN-UUID:02874f7c-d10e-102f-acda-0015176f7922
+LOCATION:Téléphone
+END:VEVENT
+END:VCALENDAR
+Content-class: urn:content-classes:calendarmessage
+Content-type: text/calendar; method=REPLY; charset=UTF-8
+Content-transfer-encoding: 8BIT
+Content-Disposition: attachment
+
+
+------=_Part_80_888179120.1536742699653--


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[06/12] james-project git commit: JAMES-2560 Add a file name if none

Posted by bt...@apache.org.
JAMES-2560 Add a file name if none


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/09b41659
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/09b41659
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/09b41659

Branch: refs/heads/master
Commit: 09b416599741859aa8c9686f21c1f3a80686919b
Parents: ac82719
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 12:22:26 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:26:53 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/transport/mailets/ICSSanitizer.java     | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/09b41659/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
index a2b268d..bdbdb2b 100644
--- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
+++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
@@ -43,6 +43,7 @@ import com.github.fge.lambdas.Throwing;
 public class ICSSanitizer extends GenericMailet {
     private static final Logger LOGGER = LoggerFactory.getLogger(ICSSanitizer.class);
     private static final int TEXT_PREFIX_SIZE = 5;
+    public static final String DEFAULT_FILENAME = "event.ics";
 
     @Override
     public void service(Mail mail) {
@@ -87,11 +88,18 @@ public class ICSSanitizer extends GenericMailet {
                     computeBodyFromOriginalCalendar(bodyPart),
                     StandardCharsets.UTF_8.name(),
                     bodyPart.getContentType().substring(TEXT_PREFIX_SIZE));
+                setFileNameIfNeeded(mimeBodyPart);
             }
         }
         return bodyPart;
     }
 
+    private void setFileNameIfNeeded(MimeBodyPart mimeBodyPart) throws MessagingException {
+        if (mimeBodyPart.getFileName() == null) {
+            mimeBodyPart.setFileName(DEFAULT_FILENAME);
+        }
+    }
+
     private String computeBodyFromOriginalCalendar(BodyPart bodyPart) throws MessagingException {
         return headerStream(bodyPart)
             .map(header -> header.getName() + ": " + header.getValue())


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[11/12] james-project git commit: JAMES-2555 Proves our fix helps reindexing big mailboxes

Posted by bt...@apache.org.
JAMES-2555 Proves our fix helps reindexing big mailboxes

Before the fix the added test was failing with OutOfMemory exception after 300
messages. Now it passes easily 1000 messages.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/962683d3
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/962683d3
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/962683d3

Branch: refs/heads/master
Commit: 962683d38715e7a40286e422fc0487c495a47c32
Parents: 12a3445
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 09:19:44 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:34 2018 +0700

----------------------------------------------------------------------
 mailbox/tools/indexer/pom.xml                   |  53 ++++++++-
 .../indexer/CassandraReIndexerImplTest.java     | 119 +++++++++++++++++++
 2 files changed, 170 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/962683d3/mailbox/tools/indexer/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/pom.xml b/mailbox/tools/indexer/pom.xml
index e0874f0..4395bba 100644
--- a/mailbox/tools/indexer/pom.xml
+++ b/mailbox/tools/indexer/pom.xml
@@ -34,6 +34,17 @@
     <dependencies>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-backends-cassandra</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-backends-cassandra</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>apache-james-mailbox-api</artifactId>
         </dependency>
         <dependency>
@@ -44,11 +55,12 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>apache-james-mailbox-store</artifactId>
+            <artifactId>apache-james-mailbox-cassandra</artifactId>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>apache-james-mailbox-store</artifactId>
+            <artifactId>apache-james-mailbox-cassandra</artifactId>
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
@@ -64,6 +76,26 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-store</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-store</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>blob-cassandra</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
             <scope>test</scope>
@@ -91,7 +123,24 @@
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.testcontainers</groupId>
+            <artifactId>testcontainers</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <argLine>-Xms128m -Xmx256m</argLine>
+                    <reuseForks>false</reuseForks>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/962683d3/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
new file mode 100644
index 0000000..7af0646
--- /dev/null
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/CassandraReIndexerImplTest.java
@@ -0,0 +1,119 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.mailbox.tools.indexer;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import java.nio.charset.StandardCharsets;
+import java.time.Duration;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.DockerCassandraRule;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.cassandra.CassandraMailboxManager;
+import org.apache.james.mailbox.cassandra.CassandraMailboxManagerProvider;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
+import org.apache.james.mailbox.indexer.ReIndexer;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.MailboxMessage;
+import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
+import org.apache.james.util.concurrency.ConcurrentTestRunner;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+
+import com.google.common.base.Strings;
+
+public class CassandraReIndexerImplTest {
+    private static final String USERNAME = "benwa@apache.org";
+    public static final MailboxPath INBOX = MailboxPath.forUser(USERNAME, "INBOX");
+    private CassandraMailboxManager mailboxManager;
+    private ListeningMessageSearchIndex messageSearchIndex;
+
+    private ReIndexer reIndexer;
+
+    @ClassRule
+    public static DockerCassandraRule cassandraServer = new DockerCassandraRule();
+
+    private static CassandraCluster cassandra;
+
+    @BeforeClass
+    public static void setUpClass() {
+        cassandra = CassandraCluster.create(MailboxAggregateModule.MODULE_WITH_QUOTA, cassandraServer.getHost());
+    }
+
+    @Before
+    public void setUp() {
+        mailboxManager = CassandraMailboxManagerProvider.provideMailboxManager(cassandra.getConf(), cassandra.getTypesProvider());
+        MailboxSessionMapperFactory mailboxSessionMapperFactory = mailboxManager.getMapperFactory();
+        messageSearchIndex = mock(ListeningMessageSearchIndex.class);
+        reIndexer = new ReIndexerImpl(mailboxManager, messageSearchIndex, mailboxSessionMapperFactory);
+    }
+
+    @After
+    public void tearDown() {
+        cassandra.clearTables();
+    }
+
+    @AfterClass
+    public static void tearDownClass() {
+        cassandra.closeCluster();
+    }
+
+    @Test
+    public void reIndexShouldBeWellPerformed() throws Exception {
+        // Given a mailbox with 1000 messages * 150 KB
+        MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+        mailboxManager.createMailbox(INBOX, systemSession);
+
+        byte[] bigBody = (Strings.repeat("header: value\r\n", 10000) + "\r\nbody").getBytes(StandardCharsets.UTF_8);
+
+        int threadCount = 10;
+        int operationCount = 100;
+        MessageManager mailbox = mailboxManager.getMailbox(INBOX, systemSession);
+        ConcurrentTestRunner.builder()
+            .operation((a, b) -> mailbox
+                .appendMessage(
+                    MessageManager.AppendCommand.builder().build(bigBody),
+                    systemSession))
+            .threadCount(threadCount)
+            .operationCount(operationCount)
+            .runSuccessfullyWithin(Duration.ofMinutes(10));
+
+        // When We re-index
+        reIndexer.reIndex(INBOX);
+
+        // The indexer is called for each message
+        verify(messageSearchIndex).deleteAll(any(MailboxSession.class), any(Mailbox.class));
+        verify(messageSearchIndex, times(threadCount * operationCount))
+            .add(any(MailboxSession.class), any(Mailbox.class),any(MailboxMessage.class));
+        verifyNoMoreInteractions(messageSearchIndex);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[08/12] james-project git commit: JAMES-2555 Do not use null to represent event absence

Posted by bt...@apache.org.
JAMES-2555 Do not use null to represent event absence


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/fbe7900d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/fbe7900d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/fbe7900d

Branch: refs/heads/master
Commit: fbe7900db3364fb593eadadd3e49f3d97316fb81
Parents: 62e79d1
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Oct 9 09:01:35 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:13 2018 +0700

----------------------------------------------------------------------
 .../mailbox/tools/indexer/ReIndexerImpl.java     | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/fbe7900d/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
index 413f6b7..72a6746 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
@@ -19,7 +19,6 @@
 
 package org.apache.mailbox.tools.indexer;
 
-import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
@@ -44,7 +43,7 @@ import org.apache.mailbox.tools.indexer.registrations.MailboxRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 
 /**
  * Note about live re-indexation handling :
@@ -135,23 +134,27 @@ public class ReIndexerImpl implements ReIndexer {
     private void handleMailboxIndexingIterations(MailboxSession mailboxSession, MailboxRegistration mailboxRegistration, Mailbox mailbox, Iterator<MailboxMessage> iterator) throws MailboxException {
         while (iterator.hasNext()) {
             MailboxMessage message = iterator.next();
-            ImpactingMessageEvent impactingMessageEvent = findMostRelevant(mailboxRegistration.getImpactingEvents(message.getUid()));
+            Optional<ImpactingMessageEvent> impactingMessageEvent = findMostRelevant(mailboxRegistration.getImpactingEvents(message.getUid()));
 
-            impactingMessageEvent.newFlags().ifPresent(message::setFlags);
+            impactingMessageEvent.flatMap(ImpactingMessageEvent::newFlags).ifPresent(message::setFlags);
 
-            if (!impactingMessageEvent.wasDeleted()) {
+            if (wasNotDeleted(impactingMessageEvent)) {
                 messageSearchIndex.add(mailboxSession, mailbox, message);
             }
         }
     }
 
-    private ImpactingMessageEvent findMostRelevant(Collection<ImpactingMessageEvent> messageEvents) {
+    private boolean wasNotDeleted(Optional<ImpactingMessageEvent> impactingMessageEvent) {
+        return impactingMessageEvent.map(event -> !event.wasDeleted()).orElse(true);
+    }
+
+    private Optional<ImpactingMessageEvent> findMostRelevant(List<ImpactingMessageEvent> messageEvents) {
         for (ImpactingMessageEvent impactingMessageEvent : messageEvents) {
             if (impactingMessageEvent.getType().equals(ImpactingEventType.Deletion)) {
-                return impactingMessageEvent;
+                return Optional.of(impactingMessageEvent);
             }
         }
-        return Iterables.getLast(messageEvents, null);
+        return Lists.reverse(messageEvents).stream().findFirst();
     }
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[02/12] james-project git commit: Fix Checkstyle errors and Eclipse warnings

Posted by bt...@apache.org.
Fix Checkstyle errors and Eclipse warnings


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/c7b16003
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/c7b16003
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/c7b16003

Branch: refs/heads/master
Commit: c7b160033fe2043313fb8ba2d783348854850959
Parents: 57b8e7d
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Oct 10 15:46:03 2018 +0200
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:25:50 2018 +0700

----------------------------------------------------------------------
 .../cassandra/CassandraEventStoreExtension.java |  3 ++-
 .../protocols/smtp/AbstractSMTPServerTest.java  |  1 -
 .../objectstorage/DockerSwiftExtension.java     |  4 ++--
 .../org/apache/james/CassandraNodeConfTest.java |  4 ++--
 .../apache/james/GuiceModuleTestExtension.java  |  2 +-
 .../org/apache/james/GuiceJamesServerTest.java  |  4 ++--
 .../james/util/CompletableFutureUtilTest.java   |  1 -
 ...ResolutionRemoteDeliveryIntegrationTest.java |  1 -
 .../GatewayRemoteDeliveryIntegrationTest.java   |  2 --
 .../james/smtp/SmtpAuthorizedAddressesTest.java |  1 -
 .../mailets/GroupMappingRelayTest.java          |  1 -
 .../mailets/ICSAttachmentWorkflowTest.java      |  2 +-
 .../mailrepository/MailRepositoryContract.java  |  2 +-
 ...ilRepositoryWithFakeImplementationsTest.java | 25 ++++++++++----------
 .../service/ReprocessingServiceTest.java        |  2 +-
 .../queue/api/ManageableMailQueueContract.java  |  1 +
 .../james/queue/rabbitmq/EnqueuedItemTest.java  |  1 -
 ...abbitMQMailQueueConfigurationChangeTest.java |  3 ---
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java  |  1 +
 19 files changed, 27 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
----------------------------------------------------------------------
diff --git a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
index 52ce427..8633cb0 100644
--- a/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
+++ b/event-sourcing/event-store-cassandra/src/test/java/org/apache/james/eventsourcing/eventstore/cassandra/CassandraEventStoreExtension.java
@@ -38,11 +38,12 @@ import org.junit.jupiter.api.extension.ParameterResolver;
 import com.google.common.collect.ImmutableSet;
 
 public class CassandraEventStoreExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
+    @SuppressWarnings("rawtypes")
     private final Set<EventDTOModule> modules;
     private CassandraClusterExtension cassandra;
     private EventStoreDao eventStoreDao;
 
-    public CassandraEventStoreExtension(EventDTOModule... modules) {
+    public CassandraEventStoreExtension(@SuppressWarnings("rawtypes") EventDTOModule... modules) {
         this.modules = Arrays.stream(modules).collect(ImmutableSet.toImmutableSet());
         this.cassandra = new CassandraClusterExtension(CassandraEventStoreModule.MODULE);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
----------------------------------------------------------------------
diff --git a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
index 40e4a88..faeca83 100644
--- a/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
+++ b/protocols/smtp/src/test/java/org/apache/james/protocols/smtp/AbstractSMTPServerTest.java
@@ -30,7 +30,6 @@ import java.time.Duration;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.commons.configuration.Configuration;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DockerSwiftExtension.java
----------------------------------------------------------------------
diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DockerSwiftExtension.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DockerSwiftExtension.java
index 43155a0..d928e72 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DockerSwiftExtension.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DockerSwiftExtension.java
@@ -37,13 +37,13 @@ public class DockerSwiftExtension implements ParameterResolver, BeforeAllCallbac
     }
 
     @Override
-    public void beforeAll(ExtensionContext context) throws Exception {
+    public void beforeAll(ExtensionContext context) {
         swiftContainer.start();
         dockerSwift = swiftContainer.dockerSwift();
     }
 
     @Override
-    public void afterAll(ExtensionContext context) throws Exception {
+    public void afterAll(ExtensionContext context) {
         swiftContainer.stop();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
index 9c12467..bfaf593 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
@@ -76,7 +76,7 @@ class CassandraNodeConfTest {
             .build();
 
         @Test
-        void serverShouldStartServiceWhenNodeIsReachable (GuiceJamesServer server) throws Exception {
+        void serverShouldStartServiceWhenNodeIsReachable(GuiceJamesServer server) throws Exception {
             assertThatServerStartCorrectly(server);
         }
     }
@@ -103,7 +103,7 @@ class CassandraNodeConfTest {
             .build();
 
         @Test
-        void serverShouldStartServiceWhenNodeIsReachable (GuiceJamesServer server) throws Exception {
+        void serverShouldStartServiceWhenNodeIsReachable(GuiceJamesServer server) throws Exception {
             assertThatServerStartCorrectly(server);
         }
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/container/guice/guice-common/src/test/java/org/apache/james/GuiceModuleTestExtension.java
----------------------------------------------------------------------
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/GuiceModuleTestExtension.java b/server/container/guice/guice-common/src/test/java/org/apache/james/GuiceModuleTestExtension.java
index e51c0d7..e0bf5e1 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/GuiceModuleTestExtension.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/GuiceModuleTestExtension.java
@@ -24,7 +24,7 @@ import com.google.inject.Module;
 public interface GuiceModuleTestExtension extends RegistrableExtension {
 
     default Module getModule() {
-        return binder -> {};
+        return binder -> { };
     }
 
     default void await() {}

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
index 7edf781..2022f57 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
@@ -59,7 +59,7 @@ class GuiceJamesServerTest {
 
     @Nested
     class InitFailed {
-        private final ConfigurationPerformer THROWING_CONFIGURATION_PERFORMER = new ConfigurationPerformer() {
+        private final ConfigurationPerformer throwingConfigurationPerformer = new ConfigurationPerformer() {
             @Override
             public void initModule() {
                 throw new RuntimeException();
@@ -79,7 +79,7 @@ class GuiceJamesServerTest {
                 .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(binder -> Multibinder.newSetBinder(binder, ConfigurationPerformer.class)
                     .addBinding()
-                    .toInstance(THROWING_CONFIGURATION_PERFORMER)))
+                    .toInstance(throwingConfigurationPerformer)))
             .disableAutoStart()
             .build();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
----------------------------------------------------------------------
diff --git a/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java b/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
index c45c3cc..53ade79 100644
--- a/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
+++ b/server/container/util/src/test/java/org/apache/james/util/CompletableFutureUtilTest.java
@@ -26,7 +26,6 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java
index 9ca5da5..3b20e7d 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/DirectResolutionRemoteDeliveryIntegrationTest.java
@@ -46,7 +46,6 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.FakeSmtp;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
-import org.awaitility.Duration;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
index 49cd2cc..33a536c 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/mailets/GatewayRemoteDeliveryIntegrationTest.java
@@ -25,7 +25,6 @@ import static org.apache.james.mailets.configuration.Constants.DEFAULT_DOMAIN;
 import static org.apache.james.mailets.configuration.Constants.LOCALHOST_IP;
 import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
 
@@ -43,7 +42,6 @@ import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.FakeSmtp;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
-import org.awaitility.Duration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
index bb3cf40..a6a57ff 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/smtp/SmtpAuthorizedAddressesTest.java
@@ -44,7 +44,6 @@ import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
 import org.apache.james.utils.SMTPSendingException;
 import org.apache.james.utils.SmtpSendingStep;
-import org.awaitility.Duration;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java
index 4f97b49..9d37846 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/GroupMappingRelayTest.java
@@ -50,7 +50,6 @@ import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.routes.GroupsRoutes;
 import org.apache.mailet.base.test.FakeMail;
-import org.awaitility.Duration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
index 8355034..4337d06 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/ICSAttachmentWorkflowTest.java
@@ -431,7 +431,7 @@ public class ICSAttachmentWorkflowTest {
     @ClassRule
     public static SwarmGenericContainer rabbitMqContainer = new SwarmGenericContainer(Images.RABBITMQ)
         .withAffinityToContainer()
-        .waitingFor(new HostPortWaitStrategy().withRateLimiter(RateLimiters.DEFAULT));;
+        .waitingFor(new HostPortWaitStrategy().withRateLimiter(RateLimiters.DEFAULT));
     @Rule
     public TemporaryFolder temporaryFolder = new TemporaryFolder();
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
index 4de1de8..1cdc218 100644
--- a/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
+++ b/server/mailrepository/mailrepository-api/src/test/java/org/apache/james/mailrepository/MailRepositoryContract.java
@@ -33,7 +33,6 @@ import java.util.stream.IntStream;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
-import com.github.fge.lambdas.Throwing;
 import org.apache.james.core.MailAddress;
 import org.apache.james.core.builder.MimeMessageBuilder;
 import org.apache.james.mailrepository.api.MailKey;
@@ -49,6 +48,7 @@ import org.apache.mailet.base.test.FakeMail;
 import org.junit.jupiter.api.RepeatedTest;
 import org.junit.jupiter.api.Test;
 
+import com.github.fge.lambdas.Throwing;
 import com.github.fge.lambdas.runnable.ThrowingRunnable;
 import com.github.steveash.guavate.Guavate;
 import com.google.common.base.Strings;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
----------------------------------------------------------------------
diff --git a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
index 75aa16a..ce56641 100644
--- a/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
+++ b/server/mailrepository/mailrepository-cassandra/src/test/java/org/apache/james/mailrepository/cassandra/CassandraMailRepositoryWithFakeImplementationsTest.java
@@ -19,9 +19,16 @@
 
 package org.apache.james.mailrepository.cassandra;
 
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Session;
-import com.google.common.collect.ImmutableList;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+import javax.mail.MessagingException;
+import javax.mail.internet.MimeMessage;
+
 import org.apache.james.backends.cassandra.CassandraCluster;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
@@ -47,14 +54,9 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
-import javax.mail.MessagingException;
-import javax.mail.internet.MimeMessage;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import com.google.common.collect.ImmutableList;
 
 @ExtendWith(CassandraMailRepositoryWithFakeImplementationsTest.MailRepositoryCassandraClusterExtension.class)
 class CassandraMailRepositoryWithFakeImplementationsTest {
@@ -83,7 +85,6 @@ class CassandraMailRepositoryWithFakeImplementationsTest {
             CassandraMailRepositoryMailDAO mailDAO = new CassandraMailRepositoryMailDAO(cassandra.getConf(), BLOB_ID_FACTORY, cassandra.getTypesProvider());
             keysDAO = new CassandraMailRepositoryKeysDAO(cassandra.getConf(), CassandraUtils.WITH_DEFAULT_CONFIGURATION);
             CassandraMailRepositoryCountDAO countDAO = new CassandraMailRepositoryCountDAO(cassandra.getConf());
-            CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf());
 
             cassandraMailRepository = new CassandraMailRepository(URL,
                     keysDAO, countDAO, mailDAO, new FailingStore());

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
index 9e09a8d..48739d0 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
@@ -59,7 +59,7 @@ public class ReprocessingServiceTest {
     private static final MailKey KEY_2 = new MailKey(NAME_2);
     private static final MailKey KEY_3 = new MailKey(NAME_3);
     private static final String SPOOL = "spool";
-    private static final Consumer<MailKey> NOOP_CONSUMER = key -> {};
+    private static final Consumer<MailKey> NOOP_CONSUMER = key -> { };
     private static final Optional<String> NO_TARGET_PROCESSOR = Optional.empty();
 
     private ReprocessingService reprocessingService;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java
index 48f422b..009b3a5 100644
--- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueContract.java
@@ -444,6 +444,7 @@ public interface ManageableMailQueueContract extends MailQueueContract {
             softly.assertThat(content).isEqualTo("mail body");
         });
     }
+
     @Test
     default void browsingShouldNotAffectDequeue() throws Exception {
         enQueue(defaultMail()

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java
index 9006d70..6f97456 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/EnqueuedItemTest.java
@@ -21,7 +21,6 @@ package org.apache.james.queue.rabbitmq;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
-import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.mail.MimeMessagePartsId;
 import org.apache.mailet.Mail;

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
index 87c4985..5645bef 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
@@ -111,9 +111,6 @@ class RabbitMQMailQueueConfigurationChangeTest {
     }
 
     private RabbitMQMailQueue getRabbitMQMailQueue(CassandraCluster cassandra, CassandraMailQueueViewConfiguration mailQueueViewConfiguration) throws Exception {
-        CassandraBlobsDAO blobsDAO = new CassandraBlobsDAO(cassandra.getConf(), CassandraConfiguration.DEFAULT_CONFIGURATION, BLOB_ID_FACTORY);
-        Store<MimeMessage, MimeMessagePartsId> mimeMessageStore = MimeMessageStore.factory(blobsDAO).mimeMessageStore();
-
         MailQueueView mailQueueView = CassandraMailQueueViewTestFactory.factory(clock, random, cassandra.getConf(), cassandra.getTypesProvider(),
             mailQueueViewConfiguration, mimeMessageStore)
             .create(MailQueueName.fromString(SPOOL));

http://git-wip-us.apache.org/repos/asf/james-project/blob/c7b16003/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
----------------------------------------------------------------------
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
index 6c38d25..0fa4e5a 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMqMailQueueFactoryTest.java
@@ -56,6 +56,7 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
 
     @BeforeEach
     void setup() throws URISyntaxException {
+        @SuppressWarnings("unchecked")
         Store<MimeMessage, MimeMessagePartsId> mimeMessageStore = mock(Store.class);
         MailQueueView mailQueueView = mock(MailQueueView.class);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[09/12] james-project git commit: JAMES-2555 ReIndexerImpl tests should rely less on mocks

Posted by bt...@apache.org.
JAMES-2555 ReIndexerImpl tests should rely less on mocks

We should use an in-memory test system for mailboxManager rather than emulating ours on top of mocks.

Mocks are still useful to check side effects on the indexer


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/12a3445d
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/12a3445d
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/12a3445d

Branch: refs/heads/master
Commit: 12a3445dea0569740ca6e95ea5e4812bd93b9bb6
Parents: 3f637e7
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Oct 9 09:30:04 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:34 2018 +0700

----------------------------------------------------------------------
 mailbox/tools/indexer/pom.xml                   |  11 ++
 .../tools/indexer/ReIndexerImplTest.java        | 131 ++++++++-----------
 2 files changed, 63 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/12a3445d/mailbox/tools/indexer/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/pom.xml b/mailbox/tools/indexer/pom.xml
index 4f44d85..e0874f0 100644
--- a/mailbox/tools/indexer/pom.xml
+++ b/mailbox/tools/indexer/pom.xml
@@ -53,6 +53,17 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-memory</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
             <scope>test</scope>

http://git-wip-us.apache.org/repos/asf/james-project/blob/12a3445d/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
index b7c583c..cab234b 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/ReIndexerImplTest.java
@@ -19,120 +19,93 @@
 
 package org.apache.mailbox.tools.indexer;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
 
-import org.apache.james.mailbox.MailboxListener;
-import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
-import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexer;
-import org.apache.james.mailbox.mock.MockMailboxSession;
+import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.model.ComposedMessageId;
+import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.MessageBuilder;
-import org.apache.james.mailbox.store.mail.MailboxMapper;
-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.impl.SimpleMailbox;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
-import org.assertj.core.util.Lists;
 import org.junit.Before;
 import org.junit.Test;
-
-import com.google.common.collect.ImmutableList;
+import org.mockito.ArgumentCaptor;
 
 public class ReIndexerImplTest {
 
-    public static final MailboxPath INBOX = MailboxPath.forUser("benwa@apache.org", "INBOX");
-    public static final int LIMIT = 0;
-    private MailboxManager mailboxManager;
-    private MailboxSessionMapperFactory mailboxSessionMapperFactory;
+    private static final String USERNAME = "benwa@apache.org";
+    public static final MailboxPath INBOX = MailboxPath.forUser(USERNAME, "INBOX");
+    private InMemoryMailboxManager mailboxManager;
     private ListeningMessageSearchIndex messageSearchIndex;
 
     private ReIndexer reIndexer;
 
     @Before
-    public void setUp() {
-        mailboxManager = mock(MailboxManager.class);
-        mailboxSessionMapperFactory = mock(MailboxSessionMapperFactory.class);
+    public void setUp() throws MailboxException {
+        mailboxManager = new InMemoryIntegrationResources().createMailboxManager(new SimpleGroupMembershipResolver());
+        MailboxSessionMapperFactory mailboxSessionMapperFactory = mailboxManager.getMapperFactory();
         messageSearchIndex = mock(ListeningMessageSearchIndex.class);
         reIndexer = new ReIndexerImpl(mailboxManager, messageSearchIndex, mailboxSessionMapperFactory);
     }
 
     @Test
-    public void test() throws Exception {
-        final MockMailboxSession mockMailboxSession = new MockMailboxSession("re-indexing");
-        when(mailboxManager.createSystemSession(any(String.class)))
-            .thenReturn(mockMailboxSession);
-        final MessageMapper messageMapper = mock(MessageMapper.class);
-        final MailboxMapper mailboxMapper = mock(MailboxMapper.class);
-        when(mailboxSessionMapperFactory.getMessageMapper(any(MailboxSession.class)))
-            .thenReturn(messageMapper);
-        when(mailboxSessionMapperFactory.getMailboxMapper(any(MailboxSession.class)))
-            .thenReturn(mailboxMapper);
-        final MailboxMessage message = new MessageBuilder().build();
-        final SimpleMailbox mailbox = new SimpleMailbox(INBOX, 42);
-        mailbox.setMailboxId(message.getMailboxId());
-        when(mailboxMapper.findMailboxByPath(INBOX)).thenReturn(mailbox);
-        when(messageMapper.findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT))
-            .thenReturn(Lists.newArrayList(message).iterator());
+    public void reIndexShouldBeWellPerformed() throws Exception {
+        MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+        MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+        ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession)
+            .appendMessage(
+                MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+                systemSession);
 
         reIndexer.reIndex(INBOX);
 
-        verify(mailboxManager).createSystemSession(any(String.class));
-        verify(mailboxSessionMapperFactory).getMailboxMapper(mockMailboxSession);
-        verify(mailboxSessionMapperFactory).getMessageMapper(mockMailboxSession);
-        verify(mailboxMapper).findMailboxByPath(INBOX);
-        verify(messageMapper).findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Full, LIMIT);
-        verify(mailboxManager).addListener(eq(INBOX), any(MailboxListener.class), any(MailboxSession.class));
-        verify(mailboxManager).removeListener(eq(INBOX), any(MailboxListener.class), any(MailboxSession.class));
-        verify(messageSearchIndex).add(any(MailboxSession.class), eq(mailbox), eq(message));
-        verify(messageSearchIndex).deleteAll(any(MailboxSession.class), eq(mailbox));
-        verifyNoMoreInteractions(mailboxMapper, mailboxSessionMapperFactory, messageSearchIndex, messageMapper, mailboxMapper);
+        ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class);
+        ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class);
+        ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class);
+
+        verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture());
+        verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture());
+        verifyNoMoreInteractions(messageSearchIndex);
+
+        assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId));
+        assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId));
+        assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId)
+            && message.getUid().equals(createdMessage.getUid()));
     }
 
     @Test
     public void mailboxPathUserShouldBeUsedWhenReIndexing() throws Exception {
-        MockMailboxSession systemMailboxSession = new MockMailboxSession("re-indexing");
-        when(mailboxManager.createSystemSession("re-indexing"))
-            .thenReturn(systemMailboxSession);
-        MailboxMapper mailboxMapper = mock(MailboxMapper.class);
-        when(mailboxSessionMapperFactory.getMailboxMapper(systemMailboxSession))
-            .thenReturn(mailboxMapper);
-
-        String user1 = "user1@james.org";
-        MailboxPath user1MailboxPath = MailboxPath.forUser(user1, "Inbox");
-        MockMailboxSession user1MailboxSession = new MockMailboxSession(user1);
-        when(mailboxManager.createSystemSession(user1))
-            .thenReturn(user1MailboxSession);
-        MailboxMapper user1MailboxMapper = mock(MailboxMapper.class);
-        when(mailboxSessionMapperFactory.getMailboxMapper(user1MailboxSession))
-            .thenReturn(user1MailboxMapper);
-        Mailbox user1Mailbox = mock(Mailbox.class);
-        when(user1MailboxMapper.findMailboxByPath(user1MailboxPath))
-            .thenReturn(user1Mailbox);
-        MessageMapper user1MessageMapper = mock(MessageMapper.class);
-        when(mailboxSessionMapperFactory.getMessageMapper(user1MailboxSession))
-            .thenReturn(user1MessageMapper);
-        MailboxMessage user1MailboxMessage = mock(MailboxMessage.class);
-        when(user1MessageMapper.findInMailbox(user1Mailbox, MessageRange.all(), MessageMapper.FetchType.Full, ReIndexerImpl.NO_LIMIT))
-            .thenReturn(ImmutableList.of(user1MailboxMessage).iterator());
-        when(user1MailboxMessage.getUid())
-            .thenReturn(MessageUid.of(1));
-
-        when(mailboxManager.list(systemMailboxSession))
-            .thenReturn(ImmutableList.of(user1MailboxPath));
+        MailboxSession systemSession = mailboxManager.createSystemSession(USERNAME);
+        MailboxId mailboxId = mailboxManager.createMailbox(INBOX, systemSession).get();
+        ComposedMessageId createdMessage = mailboxManager.getMailbox(INBOX, systemSession)
+            .appendMessage(
+                MessageManager.AppendCommand.builder().build("header: value\r\n\r\nbody"),
+                systemSession);
 
         reIndexer.reIndex();
-
-        verify(messageSearchIndex).deleteAll(user1MailboxSession, user1Mailbox);
-        verify(messageSearchIndex).add(user1MailboxSession, user1Mailbox, user1MailboxMessage);
+        ArgumentCaptor<MailboxMessage> messageCaptor = ArgumentCaptor.forClass(MailboxMessage.class);
+        ArgumentCaptor<Mailbox> mailboxCaptor1 = ArgumentCaptor.forClass(Mailbox.class);
+        ArgumentCaptor<Mailbox> mailboxCaptor2 = ArgumentCaptor.forClass(Mailbox.class);
+
+        verify(messageSearchIndex).deleteAll(any(MailboxSession.class), mailboxCaptor1.capture());
+        verify(messageSearchIndex).add(any(MailboxSession.class), mailboxCaptor2.capture(), messageCaptor.capture());
+        verifyNoMoreInteractions(messageSearchIndex);
+
+        assertThat(mailboxCaptor1.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId));
+        assertThat(mailboxCaptor2.getValue()).matches(mailbox -> mailbox.getMailboxId().equals(mailboxId));
+        assertThat(messageCaptor.getValue()).matches(message -> message.getMailboxId().equals(mailboxId)
+            && message.getUid().equals(createdMessage.getUid()));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[12/12] james-project git commit: JAMES-2555 Read a list of UID then proceed per-message re-indexing

Posted by bt...@apache.org.
JAMES-2555 Read a list of UID then proceed per-message re-indexing

This avoids loading a full mailbox blobs in memory


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3f637e7b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3f637e7b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3f637e7b

Branch: refs/heads/master
Commit: 3f637e7bb896203d8f060e0922135c9ee6a4af40
Parents: fbe7900
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Oct 9 09:05:00 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:34 2018 +0700

----------------------------------------------------------------------
 .../mailbox/tools/indexer/ReIndexerImpl.java    | 84 ++++++++++++--------
 1 file changed, 49 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3f637e7b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
index 72a6746..f239e32 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
@@ -19,7 +19,6 @@
 
 package org.apache.mailbox.tools.indexer;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 
@@ -27,6 +26,7 @@ import javax.inject.Inject;
 
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.indexer.ReIndexer;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -36,6 +36,7 @@ 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.search.ListeningMessageSearchIndex;
+import org.apache.james.util.streams.Iterators;
 import org.apache.mailbox.tools.indexer.events.ImpactingEventType;
 import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent;
 import org.apache.mailbox.tools.indexer.registrations.GlobalRegistration;
@@ -43,6 +44,7 @@ import org.apache.mailbox.tools.indexer.registrations.MailboxRegistration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.github.fge.lambdas.Throwing;
 import com.google.common.collect.Lists;
 
 /**
@@ -60,7 +62,9 @@ import com.google.common.collect.Lists;
 public class ReIndexerImpl implements ReIndexer {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ReIndexerImpl.class);
-    public static final int NO_LIMIT = 0;
+
+    private static final int NO_LIMIT = 0;
+    private static final int SINGLE_MESSAGE = 1;
 
     private final MailboxManager mailboxManager;
     private final ListeningMessageSearchIndex messageSearchIndex;
@@ -97,28 +101,7 @@ public class ReIndexerImpl implements ReIndexer {
         LOGGER.info("Full reindex finished");
     }
 
-    private void reIndex(MailboxPath path, MailboxSession mailboxSession) throws MailboxException {
-        MailboxRegistration mailboxRegistration = new MailboxRegistration(path);
-        LOGGER.info("Intend to reindex {}",path);
-        Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxByPath(path);
-        messageSearchIndex.deleteAll(mailboxSession, mailbox);
-        mailboxManager.addListener(path, mailboxRegistration, mailboxSession);
-        try {
-            handleMailboxIndexingIterations(mailboxSession,
-                mailboxRegistration,
-                mailbox,
-                mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
-                    .findInMailbox(mailbox,
-                        MessageRange.all(),
-                        MessageMapper.FetchType.Full,
-                        NO_LIMIT));
-            LOGGER.info("Finish to reindex {}", path);
-        } finally {
-            mailboxManager.removeListener(path, mailboxRegistration, mailboxSession);
-        }
-    }
-
-    private void handleFullReindexingIterations(List<MailboxPath> mailboxPaths, GlobalRegistration globalRegistration) throws MailboxException {
+    private void handleFullReindexingIterations(List<MailboxPath> mailboxPaths, GlobalRegistration globalRegistration) {
         for (MailboxPath mailboxPath : mailboxPaths) {
             Optional<MailboxPath> pathToIndex = globalRegistration.getPathToIndex(mailboxPath);
             if (pathToIndex.isPresent()) {
@@ -131,21 +114,37 @@ public class ReIndexerImpl implements ReIndexer {
         }
     }
 
-    private void handleMailboxIndexingIterations(MailboxSession mailboxSession, MailboxRegistration mailboxRegistration, Mailbox mailbox, Iterator<MailboxMessage> iterator) throws MailboxException {
-        while (iterator.hasNext()) {
-            MailboxMessage message = iterator.next();
-            Optional<ImpactingMessageEvent> impactingMessageEvent = findMostRelevant(mailboxRegistration.getImpactingEvents(message.getUid()));
-
-            impactingMessageEvent.flatMap(ImpactingMessageEvent::newFlags).ifPresent(message::setFlags);
 
-            if (wasNotDeleted(impactingMessageEvent)) {
-                messageSearchIndex.add(mailboxSession, mailbox, message);
-            }
+    private void reIndex(MailboxPath path, MailboxSession mailboxSession) throws MailboxException {
+        MailboxRegistration mailboxRegistration = new MailboxRegistration(path);
+        LOGGER.info("Intend to reindex {}",path);
+        Mailbox mailbox = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession).findMailboxByPath(path);
+        messageSearchIndex.deleteAll(mailboxSession, mailbox);
+        mailboxManager.addListener(path, mailboxRegistration, mailboxSession);
+        try {
+            Iterators.toStream(
+                mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
+                    .findInMailbox(mailbox, MessageRange.all(), MessageMapper.FetchType.Metadata, NO_LIMIT))
+                .map(MailboxMessage::getUid)
+                .forEach(uid -> handleMessageReIndexing(mailboxSession, mailboxRegistration, mailbox, uid));
+            LOGGER.info("Finish to reindex {}", path);
+        } finally {
+            mailboxManager.removeListener(path, mailboxRegistration, mailboxSession);
         }
     }
 
-    private boolean wasNotDeleted(Optional<ImpactingMessageEvent> impactingMessageEvent) {
-        return impactingMessageEvent.map(event -> !event.wasDeleted()).orElse(true);
+    private void handleMessageReIndexing(MailboxSession mailboxSession, MailboxRegistration mailboxRegistration, Mailbox mailbox, MessageUid uid) {
+        try {
+            Optional<ImpactingMessageEvent> impactingMessageEvent = findMostRelevant(mailboxRegistration.getImpactingEvents(uid));
+
+            Optional.of(uid)
+                .filter(x -> !wasDeleted(impactingMessageEvent))
+                .flatMap(Throwing.function(mUid -> fullyReadMessage(mailboxSession, mailbox, mUid)))
+                .map(message -> messageUpdateRegardingEvents(message, impactingMessageEvent))
+                .ifPresent(Throwing.consumer(message -> messageSearchIndex.add(mailboxSession, mailbox, message)));
+        } catch (Exception e) {
+            LOGGER.warn("ReIndexing failed for {} {}", mailbox.generateAssociatedPath(), uid, e);
+        }
     }
 
     private Optional<ImpactingMessageEvent> findMostRelevant(List<ImpactingMessageEvent> messageEvents) {
@@ -157,4 +156,19 @@ public class ReIndexerImpl implements ReIndexer {
         return Lists.reverse(messageEvents).stream().findFirst();
     }
 
+    private boolean wasDeleted(Optional<ImpactingMessageEvent> impactingMessageEvent) {
+        return impactingMessageEvent.map(ImpactingMessageEvent::wasDeleted).orElse(false);
+    }
+
+    private MailboxMessage messageUpdateRegardingEvents(MailboxMessage message, Optional<ImpactingMessageEvent> impactingMessageEvent) {
+        impactingMessageEvent.flatMap(ImpactingMessageEvent::newFlags).ifPresent(message::setFlags);
+        return message;
+    }
+
+    private Optional<MailboxMessage> fullyReadMessage(MailboxSession mailboxSession, Mailbox mailbox, MessageUid mUid) throws MailboxException {
+        return Iterators.toStream(mailboxSessionMapperFactory.getMessageMapper(mailboxSession)
+            .findInMailbox(mailbox, MessageRange.one(mUid), MessageMapper.FetchType.Full, SINGLE_MESSAGE))
+            .findFirst();
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[03/12] james-project git commit: JAMES-2560 Document ICSSanitizer

Posted by bt...@apache.org.
JAMES-2560 Document ICSSanitizer


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/2d3691db
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/2d3691db
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/2d3691db

Branch: refs/heads/master
Commit: 2d3691db87ca6b5260a28b5d5a19dc011517bdee
Parents: d722432
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Oct 11 13:22:15 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:26:53 2018 +0700

----------------------------------------------------------------------
 .../org/apache/james/transport/mailets/ICSSanitizer.java    | 9 +++++++++
 1 file changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2d3691db/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
----------------------------------------------------------------------
diff --git a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
index bdbdb2b..667120b 100644
--- a/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
+++ b/mailet/icalendar/src/main/java/org/apache/james/transport/mailets/ICSSanitizer.java
@@ -40,6 +40,15 @@ import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
 
+/**
+ * Some senders embed 'text/calendar' content as part of Mime bodypart headers with an empty body.
+ *
+ * This mailet duplicate the 'text/calendar' content to the Mime body part.
+ *
+ * Example configuration:
+ *
+ * &lt;mailet match="All" class="ICSSanitizer"/&gt;
+ */
 public class ICSSanitizer extends GenericMailet {
     private static final Logger LOGGER = LoggerFactory.getLogger(ICSSanitizer.class);
     private static final int TEXT_PREFIX_SIZE = 5;


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[07/12] james-project git commit: JAMES-2555 Working with ImpactingMessageEvents should not require casts

Posted by bt...@apache.org.
JAMES-2555 Working with ImpactingMessageEvents should not require casts


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/62e79d1b
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/62e79d1b
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/62e79d1b

Branch: refs/heads/master
Commit: 62e79d1b9ec6009b329d8279710acfa8c3af9ac5
Parents: 2d3691d
Author: Benoit Tellier <bt...@linagora.com>
Authored: Tue Oct 9 08:52:30 2018 +0700
Committer: Benoit Tellier <bt...@linagora.com>
Committed: Fri Oct 12 15:27:13 2018 +0700

----------------------------------------------------------------------
 .../mailbox/tools/indexer/ReIndexerImpl.java    |   9 +-
 .../tools/indexer/events/FlagsMessageEvent.java |  75 ------------
 .../indexer/events/ImpactingMessageEvent.java   | 116 +++++++++++++++++++
 .../indexer/events/MessageDeletedEvent.java     |  65 -----------
 .../registrations/MailboxRegistration.java      |   4 +-
 .../registrations/MailboxRegistrationTest.java  |   4 +-
 6 files changed, 124 insertions(+), 149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
index 28c8421..413f6b7 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/ReIndexerImpl.java
@@ -37,7 +37,6 @@ 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.search.ListeningMessageSearchIndex;
-import org.apache.mailbox.tools.indexer.events.FlagsMessageEvent;
 import org.apache.mailbox.tools.indexer.events.ImpactingEventType;
 import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent;
 import org.apache.mailbox.tools.indexer.registrations.GlobalRegistration;
@@ -137,10 +136,10 @@ public class ReIndexerImpl implements ReIndexer {
         while (iterator.hasNext()) {
             MailboxMessage message = iterator.next();
             ImpactingMessageEvent impactingMessageEvent = findMostRelevant(mailboxRegistration.getImpactingEvents(message.getUid()));
-            if (impactingMessageEvent == null) {
-                messageSearchIndex.add(mailboxSession, mailbox, message);
-            } else if (impactingMessageEvent instanceof FlagsMessageEvent) {
-                message.setFlags(((FlagsMessageEvent) impactingMessageEvent).getFlags());
+
+            impactingMessageEvent.newFlags().ifPresent(message::setFlags);
+
+            if (!impactingMessageEvent.wasDeleted()) {
                 messageSearchIndex.add(mailboxSession, mailbox, message);
             }
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/FlagsMessageEvent.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/FlagsMessageEvent.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/FlagsMessageEvent.java
deleted file mode 100644
index 10d7482..0000000
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/FlagsMessageEvent.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.mailbox.tools.indexer.events;
-
-import javax.mail.Flags;
-
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.MailboxPath;
-
-import com.google.common.base.Objects;
-
-public class FlagsMessageEvent implements ImpactingMessageEvent {
-
-    private final MailboxPath mailboxPath;
-    private final MessageUid uid;
-    private final Flags flags;
-
-    public FlagsMessageEvent(MailboxPath mailboxPath, MessageUid uid, Flags flags) {
-        this.mailboxPath = mailboxPath;
-        this.uid = uid;
-        this.flags = flags;
-    }
-
-    @Override
-    public MessageUid getUid() {
-        return uid;
-    }
-
-    @Override
-    public MailboxPath getMailboxPath() {
-        return mailboxPath;
-    }
-
-    @Override
-    public ImpactingEventType getType() {
-        return ImpactingEventType.FlagsUpdate;
-    }
-
-    public Flags getFlags() {
-        return flags;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        FlagsMessageEvent that = (FlagsMessageEvent) o;
-        return Objects.equal(uid, that.uid) &&
-            Objects.equal(mailboxPath, that.mailboxPath) &&
-            Objects.equal(flags, that.flags);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(uid, mailboxPath, flags);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingMessageEvent.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingMessageEvent.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingMessageEvent.java
index 83764f3..527f463 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingMessageEvent.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/ImpactingMessageEvent.java
@@ -19,10 +19,126 @@
 
 package org.apache.mailbox.tools.indexer.events;
 
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.mail.Flags;
+
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.model.MailboxPath;
 
 public interface ImpactingMessageEvent extends ImpactingEvent {
 
     MessageUid getUid();
 
+    Optional<Flags> newFlags();
+
+    boolean wasDeleted();
+
+    class FlagsMessageEvent implements ImpactingMessageEvent {
+
+        private final MailboxPath mailboxPath;
+        private final MessageUid uid;
+        private final Flags flags;
+
+        public FlagsMessageEvent(MailboxPath mailboxPath, MessageUid uid, Flags flags) {
+            this.mailboxPath = mailboxPath;
+            this.uid = uid;
+            this.flags = flags;
+        }
+
+        @Override
+        public MessageUid getUid() {
+            return uid;
+        }
+
+        @Override
+        public MailboxPath getMailboxPath() {
+            return mailboxPath;
+        }
+
+        @Override
+        public ImpactingEventType getType() {
+            return ImpactingEventType.FlagsUpdate;
+        }
+
+        @Override
+        public Optional<Flags> newFlags() {
+            return Optional.of(flags);
+        }
+
+        @Override
+        public boolean wasDeleted() {
+            return false;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof FlagsMessageEvent) {
+                FlagsMessageEvent that = (FlagsMessageEvent) o;
+
+                return Objects.equals(this.mailboxPath, that.mailboxPath)
+                    && Objects.equals(this.uid, that.uid)
+                    && Objects.equals(this.flags, that.flags);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(mailboxPath, uid, flags);
+        }
+    }
+
+    class MessageDeletedEvent implements ImpactingMessageEvent {
+
+        private final MailboxPath mailboxPath;
+        private final MessageUid uid;
+
+        public MessageDeletedEvent(MailboxPath mailboxPath, MessageUid uid) {
+            this.mailboxPath = mailboxPath;
+            this.uid = uid;
+        }
+
+        @Override
+        public MessageUid getUid() {
+            return uid;
+        }
+
+        @Override
+        public MailboxPath getMailboxPath() {
+            return mailboxPath;
+        }
+
+        @Override
+        public ImpactingEventType getType() {
+            return ImpactingEventType.Deletion;
+        }
+
+        @Override
+        public Optional<Flags> newFlags() {
+            return Optional.empty();
+        }
+
+        @Override
+        public boolean wasDeleted() {
+            return true;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof MessageDeletedEvent) {
+                MessageDeletedEvent that = (MessageDeletedEvent) o;
+
+                return Objects.equals(this.mailboxPath, that.mailboxPath)
+                    && Objects.equals(this.uid, that.uid);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(mailboxPath, uid);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/MessageDeletedEvent.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/MessageDeletedEvent.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/MessageDeletedEvent.java
deleted file mode 100644
index a74178a..0000000
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/events/MessageDeletedEvent.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one   *
- * or more contributor license agreements.  See the NOTICE file *
- * distributed with this work for additional information        *
- * regarding copyright ownership.  The ASF licenses this file   *
- * to you under the Apache License, Version 2.0 (the            *
- * "License"); you may not use this file except in compliance   *
- * with the License.  You may obtain a copy of the License at   *
- *                                                              *
- *   http://www.apache.org/licenses/LICENSE-2.0                 *
- *                                                              *
- * Unless required by applicable law or agreed to in writing,   *
- * software distributed under the License is distributed on an  *
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
- * KIND, either express or implied.  See the License for the    *
- * specific language governing permissions and limitations      *
- * under the License.                                           *
- ****************************************************************/
-
-package org.apache.mailbox.tools.indexer.events;
-
-import org.apache.james.mailbox.MessageUid;
-import org.apache.james.mailbox.model.MailboxPath;
-
-import com.google.common.base.Objects;
-
-public class MessageDeletedEvent implements ImpactingMessageEvent {
-
-    private final MailboxPath mailboxPath;
-    private final MessageUid uid;
-
-    public MessageDeletedEvent(MailboxPath mailboxPath, MessageUid uid) {
-        this.mailboxPath = mailboxPath;
-        this.uid = uid;
-    }
-
-    @Override
-    public MessageUid getUid() {
-        return uid;
-    }
-
-    @Override
-    public MailboxPath getMailboxPath() {
-        return mailboxPath;
-    }
-
-    @Override
-    public ImpactingEventType getType() {
-        return ImpactingEventType.Deletion;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        MessageDeletedEvent that = (MessageDeletedEvent) o;
-        return Objects.equal(uid, that.uid) && Objects.equal(mailboxPath, that.mailboxPath);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(uid, mailboxPath);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistration.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistration.java b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistration.java
index 7c98233..251fde8 100644
--- a/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistration.java
+++ b/mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistration.java
@@ -26,9 +26,9 @@ import org.apache.james.mailbox.MailboxListener;
 import org.apache.james.mailbox.MessageUid;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.UpdatedFlags;
-import org.apache.mailbox.tools.indexer.events.FlagsMessageEvent;
 import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent;
-import org.apache.mailbox.tools.indexer.events.MessageDeletedEvent;
+import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.FlagsMessageEvent;
+import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.MessageDeletedEvent;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;

http://git-wip-us.apache.org/repos/asf/james-project/blob/62e79d1b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
index 743c1f8..33a19b7 100644
--- a/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
+++ b/mailbox/tools/indexer/src/test/java/org/apache/mailbox/tools/indexer/registrations/MailboxRegistrationTest.java
@@ -37,8 +37,8 @@ import org.apache.james.mailbox.store.event.EventFactory;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.MailboxMessage;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.apache.mailbox.tools.indexer.events.FlagsMessageEvent;
-import org.apache.mailbox.tools.indexer.events.MessageDeletedEvent;
+import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.FlagsMessageEvent;
+import org.apache.mailbox.tools.indexer.events.ImpactingMessageEvent.MessageDeletedEvent;
 import org.junit.Before;
 import org.junit.Test;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org