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 2019/11/04 11:23:36 UTC

[james-project] branch master updated (b19b167 -> d9e694d)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from b19b167  JAMES-2927 Avoid un-intentional tumbstones in Cassandra mail repository V2
     new 4b9135a  JAMES-2937 RabbitMQMailQueue should rely on ReactorRabbitMQChannelPool
     new fc2fa87  JAMES-2937 Inject RabbitMQChannelPool
     new 3e6ea8b  JAMES-2937 RabbitMQHealthCheck is testing a non used channel pool
     new 27d3fa4  JAMES-2937 RabbitMQTerminationSubscriber should not initialize his own channelPool
     new 9a115d8  JAMES-2937 RabbitMQExtension should be responsible of channelPool lifecycle
     new 7423ee7  JAMES-2937 Get rid of simple channelPool
     new b505d74  JAMES-2939 Prevent mixed case INBOX creation through JMAP
     new e5e0b1d  JAMES-2939 Revies indent in MailboxManager javaDoc parameters
     new ed279d5  JAMES-2939 Add tests for child mailboxes INBOX sanitizing
     new c664b17  JAMES-2948 Improve error message for WebAdmin's user creation username errors
     new d13fb7d  JAMES-2948 Rename UsersRoutesTests tests
     new b9f55a8  JAMES-2948 Allow 255 characters-usernames to be created
     new f818dce  JAMES-2943 Deleting auto detected domain has no effect
     new eb484d5  JAMES-2943 Throw upon detected domain removal
     new b223e6d  JAMES-2943 Domain routes should fail upon auto-detected domain removal attempts
     new dec068f  JAMES-2943 Document auto-detected domain removal failure
     new 3164753  JAMES-2943 Forbid default domain removal as well
     new 00acb85  JAMES-2937 Dequeue should work after network outage
     new 5df2451  JAMES-2953 Disambiguate WebAdmin's addresses forwards error messages
     new 2848fd2  JAMES-2957 DLP cannot read email multipart body
     new dc182e2  JAMES-2957 Exclude geronimo java mail in the classpath
     new fedf728  JAMES-2957 Tail recursive refactoring "extracting message body"
     new 06d4713  JAMES-2958 Move DomainTest to JUnit 5
     new c55b4af  JAMES-2958 Limit the domain creation to a number of 255 characters
     new e35c5cc  JAMES-2958 Small refactoring in DomainRoutesTest
     new 79ec2fe  JAMES-2958 Small refactoring in DomainMappingRoutesTest
     new fbfdf08  JAMES-2958 Add route tests to check that the domain name can not be longer than 255 characters
     new 66fa921  JAMES-2959 SieveQuotaRoutes should return bad request when invalid body
     new 3678652  Add a build argument for Spring Dockerfile version
     new d9e694d  JAMES-2933 Define mailetdocs-maven-plugin version globally

The 30 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 backends-common/rabbitmq/pom.xml                   |   4 +
 .../backends/rabbitmq/RabbitMQChannelPool.java     |  55 -------
 .../backends/rabbitmq/RabbitMQHealthCheck.java     |   8 +-
 .../rabbitmq/ReactorRabbitMQChannelPool.java       |  46 +++++-
 .../james/backends/rabbitmq/SimpleChannelPool.java | 128 ---------------
 .../james/backends/rabbitmq/RabbitMQExtension.java |  16 +-
 .../backends/rabbitmq/RabbitMQHealthCheckTest.java |   4 +-
 .../rabbitmq/ReactorRabbitMQChannelPoolTest.java   |   8 +-
 .../main/java/org/apache/james/core/Domain.java    |   3 +
 core/src/main/java/org/apache/james/core/User.java |   4 +-
 .../test/java/org/apache/james/core/UserTest.java  |  18 ++-
 .../apache/james/domainlist/api/DomainTest.java    |  44 ++++--
 dockerfiles/run/spring/Dockerfile                  |  16 +-
 .../org/apache/james/mailbox/MailboxManager.java   |  45 ++++--
 ...istsException.java => InboxAlreadyCreated.java} |  24 +--
 .../apache/james/mailbox/MailboxManagerTest.java   |  87 +++++++++++
 .../james/mailbox/events/GroupRegistration.java    |  11 +-
 .../mailbox/events/GroupRegistrationHandler.java   |  17 +-
 .../mailbox/events/KeyRegistrationHandler.java     |  10 +-
 .../james/mailbox/events/RabbitMQEventBus.java     |  25 +--
 .../james/mailbox/events/RabbitMQEventBusTest.java |  43 ++---
 .../james/mailbox/store/StoreMailboxManager.java   |  76 ++++++---
 mailet/pom.xml                                     |   9 --
 .../org/apache/james/imap/scripts/StringArgs.test  |   6 +-
 .../rabbitmq/host/RabbitMQEventBusHostSystem.java  |  10 +-
 pom.xml                                            |   5 +
 .../modules/DistributedTaskManagerModule.java      |   7 +
 .../apache/james/jmap/draft/JMAPCommonModule.java  |  10 ++
 .../james/modules/rabbitmq/RabbitMQModule.java     |  17 +-
 .../api/AutoDetectedDomainRemovalException.java}   |   8 +-
 .../domainlist/cassandra/CassandraDomainList.java  |   2 +-
 .../apache/james/domainlist/xml/XMLDomainList.java |   2 +-
 .../apache/james/domainlist/jpa/JPADomainList.java |   2 +-
 .../james/domainlist/lib/AbstractDomainList.java   |  63 ++++++--
 .../lib/AbstractDomainListPrivateMethodsTest.java  |  41 ++++-
 .../james/domainlist/memory/MemoryDomainList.java  |   2 +-
 server/mailet/dkim/pom.xml                         |   4 +
 .../transport/mailets/DlpIntegrationTest.java      |  47 +++++-
 .../eml/dlp_read_mail_with_attachment.eml          | 139 ++++++++++++++++
 .../transport/matchers/dlp/DlpDomainRules.java     |  12 +-
 .../integration/SetMailboxesMethodTest.java        |  32 ++++
 .../methods/SetMailboxesCreationProcessor.java     |  14 +-
 .../apache/james/jmap/draft/send/MailSpool.java    |  10 +-
 .../james/jmap/draft/model/MailboxFactoryTest.java |  13 +-
 .../james/jmap/draft/send/MailSpoolTest.java       |   1 +
 .../james/jmap/draft/utils/MailboxUtilsTest.java   |   5 +-
 server/protocols/webadmin/webadmin-data/pom.xml    |   9 ++
 .../james/webadmin/routes/DomainsRoutes.java       |  17 +-
 .../james/webadmin/routes/ForwardRoutes.java       |  17 +-
 .../james/webadmin/routes/SieveQuotaRoutes.java    |  56 +++----
 .../apache/james/webadmin/routes/UserRoutes.java   |  16 ++
 .../apache/james/webadmin/service/UserService.java |  16 +-
 .../webadmin/routes/DomainMappingsRoutesTest.java  |  99 +++++++++---
 .../james/webadmin/routes/DomainsRoutesTest.java   | 174 ++++++++++++---------
 .../james/webadmin/routes/ForwardRoutesTest.java   |  10 +-
 .../webadmin/routes/SieveQuotaRoutesTest.java      |  31 +++-
 .../james/webadmin/routes/UsersRoutesTest.java     |  46 ++++--
 .../org/apache/james/queue/rabbitmq/Dequeuer.java  |  10 +-
 .../org/apache/james/queue/rabbitmq/Enqueuer.java  |  36 +++--
 .../apache/james/queue/rabbitmq/RabbitClient.java  |  72 ---------
 .../queue/rabbitmq/RabbitMQMailQueueFactory.java   |  46 ++++--
 .../RabbitMQMailQueueConfigurationChangeTest.java  |   8 +-
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      | 128 ++++++++-------
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     |   7 +-
 .../distributed/RabbitMQTerminationSubscriber.java |  16 +-
 .../distributed/RabbitMQWorkQueue.java             |  34 ++--
 .../distributed/RabbitMQWorkQueueSupplier.scala    |   5 +-
 .../distributed/DistributedTaskManagerTest.java    |  10 +-
 .../RabbitMQTerminationSubscriberTest.java         |   3 +-
 .../distributed/RabbitMQWorkQueueTest.java         |   6 +-
 server/task/task-memory/pom.xml                    |   4 +
 .../main/java/org/apache/james/task/WorkQueue.java |   8 +-
 .../eventsourcing/EventSourcingTaskManager.scala   |   9 +-
 src/site/markdown/server/manage-webadmin.md        |   3 +
 74 files changed, 1254 insertions(+), 795 deletions(-)
 delete mode 100644 backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQChannelPool.java
 delete mode 100644 backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/SimpleChannelPool.java
 copy mailbox/api/src/main/java/org/apache/james/mailbox/exception/{MailboxExistsException.java => InboxAlreadyCreated.java} (68%)
 copy server/data/data-api/src/main/java/org/apache/james/{dlp/api/DLPConfigurationLoader.java => domainlist/api/AutoDetectedDomainRemovalException.java} (82%)
 create mode 100644 server/mailet/integration-testing/src/test/resources/eml/dlp_read_mail_with_attachment.eml
 delete mode 100644 server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java


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


[james-project] 14/30: JAMES-2943 Throw upon detected domain removal

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit eb484d5663833e427fcc398f154a13f3862bc44c
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 09:15:52 2019 +0700

    JAMES-2943 Throw upon detected domain removal
---
 .../api/AutoDetectedDomainRemovalException.java    | 28 +++++++++++
 .../domainlist/cassandra/CassandraDomainList.java  |  2 +-
 .../apache/james/domainlist/xml/XMLDomainList.java |  2 +-
 .../apache/james/domainlist/jpa/JPADomainList.java |  2 +-
 .../james/domainlist/lib/AbstractDomainList.java   | 58 ++++++++++++++++++----
 .../lib/AbstractDomainListPrivateMethodsTest.java  |  9 ++--
 .../james/domainlist/memory/MemoryDomainList.java  |  2 +-
 7 files changed, 82 insertions(+), 21 deletions(-)

diff --git a/server/data/data-api/src/main/java/org/apache/james/domainlist/api/AutoDetectedDomainRemovalException.java b/server/data/data-api/src/main/java/org/apache/james/domainlist/api/AutoDetectedDomainRemovalException.java
new file mode 100644
index 0000000..85f129c
--- /dev/null
+++ b/server/data/data-api/src/main/java/org/apache/james/domainlist/api/AutoDetectedDomainRemovalException.java
@@ -0,0 +1,28 @@
+/****************************************************************
+ * 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.domainlist.api;
+
+import org.apache.james.core.Domain;
+
+public class AutoDetectedDomainRemovalException extends DomainListException {
+    public AutoDetectedDomainRemovalException(Domain domain) {
+        super(domain.asString() + " is autodetected and cannot be removed");
+    }
+}
diff --git a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
index 4014e39..4eb0c6a 100644
--- a/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
+++ b/server/data/data-cassandra/src/main/java/org/apache/james/domainlist/cassandra/CassandraDomainList.java
@@ -108,7 +108,7 @@ public class CassandraDomainList extends AbstractDomainList {
     }
 
     @Override
-    public void removeDomain(Domain domain) throws DomainListException {
+    public void doRemoveDomain(Domain domain) throws DomainListException {
         boolean executed = executor.executeReturnApplied(removeStatement.bind()
             .setString(DOMAIN, domain.asString()))
             .block();
diff --git a/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java b/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
index 27353c0..89c0724 100644
--- a/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
+++ b/server/data/data-file/src/main/java/org/apache/james/domainlist/xml/XMLDomainList.java
@@ -72,7 +72,7 @@ public class XMLDomainList extends AbstractDomainList implements Configurable {
     }
 
     @Override
-    public void removeDomain(Domain domain) throws DomainListException {
+    public void doRemoveDomain(Domain domain) throws DomainListException {
         if (isConfigured) {
             throw new DomainListException("Read-Only DomainList implementation");
         }
diff --git a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
index 2d74392..40cd999 100644
--- a/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
+++ b/server/data/data-jpa/src/main/java/org/apache/james/domainlist/jpa/JPADomainList.java
@@ -143,7 +143,7 @@ public class JPADomainList extends AbstractDomainList {
     }
 
     @Override
-    public void removeDomain(Domain domain) throws DomainListException {
+    public void doRemoveDomain(Domain domain) throws DomainListException {
         EntityManager entityManager = entityManagerFactory.createEntityManager();
         final EntityTransaction transaction = entityManager.getTransaction();
         try {
diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
index 30b4f75..a723829 100644
--- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
+++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
@@ -30,6 +30,7 @@ import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.configuration2.tree.ImmutableNode;
 import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.domainlist.api.AutoDetectedDomainRemovalException;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.lifecycle.api.Configurable;
@@ -41,7 +42,9 @@ import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
 
 /**
  * All implementations of the DomainList interface should extends this abstract
@@ -51,6 +54,12 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDomainList.class);
 
+    enum DomainType {
+        Internal,
+        Detected,
+        DetectedIp
+    }
+
     public static final String CONFIGURE_AUTODETECT = "autodetect";
     public static final String CONFIGURE_AUTODETECT_IP = "autodetectIP";
     public static final String CONFIGURE_DEFAULT_DOMAIN = "defaultDomain";
@@ -155,17 +164,9 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
 
     @Override
     public ImmutableList<Domain> getDomains() throws DomainListException {
-        List<Domain> domains = getDomainListInternal();
-        ImmutableList<Domain> detectedDomains = detectDomains();
-
-        ImmutableList<Domain> domainsWithoutIp = ImmutableList.<Domain>builder()
-            .addAll(domains)
-            .addAll(detectedDomains)
-            .build();
-        ImmutableSet<Domain> allDomains = ImmutableSet.<Domain>builder()
-            .addAll(domainsWithoutIp)
-            .addAll(detectIps(domainsWithoutIp))
-            .build();
+        ImmutableSet<Domain> allDomains = getDomainsWithType().values()
+            .stream()
+            .collect(Guavate.toImmutableSet());
 
         if (LOGGER.isDebugEnabled()) {
             for (Domain domain : allDomains) {
@@ -176,6 +177,23 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
         return ImmutableList.copyOf(allDomains);
     }
 
+    private Multimap<DomainType, Domain> getDomainsWithType() throws DomainListException {
+        List<Domain> domains = getDomainListInternal();
+        ImmutableList<Domain> detectedDomains = detectDomains();
+
+        ImmutableList<Domain> domainsWithoutIp = ImmutableList.<Domain>builder()
+            .addAll(domains)
+            .addAll(detectedDomains)
+            .build();
+        ImmutableList<Domain> ips = detectIps(domainsWithoutIp);
+
+        return ImmutableMultimap.<DomainType, Domain>builder()
+            .putAll(DomainType.Internal, domains)
+            .putAll(DomainType.Detected, detectedDomains)
+            .putAll(DomainType.DetectedIp, ips)
+            .build();
+    }
+
     private ImmutableList<Domain> detectIps(Collection<Domain> domains) {
         if (autoDetectIP) {
             return getDomainsIpStream(domains, dns, LOGGER)
@@ -250,6 +268,22 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
         this.autoDetectIP = autoDetectIP;
     }
 
+    @Override
+    public void removeDomain(Domain domain) throws DomainListException {
+        if (isAutoDetected(domain)) {
+            throw new AutoDetectedDomainRemovalException(domain);
+        }
+
+        doRemoveDomain(domain);
+    }
+
+    private boolean isAutoDetected(Domain domain) throws DomainListException {
+        Multimap<DomainType, Domain> domainsWithType = getDomainsWithType();
+
+        return domainsWithType.get(DomainType.Detected).contains(domain)
+            || domainsWithType.get(DomainType.DetectedIp).contains(domain);
+    }
+
     /**
      * Return domainList
      * 
@@ -259,4 +293,6 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
 
     protected abstract boolean containsDomainInternal(Domain domain) throws DomainListException;
 
+    protected abstract void doRemoveDomain(Domain domain) throws DomainListException;
+
 }
diff --git a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
index e8e8060..2100ec1 100644
--- a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
@@ -31,9 +31,8 @@ import java.util.List;
 
 import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.domainlist.api.DomainListException;
+import org.apache.james.domainlist.api.AutoDetectedDomainRemovalException;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -320,7 +319,6 @@ public class AbstractDomainListPrivateMethodsTest {
         assertThat(domainList.containsDomain(Domain.of(envDomain))).isTrue();
     }
 
-    @Ignore("JAMES-2943 Removing an auto-detected domain leads to a noop")
     @Test
     public void removeDomainShouldThrowWhenRemovingAutoDetectedDomains() throws Exception {
         domainList.configure(DomainListConfiguration.builder()
@@ -332,10 +330,9 @@ public class AbstractDomainListPrivateMethodsTest {
         when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
 
         assertThatThrownBy(() -> domainList.removeDomain(Domain.of(detected)))
-            .isInstanceOf(DomainListException.class);
+            .isInstanceOf(AutoDetectedDomainRemovalException.class);
     }
 
-    @Ignore("JAMES-2943 Removing an auto-detected ip leads to a noop")
     @Test
     public void removeDomainShouldThrowWhenRemovingAutoDetectedIps() throws Exception {
         String detected = "detected.tld";
@@ -347,7 +344,7 @@ public class AbstractDomainListPrivateMethodsTest {
         when(dnsService.getAllByName(detected)).thenReturn(ImmutableList.of(detectedAddress));
 
         assertThatThrownBy(() -> domainList.removeDomain(Domain.of(detectedIp)))
-            .isInstanceOf(DomainListException.class);
+            .isInstanceOf(AutoDetectedDomainRemovalException.class);
     }
 
     @Test
diff --git a/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java b/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
index c6d89c3..1c8d679 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/domainlist/memory/MemoryDomainList.java
@@ -60,7 +60,7 @@ public class MemoryDomainList extends AbstractDomainList {
     }
 
     @Override
-    public void removeDomain(Domain domain) throws DomainListException {
+    public void doRemoveDomain(Domain domain) throws DomainListException {
         if (!domains.remove(domain)) {
             throw new DomainListException(domain.name() + " was not found");
         }


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


[james-project] 26/30: JAMES-2958 Small refactoring in DomainMappingRoutesTest

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 79ec2fe1dcc2016b7b0949584d8624c022f02022
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 1 15:04:11 2019 +0700

    JAMES-2958 Small refactoring in DomainMappingRoutesTest
---
 .../webadmin/routes/DomainMappingsRoutesTest.java  | 46 ++++++++++------------
 1 file changed, 21 insertions(+), 25 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
index c2c2bce..376a1b1 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
@@ -28,7 +28,6 @@ import static org.apache.james.webadmin.routes.DomainMappingsRoutes.DOMAIN_MAPPI
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.entry;
 import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.Matchers.isEmptyString;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
@@ -108,8 +107,7 @@ class DomainMappingsRoutesTest {
             .when()
                 .put("from.com")
             .then()
-                .statusCode(HttpStatus.NO_CONTENT_204)
-                .body(isEmptyString());
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -123,8 +121,7 @@ class DomainMappingsRoutesTest {
             .when()
                 .put("from.com")
             .then()
-                .statusCode(HttpStatus.NO_CONTENT_204)
-                .body(isEmptyString());
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -219,8 +216,7 @@ class DomainMappingsRoutesTest {
             .when()
                 .delete("from.com")
             .then()
-                .statusCode(HttpStatus.NO_CONTENT_204)
-                .body(isEmptyString());
+                .statusCode(HttpStatus.NO_CONTENT_204);
         }
 
         @Test
@@ -237,7 +233,7 @@ class DomainMappingsRoutesTest {
             .when()
                 .delete("from.com")
             .then()
-                .body(isEmptyString());
+                .statusCode(HttpStatus.NO_CONTENT_204);
 
             assertThat(recipientRewriteTable.getAllMappings()).isEmpty();
         }
@@ -308,14 +304,14 @@ class DomainMappingsRoutesTest {
             when(recipientRewriteTable.getStoredMappings(any())).thenReturn(mappings);
 
             List<String> body =
-            when()
-                .get(domain)
-            .then()
-                .contentType(ContentType.JSON)
-                .statusCode(HttpStatus.OK_200)
-                .extract()
-                .jsonPath()
-                .getList(".");
+                when()
+                    .get(domain)
+                .then()
+                    .contentType(ContentType.JSON)
+                    .statusCode(HttpStatus.OK_200)
+                    .extract()
+                    .jsonPath()
+                    .getList(".");
 
             assertThat(body).contains(aliasDomain);
         }
@@ -390,15 +386,15 @@ class DomainMappingsRoutesTest {
         @Test
         void addSpecificDomainMappingWithInvalidDomainInPath() {
             Map<String, Object> errors =
-            when()
-                .get("abc@domain.com")
-            .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400)
-                .contentType(ContentType.JSON)
-            .extract()
-                .body()
-                .jsonPath()
-                .getMap(".");
+                when()
+                    .get("abc@domain.com")
+                .then()
+                    .statusCode(HttpStatus.BAD_REQUEST_400)
+                    .contentType(ContentType.JSON)
+                .extract()
+                    .body()
+                    .jsonPath()
+                    .getMap(".");
 
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)


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


[james-project] 29/30: Add a build argument for Spring Dockerfile version

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 367865246f455bb5fc33670f5f084cc93b604522
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 4 10:54:14 2019 +0700

    Add a build argument for Spring Dockerfile version
    
    Upon a release we need to change simultaneously maven version and the one
    within Spring dockerfile (which relies on hard-coded version positionned
    by the assembly plugin). This results in broken build post-release as well
    as difficulties into building a specific tag when forgotten.
    
    With this changeset we can specify a build argument upon Spring docker
    image creation from CI environment, in order to use the right version
    without needing code changes. As version can be detected from build files,
    this means that we will avoid that pitfall.
---
 dockerfiles/run/spring/Dockerfile | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/dockerfiles/run/spring/Dockerfile b/dockerfiles/run/spring/Dockerfile
index c964c2d..db224ac 100644
--- a/dockerfiles/run/spring/Dockerfile
+++ b/dockerfiles/run/spring/Dockerfile
@@ -17,8 +17,10 @@ EXPOSE 25 110 143 465 587 993 4000
 
 WORKDIR /root
 
+ARG VERSION=3.5.0-SNAPSHOT
+
 # Get data we need to run James : build results and configuration
-ADD destination/james-server-app-3.5.0-SNAPSHOT-app.zip /root/james-server-app-3.5.0-SNAPSHOT-app.zip
+ADD "destination/james-server-app-$VERSION-app.zip" "/root/james-server-app-$VERSION-app.zip"
 ADD destination/conf /root/conf
 ADD destination/glowroot/plugins /root/glowroot/plugins
 ADD destination/glowroot/glowroot.jar /root/glowroot/glowroot.jar
@@ -32,16 +34,16 @@ VOLUME /root/conf
 VOLUME /root/glowroot/plugins
 
 # Unzip build result
-RUN unzip james-server-app-3.5.0-SNAPSHOT-app.zip
+RUN unzip "james-server-app-$VERSION-app.zip"
 
 # Copy configuration.
 # Warning : we want to use the wrapper.conf file we just compiled.
-RUN cp james-server-app-3.5.0-SNAPSHOT/conf/wrapper.conf .
-RUN rm -r james-server-app-3.5.0-SNAPSHOT/conf/*
-RUN cp -r conf/* james-server-app-3.5.0-SNAPSHOT/conf
-RUN cp wrapper.conf james-server-app-3.5.0-SNAPSHOT/conf
+RUN cp "james-server-app-$VERSION/conf/wrapper.conf" .
+RUN rm -r "james-server-app-$VERSION/conf" && mkdir "james-server-app-$VERSION/conf"
+RUN cp -r conf/* "james-server-app-$VERSION/conf"
+RUN cp wrapper.conf "james-server-app-$VERSION/conf"
 
 ENV PATH "$PATH:/root/glowroot/lib"
 
-WORKDIR /root/james-server-app-3.5.0-SNAPSHOT/bin
+WORKDIR "/root/james-server-app-$VERSION/bin"
 ENTRYPOINT /root/run_james.sh
\ No newline at end of file


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


[james-project] 23/30: JAMES-2958 Move DomainTest to JUnit 5

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 06d4713f09b7282c3e69b7419650e13559541f24
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 1 14:04:50 2019 +0700

    JAMES-2958 Move DomainTest to JUnit 5
---
 .../apache/james/domainlist/api/DomainTest.java    | 32 +++++++++++-----------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
index 5073d02..8230223 100644
--- a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
+++ b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
@@ -23,81 +23,81 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.core.Domain;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-public class DomainTest {
+class DomainTest {
 
     @Test
-    public void shouldRespectBeanContract() {
+    void shouldRespectBeanContract() {
         EqualsVerifier.forClass(Domain.class)
             .withIgnoredFields("domainName")
             .verify();
     }
 
     @Test
-    public void shouldBeCaseInsensitive() {
+    void shouldBeCaseInsensitive() {
         assertThat(Domain.of("Domain")).isEqualTo(Domain.of("domain"));
     }
 
     @Test
-    public void shouldRemoveBrackets() {
+    void shouldRemoveBrackets() {
         assertThat(Domain.of("[domain]")).isEqualTo(Domain.of("domain"));
     }
 
     @Test
-    public void openBracketWithTextShouldNotBeRemoved() {
+    void openBracketWithTextShouldNotBeRemoved() {
         assertThat(Domain.of("[domain")).isEqualTo(Domain.of("[Domain"));
     }
 
     @Test
-    public void singleOpenBracketShouldNotBeRemoved() {
+    void singleOpenBracketShouldNotBeRemoved() {
         assertThat(Domain.of("[")).isEqualTo(Domain.of("["));
     }
 
     @Test
-    public void singleClosingBracketShouldNotBeRemoved() {
+    void singleClosingBracketShouldNotBeRemoved() {
         assertThat(Domain.of("]")).isEqualTo(Domain.of("]"));
     }
 
     @Test
-    public void closeBracketWithTextShouldNotBeRemoved() {
+    void closeBracketWithTextShouldNotBeRemoved() {
         assertThat(Domain.of("aaa]")).isEqualTo(Domain.of("aaa]"));
     }
 
     @Test
-    public void bracketSurroundedWithTextShouldNotBeRemoved() {
+    void bracketSurroundedWithTextShouldNotBeRemoved() {
         assertThat(Domain.of("a[aaa]a")).isEqualTo(Domain.of("a[aaa]a"));
     }
 
     @Test
-    public void bracketWithTextSuffixShouldNotBeRemoved() {
+    void bracketWithTextSuffixShouldNotBeRemoved() {
         assertThat(Domain.of("[aaa]a")).isEqualTo(Domain.of("[aaa]a"));
     }
 
     @Test
-    public void bracketWithTextPrefixShouldNotBeRemoved() {
+    void bracketWithTextPrefixShouldNotBeRemoved() {
         assertThat(Domain.of("a[aaa]")).isEqualTo(Domain.of("a[aaa]"));
     }
 
     @Test
-    public void singleBracketShouldNotBeRemoved() {
+    void singleBracketShouldNotBeRemoved() {
         assertThat(Domain.of("[]")).isEqualTo(Domain.of("[]"));
     }
 
     @Test
-    public void shouldThrowWhenDomainContainAtSymbol() {
+    void shouldThrowWhenDomainContainAtSymbol() {
         assertThatThrownBy(() -> Domain.of("Dom@in")).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void shouldThrowWhenDomainIsEmpty() {
+    void shouldThrowWhenDomainIsEmpty() {
         assertThatThrownBy(() -> Domain.of("")).isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
-    public void shouldThrowOnNullArgument() {
+    void shouldThrowOnNullArgument() {
         assertThatThrownBy(() -> Domain.of(null)).isInstanceOf(NullPointerException.class);
     }
 


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


[james-project] 09/30: JAMES-2939 Add tests for child mailboxes INBOX sanitizing

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit ed279d508974f8cce024ef20d6d1a94c74800a88
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 4 10:14:19 2019 +0700

    JAMES-2939 Add tests for child mailboxes INBOX sanitizing
---
 .../apache/james/mailbox/MailboxManagerTest.java   | 26 +++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index eacf95e..7d2863d 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -51,7 +51,6 @@ import org.apache.james.mailbox.exception.AnnotationException;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
 import org.apache.james.mailbox.exception.InboxAlreadyCreated;
 import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
@@ -86,6 +85,7 @@ import org.mockito.ArgumentCaptor;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+
 import reactor.core.publisher.Mono;
 
 /**
@@ -225,6 +225,30 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
             assertThatThrownBy(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx"), session))
                 .isInstanceOf(InboxAlreadyCreated.class);
         }
+
+        @Test
+        void creatingMixedCaseINBOXShouldCreateItAsINBOXUponChildMailboxCreation() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx.submailbox"), session);
+            MessageManager retrievedMailbox = mailboxManager.getMailbox(MailboxPath.inbox(session), session);
+
+            assertThat(mailboxManager.hasInbox(session)).isTrue();
+        }
+
+        @Test
+        void creatingMixedCaseINBOXChildShouldNormalizeChildPath() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            MailboxPath childPath = MailboxPath.forUser(USER_1, "iNbOx.submailbox");
+            Optional<MailboxId> mailboxId = mailboxManager.createMailbox(childPath, session);
+            MessageManager retrievedMailbox = mailboxManager.getMailbox(childPath, session);
+
+            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
+        }
     }
 
     @Nested


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


[james-project] 20/30: JAMES-2957 DLP cannot read email multipart body

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 2848fd26fbe55590ce9db2990c97caa2f10b383a
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Nov 1 11:00:57 2019 +0700

    JAMES-2957 DLP cannot read email multipart body
    
    Because of the miss used `geronimo.javamail` presenting in the classpath
---
 .../transport/mailets/DlpIntegrationTest.java      |  50 +++++++-
 .../eml/dlp_read_mail_with_attachment.eml          | 139 +++++++++++++++++++++
 2 files changed, 185 insertions(+), 4 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
index 413bde7..aa49e1d 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
@@ -27,6 +27,7 @@ import static org.apache.james.mailets.configuration.Constants.PASSWORD;
 import static org.apache.james.mailets.configuration.Constants.RECIPIENT;
 import static org.apache.james.mailets.configuration.Constants.RECIPIENT2;
 import static org.apache.james.mailets.configuration.Constants.awaitAtMostOneMinute;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.MemoryJamesServerMain;
 import org.apache.james.core.builder.MimeMessageBuilder;
@@ -35,9 +36,10 @@ import org.apache.james.mailets.configuration.MailetConfiguration;
 import org.apache.james.mailets.configuration.MailetContainer;
 import org.apache.james.mailets.configuration.ProcessorConfiguration;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
-import org.apache.james.transport.matchers.All;
 import org.apache.james.transport.matchers.dlp.Dlp;
+import org.apache.james.util.ClassLoaderUtils;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.IMAPMessageReader;
 import org.apache.james.utils.SMTPMessageSender;
@@ -46,6 +48,7 @@ import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.mailet.base.test.FakeMail;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.After;
+import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -74,9 +77,7 @@ public class DlpIntegrationTest {
                 ProcessorConfiguration.transport()
                     .addMailet(MailetConfiguration.BCC_STRIPPER)
                     .addMailet(dlpMailet)
-                    .addMailet(MailetConfiguration.builder()
-                        .matcher(All.class)
-                        .mailet(Null.class)));
+                    .addMailet(MailetConfiguration.LOCAL_DELIVERY));
 
         jamesServer = TemporaryJamesServer.builder()
             .withBase(Modules.combine(MemoryJamesServerMain.SMTP_AND_IMAP_MODULE, MemoryJamesServerMain.WEBADMIN_TESTING))
@@ -240,6 +241,47 @@ public class DlpIntegrationTest {
         awaitAtMostOneMinute.until(() -> containsExactlyOneMail(repositoryUrl));
     }
 
+    @Ignore("Dlp got an exception of parsing email body containing attachment with a part of error message: " +
+        "javax.activation.UnsupportedDataTypeException: Unknown image type image/jpeg; name=\"linux.jpeg\"")
+    @Test
+    public void dlpShouldBeAbleToReadMailContentWithAttachments() throws Exception {
+        createJamesServer(MailetConfiguration.builder()
+            .matcher(Dlp.class)
+            .mailet(ToSenderDomainRepository.class)
+            .addProperty(ToSenderDomainRepository.URL_PREFIX, REPOSITORY_PREFIX)
+            .addProperty(ToSenderDomainRepository.ALLOW_REPOSITORY_CREATION, "false"));
+
+        MailRepositoryUrl repositoryUrl = MailRepositoryUrl.from(REPOSITORY_PREFIX + DEFAULT_DOMAIN);
+        given()
+            .spec(specification)
+            .param("protocol", repositoryUrl.getProtocol().getValue())
+            .put("/mailRepositories/" + repositoryUrl.getPath().urlEncoded());
+
+        given()
+            .spec(specification)
+            .body("{\"rules\":[{" +
+                "  \"id\": \"1\"," +
+                "  \"expression\": \"matchMe\"," +
+                "  \"explanation\": \"\"," +
+                "  \"targetsSender\": false," +
+                "  \"targetsRecipients\": false," +
+                "  \"targetsContent\": true" +
+                "}]}")
+            .put("/dlp/rules/" + DEFAULT_DOMAIN);
+
+        messageSender.connect(LOCALHOST_IP, jamesServer.getProbe(SmtpGuiceProbe.class).getSmtpAuthRequiredPort())
+            .authenticate(FROM, PASSWORD)
+            .sendMessageWithHeaders(FROM, RECIPIENT,
+                ClassLoaderUtils.getSystemResourceAsString("eml/dlp_read_mail_with_attachment.eml"));
+
+        imapMessageReader.connect(LOCALHOST_IP, jamesServer.getProbe(ImapGuiceProbe.class).getImapPort())
+            .login(RECIPIENT, PASSWORD)
+            .select(IMAPMessageReader.INBOX)
+            .awaitMessage(awaitAtMostOneMinute);
+        assertThat(imapMessageReader.readFirstMessage()).containsSequence("dlp subject");
+
+    }
+
     private boolean containsExactlyOneMail(MailRepositoryUrl repositoryUrl) {
         try {
             return given()
diff --git a/server/mailet/integration-testing/src/test/resources/eml/dlp_read_mail_with_attachment.eml b/server/mailet/integration-testing/src/test/resources/eml/dlp_read_mail_with_attachment.eml
new file mode 100644
index 0000000..6abfd39
--- /dev/null
+++ b/server/mailet/integration-testing/src/test/resources/eml/dlp_read_mail_with_attachment.eml
@@ -0,0 +1,139 @@
+To: user2@james.org
+From: user@james.org
+Subject: dlp subject
+Message-ID: <df...@open-paas.org>
+Date: Fri, 1 Nov 2019 10:21:39 +0700
+User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101
+ Thunderbird/60.2.1
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+ boundary="------------589DDD2515E3B3CC74D74E40"
+Content-Language: en-US
+
+This is a multi-part message in MIME format.
+--------------589DDD2515E3B3CC74D74E40
+Content-Type: text/plain; charset=utf-8; format=flowed
+Content-Transfer-Encoding: 7bit
+
+matchAnother
+
+
+
+--------------589DDD2515E3B3CC74D74E40
+Content-Type: image/jpeg;
+ name="linux.jpeg"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+ filename="linux.jpeg"
+
+/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMSEhIQEBIVFRUXFRcYFhgVFxUVGBUQFRgW
+FhcVFxUdHSggGBonGxUWITIlJSkrLi4uFx8/ODMsNygtLisBCgoKDg0OGhAQGjMlICY4Mi83
+NSs3LTcyMC8wLTAtLS0tLy0tNS0vLzUtLS0tLS0tLzYvKy0tLS0tLy0tLS0tLf/AABEIAOEA
+4QMBIgACEQEDEQH/xAAcAAEAAgIDAQAAAAAAAAAAAAAAce
+BgcEBQIDCAH/xABDEAABAwICBwUE
+CAMGBwAAAAABAAIDBBEFIQYHEjFBUWETInGBkTJSobEUI0JicoLB0QiS8BUzotLh8SRDY3OD
+ssL/xAAaAQEAAgMBAAAAAAAAAAAAAAAABAUBAgMG/8QALBEBAAIBAwIEBQUBAQAAAAAAAAEC
+AwQRIQUSEzFBUSIzgZGhYXGx0fBDMv/aAAwDAQACEQMRAD8AvFERAREQEREBERAREQEREBV/
+pJrPjildSUELqydtw7YIEUbhlZ8m7eCFia0tK3hww2lkLHubtVEjfaihO5jTwe7PPgLqJ4OI
+4WCOJoa0cuJ5k8SgkDcWxqe5NRS0o4BkZlcByJcbX8Fk08mNRi7a6mqD7ssJjv8AmYcj5LCp
+q3qtrTVqDMwrWGGytpsUgNHK42Y8kOglP3ZdwO7I8+CnQKr7E6WKrhfTztDmOHHe08HDkQo1
+qq0ykpqp+B1zy7Ye5lPI43yHsxk8i3NvjbkguZERAREQEREBERAREQEREBERAREQEREBERAR
+EQFh4viDKeCaok9iKN73fhY0uIHM5LMVda+sQMWEyMBzmkjj67Id2h/9APNBTVLiz5nyVMpv
+JM90jvPcB0AAHktvTVvVQXDqk7IHJbemrUZTimreq2lNWqD01atrTVqCcU1b1VM6f1t8Tnli
+cQWujsRkRJHHGLjqHNUyxPSFtPEXk3duaObuHkqpnmL3Oe43c4kk8yTcow9haD479Ooaary2
+nxjbtwmb3Xi3AbQNuhC3qqf+HOuL6CeE7o5zbwe0H9FbCAiIgIiICIiAiIgIiICIiAiIgIiI
+CIiAiIgKvNbOCitdQ07yQwPkkkAyLmsa1oF+Fy4eV1YahGsev7FrntNntppXN42s6Nu1bkC4
+HyQU5p3oKKSP6XSXDG2EjCS6zSbB4JztfeoPHWDjkVdmi2JMqjNh8kjpw6Fzmuk2S4syZIxx
+aAD7bSMuJ5KisRpTFLLCd7HuZ47JIv8ABBt6Ss2nBrLucdwaC4nwAzWzxCSpp2bTqaVo957S
+Gjr/AL2Voar9FYqOkbVSgCWVge97v+XHvDB7uWZ5nwCkcOLUtQ4wB4cXA2a9pAe3js7Qs7yQ
+3eYayrfK7akNz8AOQC6FL9ZujAoKu0QtDK3bj+6b2cy/GxsfBwUQQXp/DVL3a1nWM/AhXeqX
+/hrj+prXf9Rg6+ySroQEREBERAREQEREBERAREQEREBERAREQEREBVXrZqmCtoYJHbLKmGop
+5Da5aycBof8AlkEbr/dVqKC1NQyerBnaC0OLAOTQSBnv32JUTV6uNPEcbzPCRp9PObf2jlVG
+rLDJ4MWaJ2OjELJhK4ghhOzsiztzgXFpC1+lug1ZLVVM8MN43SOc3vC5HTxXoX+z4mG7GAHn
+mfmuuRir83Uc1fKIj7z/AE6Vw459/wDfdAtalY+HC6Yx5B00LH/hEb3bJ5d9jVVs+lMpaz32
+SMdGRvD2uG7xFwehKvPSDB2VMElPJfYeBcDKxBuHDkQc1BcA1ZQQ1LZ6id8kcbg5jNm13DMb
+Z5A55b7LrpusYcnw5Phn8ff+2t9LeOacwxdfluzoSbbRMh62sza8r7PwVOKwtclXUT1faPhe
+yCNuxESMiL3c8kZAuPDk0KvVaVvW8b1neEa1ZrO0w9C/w3R2o6p3OcfBgCt5U7/DZJelrG33
+TNNuQLP9FcS2YEREBERAREQEREBERAREQEREBERAREQERRDT3WDS4Wy0h7Sci7IWnvHk53uN
+6nyQZen2lceG0j6h5BeQWwsP25iMhb3RvPQKqNXOkzqpmzUvu/b2S87+0fdzHnxNwfBVlpbp
+RUYjOaipdc7mMHsxs91o+Z4q0dWmjYFCS9vfl79uOwMmjpln4qFr8Hi4Z2jeY5/30StJl8PJ
+G87RPCz4cT+xKCHDInn1XeJ2ncVFKatqYwG9ydo3CYWe0cg8fqspuMS8KIA/93u/uvLZb2tH
+F4+vmsL4Np4j7N5OQd2a0tdUMYbOe0HkSL+m9GwVE+Uj9lvuQ3aPzSbz5WWwpNHWNFhss/CM
+z4niueDQZc3NImf18o+8kZKYv/Uo5UBkgLSA5pFiCDYg9CqE0ow9tPVzws9lr+70a4BwHkDb
+yVz6bYlJSU754mhzmuA717AE2vYKiaupdK90khu5xLnHmTmvRdM0ebT2t38Qj67U4stYivmt
+L+HjG2xVstK827dncvu7SO5sOpbf+Vei14hpah8b2SxuLXscHNcMi1zTcEHndel9VWstmItF
+NUWZVtb4NmA3uYOB4kforhWrHREQEREBERAREQEREBERAREQEREBEUf010i+hQAsAfPK7s4G
+e9KeJ+60XcegQafWFpyyiZJDC5vbhgc85EQMd7JcOL3fZbx37l5exOtdPLJNI5znPcXEuJc4
+k8zxK3emWMGSR0LZDIA8ulkO+eqPtyH7o3NG4AZKNgXyG/8AVBvNDcAdW1LIhfYB2pTyjBzH
+idw8ei9E0rAzZDRYAAADcGjK3oo3q80Y+hUwDxaaSzpOh4M8vndS+OEncCfBZYdhhY/MgePF
+co6Jg4fFdkdDJwY70suwxPbvYfQrhfTYbz3WpEz+0OsZskRtFpdrDbIL7LUbLS4/0VimfosW
+dxdvXaI2c0b0moO3pqiPi6N3ra4XnMi2RXqZ7F5x0ww/6PW1MPASEj8D7Pb/AIXBZkaZd1JU
+vieyWJxa9jg5rm5Frgbgg87rpXJjiCCN4Nx4hYHq7Vfpu3FKbadYVEYDZmjnwkA9029bqZry
+botjb6CeHFKcdza7OojG6zrFzegcO83kR0svVOHV0c8Uc8Lg5kjQ5pHFpF0GSiIgIiICIiAi
+IgIiICIiAiIg+OcACSbAbyeAXnfWHpYZXTVgOTtqnox7tO02lmtwL3A58g1WprWxkw0jaeJ1
+pap/YsI3tYReV48GX8yF520of21Q+NmUVNHsNtuAYADYXtcuy8AEEaViaodF+3m+lyNvHEe4
+CPam3g9bfO3JV/Twue5sbBdznBrQOLnGwHqV6q0GwBtHTQwixLG2JGW1Ifbf5m/kg29Fhg3y
+en7raxtAyAA8F1tK7GoOwFcgVwC+oOE9Mx/tNHjuK09dhpbm3NvxHit5dLoIfIxU9rrwnZkg
+qwMnN7N34m3c3xyJ/lCvbFaPZO23cd/Q/soVp3g30qjmiAu4DaZ+NmYWWHnBF9IX0sNtq2XP
+qsMtvotWMZL2U39zOOzl6Bx7sg5FrrG/irr1LY0+nlmwSqd3oyX05P2497mt8u8B+LkvPas6
+ornmmoMZh/vqZzWyW+0wHZN+nD8yD0qixMJxBlRDFURG7JGNe3wcLrLQEREBERAREQEREBER
+ARF1zyhjXPO5oJPgBdBSGsLGe2xSodf6uig7NvLt3jbefHc38gVXviLcPdOfanqdnxjjbtu/
+xOb6FbmStMtPiFS43M00rr82m1vmVw0lpNnBsIeNznVW1vzcZTY/ytsg7NUOD9vWiVwu2Fu1
+/wCQ91v6nyC9JwiwA5Km9R0IFPM+2ZlAv0aB+6uFhQZTCu5qx2Fd7Cg7Qvtl8auZQcF8uvpX
+AlB8mYHNLTxCi87bEjkpOSo/iQ+sd4/NB5l07wz6NX1MQFm7e238EnfAHhe3ksfBqftoqmLi
+2MzN45xkbQHi0k/lUv12UtqqCX34tn+Rx/zrSaroBJiVPE72ZBMxw5sdDICEEUVlar3CamrK
+N+bT8pGluXm26riaMtc5rt4JB8QbFTjVNIRPMOBjHqHf6lBa+oPGHPpJqGQ/WUspbz+reTb0
+c148AFaKoDVNXdjj9TAD3ZmSi3N7bSg+Ng/1Kv8AQEREBERAREQEREBERAWi06rTDh9ZKN7Y
+JCPHZIAW8LgMzkoNrsmLcHqiOPZN8nSMB+BQUNhQ2qB7BvIf63Upr6EVGitLKzN1NM/aA5GW
+QHy2ZGlaHQPDZJ4XNaMts7+IIFwP64qd6sqQxNrcGqx9XMHPj5EEBjwB7w7h8lzjNSb9m/Ps
+3nHbt7tuHDU20DD785n39Gq0KeS4BVYasoH0wq6CXJ8E5y5tcBZ46EAHzVg0stvBdWjcscu9
+jlgxvXex6wM1rly2ljNeuW2g7S5cC5dZeuJeg5lyj9c+7nHqtpWVGy3qdy0cjkFR68T36T8M
+vzYsLUTh3a4ox/CKN779SNgD0efRfNdFVtVUMXuRX83uP+UKUasYv7NweuxR+UkrHCLwaC2P
+1eb+SCncSeHTSuabgyPIPMFxIUv1Xs+snfya0epJ/QKDqxNEWCnpHSuyuHSH8IGXwCDjoFVk
+6RQPHGeRvkWSMPwXqFeUNUTDJjVHfeZJHn8scjz8l6vQEREBERAREQEREBfHGwuoxiWKyunf
+DHK2Fsdrkt2y5xz8gseqxSrLTFeI3y7Rt9x5N5qBk6jgxzMWnySa6W87T7saAGrkMsw223IY
+zac1rGA2vkd5WJplos6alkpYpXCGTZLmOO1sOY4PBY47hcblvMGpezaAN1gB+62rSqPDqck7
+37uZ/CTkmInaI4RDQLRVtNCIjmG+pOZNz1JJ9FoNazXUhjqqf24nNe09AbOB5gtLh4K0W5KK
+6wcM7aEnpY+Gf7/Bb45il65bc235n92sXm8zX0mNkZpMUiquyxanNrsEVSzi1t7guH3HXz91
+xPBSiNy8/UGJz4bO6SHNhJEkZ9l1jYtPLoVbeiWksFUwCF1iAO4faYPdI4gbgei9RHKvmEyh
+nss2Oa60zHrubIssNwJFz7Rals55rl9JKMtp2i6JqoDqVr3zk8V0ukQc55iTcrFkcj3rRaV4
+i6GmkMYJkcNiNo3mR+Qt638kYVVPQOxbF5WMJ2DIQ54zDYIrM2h4huXVy3muHSVlosJpbCKD
+Z2w3cHNFmx/lG/r5rEdjEeEUzqancH1sg+ukbYiJ3ug8SOXPNV7FG6R1hdzic78+JJWGWTg1
+AZpWs+zvceTf3O5S3SytEdP2TctuzQBwY3M/IDzXDCaVsLNkb97jzP7KM49X9tKSD3W5N8OJ
+QWF/DthhkxGSoI7sMDs+UkhDWjzb2novR6rjUVo79Fw8TPFpKh3aHmIxlGPS5/MVY6AiIgIi
+ICIiAiIgi2k+FPD/AKVCNrICRg3kDc5vMha2lmDwHNNx/WSnaiGkeH/R3/SYx9W82lA3Ncdz
+x04FUHVumxeJzY/P1WGl1H/O30ZFJLwPktgxy0kb1mRVHNebxZ5r8Mu2THvzDZbS652B7S07
+iukSr72isKZImNpcO2YUbrHwMwTGQDuk2d/8n0y8lA+xLXbcL3RvG4tJb6EZheidOMMbPA64
+4EHw5+X6LzvMC1zmHe1xafxNJB+IXoum5/Ex9k+df49HLU02mLR6/wArC0U1kezBiHdduEwH
+dd1eBu8Rl4Kyo5gQCCCCLgjMEHiCvN0mYsVZeqPFnPp5IHm/ZOGz0jduHqCrJFWUJF97RYYk
+TtEYZTpbbyuDXbXs5+YtbmTuAWLhuHOq3u9xptnuHXqf2UL0vna2ufQF3/DxNY6RouBLK7Oz
+882gcOah4tX4uWaVrxHqkXwRSkTM8+yaxVUUjiyOop3vH2GTwudflsh11WOtHSWWKf6LG10Z
+Y3N5BDg5wz2L7u6bbQ5lSCGloJG7DqaK3ha3msLH6EQwktJqKUe3TzEudE0/aglPeZbluUtw
+2VRT0bn5k2HPet7QxNjFm+Z4lajE42RSn6PIXMIDmk5OAP2HjdtDceBtcZFcX4i61hkeJ/ZB
+sMYxPumJhzOTjyHJdmr/AEbdiFdBTAHYvtyn3YGWLyfHJo6uCjwBJ5k/Er1Bqa0L/s+k7WZt
+qicBz72uyP7MfTfc9T0QT+GMNa1jRZrQAByaBYBc0RAREQEREBERAREQF11ELXtcx4u1wII6
+FdiIIE2N0EjqZ/2c2H3oju8wskPW90iwjt2AsylZmx3zaehUVhqCSWuBa9uTmneD+y8b1Xp8
+4ck3rHwyudPljLX9WcJSNy5is5rCL1xc9VlJtXySPDiWVV1DXMLc815y01YY62bZ47LrdS0X
++IJV+TS2BJ4Lz7pnVCSsmINwCG+bQAfjdeh6JNrZLTPsh66sVxxH6tU+oJFla+qbDjHTPmdv
+ldl+BuQ+JKqumoJZM44pHj7jHO+QWfheM1VE76tz4+JY8HZPi0r0iqX8uMz7NJ6KrIdacwFn
+U8bjzDnNv5Zqc6EV82Ihr5Imxs2rgAk3aOJJ6/JcdTnjDjm3+3dMOPvtt6LF0Tg2KZt97iSV
+QOtiR0OMVDs7ODHeLS0Z+oK9IRtDQGjcBZV1rU0LFZadoO0BYuAuWkbiRxb+yqtJmjFaIs65
+fimZU9SY0RmHj1WXNjjpmGFpyPtn7vILpi0AnL9kyx2vvbtud/LYZ+atTRDQiKmYHSMBO8B9
+iSfedy8FPz67Firvvu0x4rXnZVTKdg3NHpdY2KUYew7IG0MxuHkpfrZYICx8TWtJfY2AsRsk
+7vJQ3RmhnxGrhpGXs942y0ZMiB77z0Av8F20+aM2OLxG27XLj8O3aszU5qvdtsxDEI7BtnQR
+OGZdvErx03geavREXZzEREBERAREQEREBERAREQFqMbwFlR3gdiUbnj5OH2gtui0vSt69to3
+htW81neqvauknhyliJHvx95p8t4WGaxu4XJ5WN/RWcuAibvsPQKoydExTO9ZmE+nUbRHMboN
+huj8lSbyh0cPo9/h7vis/DtWuFwm7KONxve8m1Kb773eTmpaistNpqaevbREzZ7Zbb2dUNOx
+gsxjWj7oA+SxcSwWnqGllRBHI07w9jT+iz0UhxefNZ+qMUrTWUBcYdodpEbuMQJtttdvcy5z
+vmOZG6xtAaBsMAsALANHgB/sptXRbccjObHD1BCiOjM31IHEGx8VU9Tmd6e3KZpo3pb6N/tr
+4ZFiGVcHTKjy3dYxkkbAbhrQedhdYlTKk1StfNLdQ7ZJS8WJHdONFHV0N2XuDe4Fy1w5jiLL
+cavqXDsLi2Gdp2rgO1lkjIc88gG32Gchc9Sd65x1j4zdjiP65Lrnq3P9oj0AVnpuo3w44rH5
+b5NDGS29li0tUyVofG4OaeIXcopoEw7MzvsF42eRIGZCla9LgyTkxxeY23UuakY7zWJ8hERd
+nIREQEREBERAREQEREBERAREQEREBERAUCxaB1LUO2cmSkuaeG19pvr81PViYlh7J2GOUXBz
+HNruDgeBUXWaaM+Pt9fR30+bwr7z5IYK93RcXVJO8rjiOCT059kyx8HNF3Afeatc2raePrkv
+JZ9Nmx22vEr7HOK8b1lnulXQ+RYzqobr3PADMnwC22GaOzT2Ml4o+vtuHQcPNMGjyZZ2rDa+
+THije0tWzae7YjaXu5Nz9eS32H6IyPsal2w33GZk9C7gpRhuGxQN2ImgczvLjzJ4rMXotN0r
+Hj5vzP4VOfqN78U4h1U1O2NoYxoa0CwA4BdqIrWI2VwiIgIiICIiAiIgIiICIiAiIgIiICIi
+AiIgIiICr7Tr+8RFE1vykrSfMdmgHtu/rkp6iJovlQxq/mSIiKWjCIiAiIgIiICIiAiIg//Z
+
+--------------589DDD2515E3B3CC74D74E40--


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


[james-project] 30/30: JAMES-2933 Define mailetdocs-maven-plugin version globally

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d9e694d2007ca56d20a506b421171d663c9bb531
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 4 14:27:51 2019 +0700

    JAMES-2933 Define mailetdocs-maven-plugin version globally
    
    It was unspecified for server/mailet/dkim and /server/mailet/mailets
    
    I suspect this could cause IDE integration issues reported on the DEV
    mailing list by Jerry Malcolm
    
    cf https://www.mail-archive.com/server-dev@james.apache.org/msg62734.html
---
 mailet/pom.xml | 9 ---------
 pom.xml        | 5 +++++
 2 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/mailet/pom.xml b/mailet/pom.xml
index 4c1511b..6621800 100644
--- a/mailet/pom.xml
+++ b/mailet/pom.xml
@@ -65,15 +65,6 @@
     </properties>
 
     <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>${james.groupId}</groupId>
-                    <artifactId>mailetdocs-maven-plugin</artifactId>
-                    <version>${project.version}</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
         <plugins>
             <plugin>
                 <groupId>org.apache.rat</groupId>
diff --git a/pom.xml b/pom.xml
index 37281d3..cf6d86a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2670,6 +2670,11 @@
     <build>
         <pluginManagement>
             <plugins>
+                <plugin>
+                    <groupId>${james.groupId}</groupId>
+                    <artifactId>mailetdocs-maven-plugin</artifactId>
+                    <version>${project.version}</version>
+                </plugin>
                 <!-- Order by groupId / artifactId / scope -->
                 <plugin>
                     <groupId>com.coderplus.maven.plugins</groupId>


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


[james-project] 08/30: JAMES-2939 Revies indent in MailboxManager javaDoc parameters

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e5e0b1d4ed1791072ca1312e984c98b34ad4caff
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 4 09:38:01 2019 +0700

    JAMES-2939 Revies indent in MailboxManager javaDoc parameters
---
 .../org/apache/james/mailbox/MailboxManager.java   | 34 +++++++++++-----------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index d9bdf61..08f70d8 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -123,9 +123,9 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param session
      *            the context for this call, not null
      * @throws MailboxException
-     *             when the mailbox cannot be opened
+     *            when the mailbox cannot be opened
      * @throws MailboxNotFoundException
-     *             when the given mailbox does not exist
+     *            when the given mailbox does not exist
      */
     MessageManager getMailbox(MailboxPath mailboxPath, MailboxSession session) throws MailboxException;
 
@@ -137,9 +137,9 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param session
      *            the context for this call, not null
      * @throws MailboxException
-     *             when the mailbox cannot be opened
+     *            when the mailbox cannot be opened
      * @throws MailboxNotFoundException
-     *             when the given mailbox does not exist
+     *            when the given mailbox does not exist
      */
     MessageManager getMailbox(MailboxId mailboxId, MailboxSession session) throws MailboxException;
 
@@ -151,7 +151,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param mailboxSession
      *            the context for this call, not null
      * @throws MailboxException
-     *             when creation fails
+     *            when creation fails
      * @return Empty optional when the mailbox name is empty. If mailbox is created, the id of the mailboxPath specified as
      *  parameter is returned (and potential mailboxIds of parent mailboxes created in the process will be omitted)
      */
@@ -176,11 +176,11 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param session
      *            the context for this call, not nul
      * @throws MailboxException
-     *             otherwise
+     *            otherwise
      * @throws MailboxExistsException
-     *             when the <code>to</code> mailbox exists
+     *            when the <code>to</code> mailbox exists
      * @throws MailboxNotFoundException
-     *             when the <code>from</code> mailbox does not exist
+     *            when the <code>from</code> mailbox does not exist
      */
     void renameMailbox(MailboxPath from, MailboxPath to, MailboxSession session) throws MailboxException;
 
@@ -250,7 +250,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param session
      *            the context for this call, not null
      * @return true when the mailbox exists and is accessible for the given
-     *         user, false otherwise
+     *            user, false otherwise
      * @throws MailboxException
      */
     boolean mailboxExists(MailboxPath mailboxPath, MailboxSession session) throws MailboxException;
@@ -261,7 +261,7 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param session
      *            the context for this call, not null
      * @return true when the INBOX exists and is accessible for the given
-     *         user, false otherwise
+     *            user, false otherwise
      * @throws MailboxException
      */
     default boolean hasInbox(MailboxSession session) throws MailboxException {
@@ -278,9 +278,9 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      *            the name of the user whose session is being created
      * @return <code>MailboxSession</code>, not null
      * @throws BadCredentialsException
-     *             when system access is not allowed for the given user
+     *            when system access is not allowed for the given user
      * @throws MailboxException
-     *             when the creation fails for other reasons
+     *            when the creation fails for other reasons
      */
     MailboxSession createSystemSession(String userName) throws BadCredentialsException, MailboxException;
 
@@ -293,11 +293,11 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param passwd
      *            password supplied
      * @return a <code>MailboxSession</code> when the user is authenticated and
-     *         authorized to access
+     *            authorized to access
      * @throws BadCredentialsException
-     *             when system access is denied for the given user
+     *            when system access is denied for the given user
      * @throws MailboxException
-     *             when the creation fails for other reasons
+     *            when the creation fails for other reasons
      */
     MailboxSession login(String userid, String passwd) throws BadCredentialsException, MailboxException;
 
@@ -313,9 +313,9 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
      * @param otherUserId
      *            user name of the real user
      * @return a <code>MailboxSession</code> for the real user
-     *         when the admin is authenticated and authorized to access
+     *            when the admin is authenticated and authorized to access
      * @throws BadCredentialsException
-     *             when system access is denied for the given user
+     *            when system access is denied for the given user
      * @throws MailboxException
      *             when the creation fails for other reasons
      */


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


[james-project] 15/30: JAMES-2943 Domain routes should fail upon auto-detected domain removal attempts

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b223e6d501f44ac6151e86b0cdf263b17c3721e2
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 09:31:46 2019 +0700

    JAMES-2943 Domain routes should fail upon auto-detected domain removal attempts
---
 .../james/webadmin/routes/DomainsRoutes.java       |  8 ++++
 .../james/webadmin/routes/DomainsRoutesTest.java   | 46 ++++++++++++++++++++--
 2 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index c8c0a0ed..1aee7e9 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -32,6 +32,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
 import org.apache.james.core.Domain;
+import org.apache.james.domainlist.api.AutoDetectedDomainRemovalException;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
@@ -227,6 +228,13 @@ public class DomainsRoutes implements Routes {
             domainList.removeDomain(domain);
 
             domainAliasService.removeCorrespondingDomainAliases(domain);
+        } catch (AutoDetectedDomainRemovalException e) {
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorType.INVALID_ARGUMENT)
+                .message("Can not remove domain")
+                .cause(e)
+                .haltError();
         } catch (DomainListException e) {
             LOGGER.info("{} did not exists", request.params(DOMAIN_NAME));
         }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index 063bc79..f57070a 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -52,10 +52,11 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 
+import com.google.common.collect.ImmutableList;
+
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
 
-
 class DomainsRoutesTest {
     private static final String DOMAIN = "domain";
     private static final String ALIAS_DOMAIN = "alias.domain";
@@ -547,7 +548,7 @@ class DomainsRoutesTest {
 
                 when()
                     .get(DOMAIN + "/aliases")
-                    .then()
+                .then()
                     .contentType(ContentType.JSON)
                     .statusCode(HttpStatus.OK_200)
                     .body("source", containsInAnyOrder(ALIAS_DOMAIN));
@@ -564,7 +565,7 @@ class DomainsRoutesTest {
 
                 when()
                     .get(DOMAIN + "/aliases")
-                    .then()
+                .then()
                     .contentType(ContentType.JSON)
                     .statusCode(HttpStatus.OK_200)
                     .body("source", containsInAnyOrder(ALIAS_DOMAIN));
@@ -668,4 +669,43 @@ class DomainsRoutesTest {
 
     }
 
+    @Nested
+    class DetectedDomainHandling {
+        @BeforeEach
+        void setUp() throws Exception {
+            DNSService dnsService = mock(DNSService.class);
+            when(dnsService.getAllByName(any())).thenReturn(ImmutableList.of(InetAddress.getByName("172.45.62.13")));
+            when(dnsService.getHostName(any())).thenReturn("james.local");
+
+            MemoryDomainList domainList = new MemoryDomainList(dnsService);
+            domainList.setAutoDetectIP(true);
+            domainList.setAutoDetect(true);
+            createServer(domainList);
+        }
+
+        @Test
+        void deleteShouldFailWhenAutoDetectedDomain() {
+            when()
+                .delete("james.local")
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is("InvalidArgument"))
+                .body("message", is("Can not remove domain"))
+                .body("details", is("james.local is autodetected and cannot be removed"));
+        }
+
+        @Test
+        void deleteShouldFailWhenAutoDetectedIp() {
+            when()
+                .delete("172.45.62.13")
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is("InvalidArgument"))
+                .body("message", is("Can not remove domain"))
+                .body("details", is("172.45.62.13 is autodetected and cannot be removed"));
+        }
+    }
+
 }


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


[james-project] 02/30: JAMES-2937 Inject RabbitMQChannelPool

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit fc2fa8730d79d4a1a7312af94408648afca126cc
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Oct 7 14:48:36 2019 +0700

    JAMES-2937 Inject RabbitMQChannelPool
    
    This avoids repeating ourselves regarding Sender and Receiver specification
    and simplifies overall wiring.
    
    This also highlighted some 'dirty' initialization performed within MailSpool
    constructor, out of startable chain.
---
 backends-common/rabbitmq/pom.xml                   |  4 ++
 .../rabbitmq/ReactorRabbitMQChannelPool.java       | 36 ++++++++++++++--
 .../rabbitmq/ReactorRabbitMQChannelPoolTest.java   |  8 ++--
 .../james/mailbox/events/GroupRegistration.java    | 11 +++--
 .../mailbox/events/GroupRegistrationHandler.java   | 17 +++-----
 .../mailbox/events/KeyRegistrationHandler.java     | 10 ++---
 .../james/mailbox/events/RabbitMQEventBus.java     | 25 ++++-------
 .../james/mailbox/events/RabbitMQEventBusTest.java | 29 ++++++++-----
 .../rabbitmq/host/RabbitMQEventBusHostSystem.java  | 10 +++--
 .../modules/DistributedTaskManagerModule.java      |  7 ++++
 .../apache/james/jmap/draft/JMAPCommonModule.java  | 10 +++++
 .../james/modules/rabbitmq/RabbitMQModule.java     | 32 +++++----------
 .../apache/james/jmap/draft/send/MailSpool.java    | 10 ++++-
 .../james/jmap/draft/send/MailSpoolTest.java       |  1 +
 .../org/apache/james/queue/rabbitmq/Dequeuer.java  |  8 ++--
 .../org/apache/james/queue/rabbitmq/Enqueuer.java  |  5 ++-
 .../queue/rabbitmq/RabbitMQMailQueueFactory.java   | 48 ++++++----------------
 .../RabbitMQMailQueueConfigurationChangeTest.java  | 17 ++++----
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      | 26 ++++--------
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     | 17 +++-----
 .../distributed/RabbitMQTerminationSubscriber.java |  4 +-
 .../distributed/RabbitMQWorkQueue.java             | 34 ++++++---------
 .../distributed/RabbitMQWorkQueueSupplier.scala    |  5 +--
 .../distributed/DistributedTaskManagerTest.java    | 12 ++++--
 .../distributed/RabbitMQWorkQueueTest.java         | 11 +++--
 server/task/task-memory/pom.xml                    |  4 ++
 .../main/java/org/apache/james/task/WorkQueue.java |  8 +++-
 .../eventsourcing/EventSourcingTaskManager.scala   |  9 ++--
 28 files changed, 216 insertions(+), 202 deletions(-)

diff --git a/backends-common/rabbitmq/pom.xml b/backends-common/rabbitmq/pom.xml
index fa1c156..7cd59c1 100644
--- a/backends-common/rabbitmq/pom.xml
+++ b/backends-common/rabbitmq/pom.xml
@@ -37,6 +37,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-lifecycle-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-testing</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
index 9e66225..e240b93 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
@@ -24,12 +24,15 @@ import java.util.Comparator;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.function.BiConsumer;
 
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+
 import org.apache.commons.pool2.BasePooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
 import org.apache.commons.pool2.impl.DefaultPooledObject;
 import org.apache.commons.pool2.impl.GenericObjectPool;
 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
-
+import org.apache.james.lifecycle.api.Startable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,10 +45,13 @@ import reactor.core.publisher.SignalType;
 import reactor.core.scheduler.Schedulers;
 import reactor.rabbitmq.ChannelPool;
 import reactor.rabbitmq.RabbitFlux;
+import reactor.rabbitmq.Receiver;
+import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
 import reactor.rabbitmq.SenderOptions;
 
-public class ReactorRabbitMQChannelPool implements ChannelPool {
+public class ReactorRabbitMQChannelPool implements ChannelPool, Startable {
+    private static final int MAX_CHANNELS_NUMBER = 5;
 
     static class ChannelFactory extends BasePooledObjectFactory<Channel> {
 
@@ -95,6 +101,12 @@ public class ReactorRabbitMQChannelPool implements ChannelPool {
     private final Mono<Connection> connectionMono;
     private final GenericObjectPool<Channel> pool;
     private final ConcurrentSkipListSet<Channel> borrowedChannels;
+    private Sender sender;
+
+    @Inject
+    public ReactorRabbitMQChannelPool(SimpleConnectionPool simpleConnectionPool) {
+        this(simpleConnectionPool.getResilientConnection(), MAX_CHANNELS_NUMBER);
+    }
 
     public ReactorRabbitMQChannelPool(Mono<Connection> connectionMono, int poolSize) {
         this.connectionMono = connectionMono;
@@ -106,6 +118,22 @@ public class ReactorRabbitMQChannelPool implements ChannelPool {
         this.borrowedChannels = new ConcurrentSkipListSet<>(Comparator.comparingInt(System::identityHashCode));
     }
 
+    public void start() {
+        sender = createSender();
+    }
+
+    public Sender getSender() {
+        return sender;
+    }
+
+    public Receiver createReceiver() {
+        return RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionMono));
+    }
+
+    public Mono<Connection> getConnectionMono() {
+        return connectionMono;
+    }
+
     @Override
     public Mono<? extends Channel> getChannelMono() {
         return Mono.fromCallable(() -> {
@@ -127,7 +155,7 @@ public class ReactorRabbitMQChannelPool implements ChannelPool {
         };
     }
 
-    public Sender createSender() {
+    private Sender createSender() {
        return RabbitFlux.createSender(new SenderOptions()
            .connectionMono(connectionMono)
            .channelPool(this)
@@ -146,8 +174,10 @@ public class ReactorRabbitMQChannelPool implements ChannelPool {
         }
     }
 
+    @PreDestroy
     @Override
     public void close() {
+        sender.close();
         borrowedChannels.forEach(channel -> getChannelCloseHandler().accept(SignalType.ON_NEXT, channel));
         borrowedChannels.clear();
         pool.close();
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
index 81994c8..21be0bd 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
@@ -66,9 +66,11 @@ class ReactorRabbitMQChannelPoolTest implements ChannelPoolContract {
     }
 
     private ReactorRabbitMQChannelPool generateChannelPool(int poolSize) {
-        return new ReactorRabbitMQChannelPool(
-                rabbitMQExtension.getRabbitConnectionPool().getResilientConnection(),
-                poolSize);
+        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(
+            rabbitMQExtension.getRabbitConnectionPool().getResilientConnection(),
+            poolSize);
+        reactorRabbitMQChannelPool.start();
+        return reactorRabbitMQChannelPool;
     }
 
     // Pool wait timeout is an expected exception
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
index 953a4fb..dac4ae3 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistration.java
@@ -31,12 +31,13 @@ import java.nio.charset.StandardCharsets;
 import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.event.json.EventSerializer;
 import org.apache.james.util.MDCBuilder;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
-import com.rabbitmq.client.Connection;
+
 import reactor.core.Disposable;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -45,9 +46,7 @@ import reactor.rabbitmq.AcknowledgableDelivery;
 import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ConsumeOptions;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.RabbitFlux;
 import reactor.rabbitmq.Receiver;
-import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
 
 class GroupRegistration implements Registration {
@@ -85,15 +84,15 @@ class GroupRegistration implements Registration {
     private final MailboxListenerExecutor mailboxListenerExecutor;
     private Optional<Disposable> receiverSubscriber;
 
-    GroupRegistration(Mono<Connection> connectionSupplier, Sender sender, EventSerializer eventSerializer,
+    GroupRegistration(ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, EventSerializer eventSerializer,
                       MailboxListener mailboxListener, Group group, RetryBackoffConfiguration retryBackoff,
                       EventDeadLetters eventDeadLetters,
                       Runnable unregisterGroup, MailboxListenerExecutor mailboxListenerExecutor) {
         this.eventSerializer = eventSerializer;
         this.mailboxListener = mailboxListener;
         this.queueName = WorkQueueName.of(group);
-        this.sender = sender;
-        this.receiver = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionSupplier));
+        this.sender = reactorRabbitMQChannelPool.getSender();
+        this.receiver = reactorRabbitMQChannelPool.createReceiver();
         this.mailboxListenerExecutor = mailboxListenerExecutor;
         this.receiverSubscriber = Optional.empty();
         this.unregisterGroup = unregisterGroup;
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistrationHandler.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistrationHandler.java
index 2da507f..5337df6 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistrationHandler.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/GroupRegistrationHandler.java
@@ -23,28 +23,22 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.event.json.EventSerializer;
 
-import com.rabbitmq.client.Connection;
-
-import reactor.core.publisher.Mono;
-import reactor.rabbitmq.Sender;
-
 class GroupRegistrationHandler {
     private final Map<Group, GroupRegistration> groupRegistrations;
     private final EventSerializer eventSerializer;
-    private final Sender sender;
-    private final Mono<Connection> connectionMono;
     private final RetryBackoffConfiguration retryBackoff;
     private final EventDeadLetters eventDeadLetters;
     private final MailboxListenerExecutor mailboxListenerExecutor;
+    private final ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
-    GroupRegistrationHandler(EventSerializer eventSerializer, Sender sender, Mono<Connection> connectionMono,
+    GroupRegistrationHandler(EventSerializer eventSerializer, ReactorRabbitMQChannelPool reactorRabbitMQChannelPool,
                              RetryBackoffConfiguration retryBackoff,
                              EventDeadLetters eventDeadLetters, MailboxListenerExecutor mailboxListenerExecutor) {
         this.eventSerializer = eventSerializer;
-        this.sender = sender;
-        this.connectionMono = connectionMono;
+        this.reactorRabbitMQChannelPool = reactorRabbitMQChannelPool;
         this.retryBackoff = retryBackoff;
         this.eventDeadLetters = eventDeadLetters;
         this.mailboxListenerExecutor = mailboxListenerExecutor;
@@ -73,8 +67,7 @@ class GroupRegistrationHandler {
 
     private GroupRegistration newGroupRegistration(MailboxListener listener, Group group) {
         return new GroupRegistration(
-            connectionMono,
-            sender,
+            reactorRabbitMQChannelPool,
             eventSerializer,
             listener,
             group,
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
index 1f2fbae..dc968fe 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/KeyRegistrationHandler.java
@@ -28,6 +28,7 @@ import static org.apache.james.mailbox.events.RabbitMQEventBus.EVENT_BUS_ID;
 import java.nio.charset.StandardCharsets;
 import java.util.Optional;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.event.json.EventSerializer;
 import org.apache.james.util.MDCBuilder;
 import org.apache.james.util.MDCStructuredLogger;
@@ -37,7 +38,6 @@ import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
 import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
 
 import reactor.core.Disposable;
@@ -45,9 +45,7 @@ import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 import reactor.rabbitmq.ConsumeOptions;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.RabbitFlux;
 import reactor.rabbitmq.Receiver;
-import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
 
 class KeyRegistrationHandler {
@@ -64,13 +62,13 @@ class KeyRegistrationHandler {
     private final MailboxListenerExecutor mailboxListenerExecutor;
     private Optional<Disposable> receiverSubscriber;
 
-    KeyRegistrationHandler(EventBusId eventBusId, EventSerializer eventSerializer, Sender sender, Mono<Connection> connectionMono, RoutingKeyConverter routingKeyConverter, LocalListenerRegistry localListenerRegistry, MailboxListenerExecutor mailboxListenerExecutor) {
+    KeyRegistrationHandler(EventBusId eventBusId, EventSerializer eventSerializer, ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, RoutingKeyConverter routingKeyConverter, LocalListenerRegistry localListenerRegistry, MailboxListenerExecutor mailboxListenerExecutor) {
         this.eventBusId = eventBusId;
         this.eventSerializer = eventSerializer;
-        this.sender = sender;
+        this.sender = reactorRabbitMQChannelPool.getSender();
         this.routingKeyConverter = routingKeyConverter;
         this.localListenerRegistry = localListenerRegistry;
-        this.receiver = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionMono));
+        this.receiver = reactorRabbitMQChannelPool.createReceiver();
         this.mailboxListenerExecutor = mailboxListenerExecutor;
         this.registrationQueue = new RegistrationQueueName();
         this.registrationBinder = new RegistrationBinder(sender, registrationQueue);
diff --git a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/RabbitMQEventBus.java b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/RabbitMQEventBus.java
index a659062..06d786a 100644
--- a/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/RabbitMQEventBus.java
+++ b/mailbox/event/event-rabbitmq/src/main/java/org/apache/james/mailbox/events/RabbitMQEventBus.java
@@ -25,47 +25,42 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
 import org.apache.james.event.json.EventSerializer;
 import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.metrics.api.MetricFactory;
 
 import com.google.common.base.Preconditions;
-import com.rabbitmq.client.Connection;
+
 import reactor.core.publisher.Mono;
-import reactor.rabbitmq.Sender;
 
 public class RabbitMQEventBus implements EventBus, Startable {
-    private static final int MAX_CHANNELS_NUMBER = 5;
     private static final String NOT_RUNNING_ERROR_MESSAGE = "Event Bus is not running";
     static final String MAILBOX_EVENT = "mailboxEvent";
     static final String MAILBOX_EVENT_EXCHANGE_NAME = MAILBOX_EVENT + "-exchange";
     static final String EVENT_BUS_ID = "eventBusId";
 
-    private final Mono<Connection> connectionMono;
     private final EventSerializer eventSerializer;
     private final RoutingKeyConverter routingKeyConverter;
     private final RetryBackoffConfiguration retryBackoff;
     private final EventBusId eventBusId;
     private final EventDeadLetters eventDeadLetters;
+    private final ReactorRabbitMQChannelPool channelPool;
     private final MailboxListenerExecutor mailboxListenerExecutor;
 
     private volatile boolean isRunning;
     private volatile boolean isStopping;
-    private ReactorRabbitMQChannelPool channelPool;
     private GroupRegistrationHandler groupRegistrationHandler;
     private KeyRegistrationHandler keyRegistrationHandler;
-    EventDispatcher eventDispatcher;
-    private Sender sender;
+    private EventDispatcher eventDispatcher;
 
     @Inject
-    public RabbitMQEventBus(SimpleConnectionPool simpleConnectionPool, EventSerializer eventSerializer,
+    public RabbitMQEventBus(ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, EventSerializer eventSerializer,
                      RetryBackoffConfiguration retryBackoff,
                      RoutingKeyConverter routingKeyConverter,
                      EventDeadLetters eventDeadLetters, MetricFactory metricFactory) {
+        this.channelPool = reactorRabbitMQChannelPool;
         this.mailboxListenerExecutor = new MailboxListenerExecutor(metricFactory);
         this.eventBusId = EventBusId.random();
-        this.connectionMono = simpleConnectionPool.getResilientConnection();
         this.eventSerializer = eventSerializer;
         this.routingKeyConverter = routingKeyConverter;
         this.retryBackoff = retryBackoff;
@@ -76,13 +71,11 @@ public class RabbitMQEventBus implements EventBus, Startable {
 
     public void start() {
         if (!isRunning && !isStopping) {
-            this.channelPool = new ReactorRabbitMQChannelPool(connectionMono, MAX_CHANNELS_NUMBER);
 
-            sender = channelPool.createSender();
             LocalListenerRegistry localListenerRegistry = new LocalListenerRegistry();
-            keyRegistrationHandler = new KeyRegistrationHandler(eventBusId, eventSerializer, sender, connectionMono, routingKeyConverter, localListenerRegistry, mailboxListenerExecutor);
-            groupRegistrationHandler = new GroupRegistrationHandler(eventSerializer, sender, connectionMono, retryBackoff, eventDeadLetters, mailboxListenerExecutor);
-            eventDispatcher = new EventDispatcher(eventBusId, eventSerializer, sender, localListenerRegistry, mailboxListenerExecutor);
+            keyRegistrationHandler = new KeyRegistrationHandler(eventBusId, eventSerializer, channelPool, routingKeyConverter, localListenerRegistry, mailboxListenerExecutor);
+            groupRegistrationHandler = new GroupRegistrationHandler(eventSerializer, channelPool, retryBackoff, eventDeadLetters, mailboxListenerExecutor);
+            eventDispatcher = new EventDispatcher(eventBusId, eventSerializer, channelPool.getSender(), localListenerRegistry, mailboxListenerExecutor);
 
             eventDispatcher.start();
             keyRegistrationHandler.start();
@@ -97,8 +90,6 @@ public class RabbitMQEventBus implements EventBus, Startable {
             isRunning = false;
             groupRegistrationHandler.stop();
             keyRegistrationHandler.stop();
-            sender.close();
-            channelPool.close();
         }
     }
 
diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index ab6d885..2b92e20 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -56,7 +56,7 @@ import org.apache.james.backends.rabbitmq.RabbitMQExtension;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension.DockerRestartPolicy;
 import org.apache.james.backends.rabbitmq.RabbitMQFixture;
 import org.apache.james.backends.rabbitmq.RabbitMQManagementAPI;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.event.json.EventSerializer;
 import org.apache.james.mailbox.events.EventBusTestFixture.GroupA;
 import org.apache.james.mailbox.events.EventBusTestFixture.MailboxListenerCountingSuccessfulExecution;
@@ -97,11 +97,11 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     private RabbitMQEventBus eventBus;
     private RabbitMQEventBus eventBus2;
     private RabbitMQEventBus eventBus3;
-    private Sender sender;
     private EventSerializer eventSerializer;
     private RoutingKeyConverter routingKeyConverter;
     private MemoryEventDeadLetters memoryEventDeadLetters;
     private Mono<Connection> resilientConnection;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setUp() {
@@ -110,6 +110,8 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         TestId.Factory mailboxIdFactory = new TestId.Factory();
         eventSerializer = new EventSerializer(mailboxIdFactory, new TestMessageId.Factory(), new DefaultUserQuotaRootResolver.DefaultQuotaRootDeserializer());
         routingKeyConverter = RoutingKeyConverter.forFactories(new MailboxIdRegistrationKey.Factory(mailboxIdFactory));
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
 
         eventBus = newEventBus();
         eventBus2 = newEventBus();
@@ -119,7 +121,6 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         eventBus2.start();
         eventBus3.start();
         resilientConnection = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
-        sender = RabbitFlux.createSender(new SenderOptions().connectionMono(resilientConnection));
     }
 
     @AfterEach
@@ -129,17 +130,17 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         eventBus3.stop();
         ALL_GROUPS.stream()
             .map(GroupRegistration.WorkQueueName::of)
-            .forEach(queueName -> sender.delete(QueueSpecification.queue(queueName.asString())).block());
-        sender.delete(ExchangeSpecification.exchange(MAILBOX_EVENT_EXCHANGE_NAME)).block();
-        sender.close();
+            .forEach(queueName -> reactorRabbitMQChannelPool.getSender().delete(QueueSpecification.queue(queueName.asString())).block());
+        reactorRabbitMQChannelPool.getSender().delete(ExchangeSpecification.exchange(MAILBOX_EVENT_EXCHANGE_NAME)).block();
+        reactorRabbitMQChannelPool.close();
     }
 
     private RabbitMQEventBus newEventBus() {
-        return newEventBus(rabbitMQExtension.getRabbitConnectionPool());
+        return newEventBus(reactorRabbitMQChannelPool);
     }
 
-    private RabbitMQEventBus newEventBus(SimpleConnectionPool connectionPool) {
-        return new RabbitMQEventBus(connectionPool, eventSerializer, RetryBackoffConfiguration.DEFAULT, routingKeyConverter, memoryEventDeadLetters, new NoopMetricFactory());
+    private RabbitMQEventBus newEventBus(ReactorRabbitMQChannelPool rabbitMQChannelPool) {
+        return new RabbitMQEventBus(rabbitMQChannelPool, eventSerializer, RetryBackoffConfiguration.DEFAULT, routingKeyConverter, memoryEventDeadLetters, new NoopMetricFactory());
     }
 
     @Override
@@ -340,10 +341,18 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                     .restartPolicy(DockerRestartPolicy.PER_TEST);
 
                 private RabbitMQEventBus rabbitMQEventBusWithNetWorkIssue;
+                private ReactorRabbitMQChannelPool reactorRabbitMQChannelPoolWithNetWorkIssue;
 
                 @BeforeEach
                 void beforeEach() {
-                    rabbitMQEventBusWithNetWorkIssue = newEventBus(rabbitMQNetWorkIssueExtension.getRabbitConnectionPool());
+                    reactorRabbitMQChannelPoolWithNetWorkIssue = new ReactorRabbitMQChannelPool(rabbitMQNetWorkIssueExtension.getRabbitConnectionPool());
+                    reactorRabbitMQChannelPoolWithNetWorkIssue.start();
+                    rabbitMQEventBusWithNetWorkIssue = newEventBus(reactorRabbitMQChannelPoolWithNetWorkIssue);
+                }
+
+                @AfterEach
+                void afterEach() {
+                    reactorRabbitMQChannelPoolWithNetWorkIssue.close();
                 }
 
                 @Test
diff --git a/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java b/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
index e93ac4f..25c3635 100644
--- a/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
+++ b/mpt/impl/imap-mailbox/rabbitmq/src/test/java/org/apache/james/mpt/imapmailbox/rabbitmq/host/RabbitMQEventBusHostSystem.java
@@ -20,10 +20,10 @@
 
 package org.apache.james.mpt.imapmailbox.rabbitmq.host;
 
-import java.net.URISyntaxException;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.backends.rabbitmq.DockerRabbitMQ;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
 import org.apache.james.core.quota.QuotaCount;
 import org.apache.james.core.quota.QuotaSize;
@@ -63,6 +63,7 @@ public class RabbitMQEventBusHostSystem extends JamesImapHostSystem {
     private RabbitMQEventBus eventBus;
     private SimpleConnectionPool connectionPool;
     private InMemoryIntegrationResources resources;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     RabbitMQEventBusHostSystem(DockerRabbitMQ dockerRabbitMQ) {
         this.dockerRabbitMQ = dockerRabbitMQ;
@@ -73,6 +74,8 @@ public class RabbitMQEventBusHostSystem extends JamesImapHostSystem {
         super.beforeTest();
 
         connectionPool = new SimpleConnectionPool(dockerRabbitMQ.createRabbitConnectionFactory());
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionPool);
+        reactorRabbitMQChannelPool.start();
         eventBus = createEventBus();
         eventBus.start();
 
@@ -101,18 +104,19 @@ public class RabbitMQEventBusHostSystem extends JamesImapHostSystem {
             defaultImapProcessorFactory);
     }
 
-    private RabbitMQEventBus createEventBus() throws URISyntaxException {
+    private RabbitMQEventBus createEventBus() {
         InMemoryMessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
         InMemoryId.Factory mailboxIdFactory = new InMemoryId.Factory();
         EventSerializer eventSerializer = new EventSerializer(mailboxIdFactory, messageIdFactory, new DefaultUserQuotaRootResolver.DefaultQuotaRootDeserializer());
         RoutingKeyConverter routingKeyConverter = new RoutingKeyConverter(ImmutableSet.of(new MailboxIdRegistrationKey.Factory(mailboxIdFactory)));
-        return new RabbitMQEventBus(connectionPool, eventSerializer, RetryBackoffConfiguration.DEFAULT,
+        return new RabbitMQEventBus(reactorRabbitMQChannelPool, eventSerializer, RetryBackoffConfiguration.DEFAULT,
             routingKeyConverter, new MemoryEventDeadLetters(), new NoopMetricFactory());
     }
 
     @Override
     public void afterTest() {
         eventBus.stop();
+        reactorRabbitMQChannelPool.close();
         connectionPool.close();
     }
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
index b74e6dd..ce0333f 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/DistributedTaskManagerModule.java
@@ -30,6 +30,7 @@ import org.apache.james.task.eventsourcing.WorkQueueSupplier;
 import org.apache.james.task.eventsourcing.cassandra.CassandraTaskExecutionDetailsProjection;
 import org.apache.james.task.eventsourcing.cassandra.CassandraTaskExecutionDetailsProjectionModule;
 import org.apache.james.task.eventsourcing.distributed.RabbitMQTerminationSubscriber;
+import org.apache.james.task.eventsourcing.distributed.RabbitMQWorkQueue;
 import org.apache.james.task.eventsourcing.distributed.RabbitMQWorkQueueSupplier;
 import org.apache.james.utils.InitializationOperation;
 import org.apache.james.utils.InitilizationOperationBuilder;
@@ -64,5 +65,11 @@ public class DistributedTaskManagerModule extends AbstractModule {
             .init(instance::start);
     }
 
+    @ProvidesIntoSet
+    InitializationOperation workQueue(EventSourcingTaskManager instance) {
+        return InitilizationOperationBuilder
+            .forClass(RabbitMQWorkQueue.class)
+            .init(instance::start);
+    }
 
 }
diff --git a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
index ed2c316..dce8120 100644
--- a/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
+++ b/server/container/guice/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/JMAPCommonModule.java
@@ -42,6 +42,8 @@ import org.apache.james.lifecycle.api.StartUpCheck;
 import org.apache.james.util.date.DefaultZonedDateTimeProvider;
 import org.apache.james.util.date.ZonedDateTimeProvider;
 import org.apache.james.util.mime.MessageContentExtractor;
+import org.apache.james.utils.InitializationOperation;
+import org.apache.james.utils.InitilizationOperationBuilder;
 import org.apache.mailet.base.AutomaticallySentMailDetector;
 import org.apache.mailet.base.AutomaticallySentMailDetectorImpl;
 
@@ -50,6 +52,7 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
+import com.google.inject.multibindings.ProvidesIntoSet;
 import com.google.inject.name.Names;
 
 public class JMAPCommonModule extends AbstractModule {
@@ -96,4 +99,11 @@ public class JMAPCommonModule extends AbstractModule {
                 accessTokenAuthenticationStrategy,
                 queryParameterAuthenticationStrategy);
     }
+
+    @ProvidesIntoSet
+    InitializationOperation workQueue(MailSpool instance) {
+        return InitilizationOperationBuilder
+            .forClass(MailSpool.class)
+            .init(instance::start);
+    }
 }
diff --git a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
index 5eb49df..4226aea 100644
--- a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
+++ b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
@@ -29,10 +29,10 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.rabbitmq.RabbitMQChannelPool;
 import org.apache.james.backends.rabbitmq.RabbitMQConfiguration;
 import org.apache.james.backends.rabbitmq.RabbitMQHealthCheck;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.backends.rabbitmq.SimpleChannelPool;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
-import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.rabbitmq.RabbitMQMailQueue;
@@ -50,17 +50,18 @@ import org.apache.james.queue.rabbitmq.view.cassandra.EnqueuedMailsDAO;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfiguration;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfigurationModule;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.EventsourcingConfigurationManagement;
-import org.apache.james.utils.InitialisationOperation;
+import org.apache.james.utils.InitializationOperation;
+import org.apache.james.utils.InitilizationOperationBuilder;
 import org.apache.james.utils.PropertiesProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 import com.google.inject.multibindings.Multibinder;
+import com.google.inject.multibindings.ProvidesIntoSet;
 
 public class RabbitMQModule extends AbstractModule {
 
@@ -70,6 +71,7 @@ public class RabbitMQModule extends AbstractModule {
 
     @Override
     protected void configure() {
+        bind(ReactorRabbitMQChannelPool.class).in(Scopes.SINGLETON);
         bind(EnqueuedMailsDAO.class).in(Scopes.SINGLETON);
         bind(DeletedMailsDAO.class).in(Scopes.SINGLETON);
         bind(BrowseStartDAO.class).in(Scopes.SINGLETON);
@@ -88,7 +90,6 @@ public class RabbitMQModule extends AbstractModule {
         eventDTOModuleBinder.addBinding().toInstance(CassandraMailQueueViewConfigurationModule.MAIL_QUEUE_VIEW_CONFIGURATION);
 
         Multibinder.newSetBinder(binder(), HealthCheck.class).addBinding().to(RabbitMQHealthCheck.class);
-        Multibinder.newSetBinder(binder(), InitialisationOperation.class).addBinding().to(RabbitMQMailQueueFactoryInitialisationOperation.class);
     }
 
     @Provides
@@ -145,23 +146,10 @@ public class RabbitMQModule extends AbstractModule {
         return RabbitMQMailQueueConfiguration.from(configuration);
     }
 
-    @Singleton
-    public static class RabbitMQMailQueueFactoryInitialisationOperation implements InitialisationOperation {
-        private final RabbitMQMailQueueFactory rabbitMQMailQueueFactory;
-
-        @Inject
-        public RabbitMQMailQueueFactoryInitialisationOperation(RabbitMQMailQueueFactory rabbitMQMailQueueFactory) {
-            this.rabbitMQMailQueueFactory = rabbitMQMailQueueFactory;
-        }
-
-        @Override
-        public void initModule() {
-            rabbitMQMailQueueFactory.start();
-        }
-
-        @Override
-        public Class<? extends Startable> forClass() {
-            return RabbitMQMailQueueFactory.class;
-        }
+    @ProvidesIntoSet
+    InitializationOperation workQueue(ReactorRabbitMQChannelPool instance) {
+        return InitilizationOperationBuilder
+            .forClass(ReactorRabbitMQChannelPool.class)
+            .init(instance::start);
     }
 }
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/MailSpool.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/MailSpool.java
index d4ebbb6..c652bc9 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/MailSpool.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/send/MailSpool.java
@@ -21,6 +21,7 @@ package org.apache.james.jmap.draft.send;
 
 import javax.inject.Inject;
 
+import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.MailQueueFactory;
@@ -30,12 +31,17 @@ import org.apache.mailet.Mail;
 
 import com.google.common.annotations.VisibleForTesting;
 
-public class MailSpool {
+public class MailSpool implements Startable {
 
-    private final MailQueue queue;
+    private final MailQueueFactory<?> queueFactory;
+    private MailQueue queue;
 
     @Inject
     @VisibleForTesting MailSpool(MailQueueFactory<?> queueFactory) {
+        this.queueFactory = queueFactory;
+    }
+
+    public void start() {
         queue = queueFactory.createQueue(MailQueueFactory.SPOOL);
     }
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/MailSpoolTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/MailSpoolTest.java
index 147f21e..0552c2f 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/MailSpoolTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/send/MailSpoolTest.java
@@ -49,6 +49,7 @@ public class MailSpoolTest {
         myQueue = mailQueueFactory.createQueue(MailQueueFactory.SPOOL);
 
         mailSpool = new MailSpool(mailQueueFactory);
+        mailSpool.start();
     }
 
     @Test
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
index a6de706..21546b9 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.metrics.api.Metric;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueue;
@@ -33,15 +34,12 @@ import org.apache.james.queue.rabbitmq.view.api.MailQueueView;
 import org.apache.mailet.Mail;
 
 import com.github.fge.lambdas.consumers.ThrowingConsumer;
-import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import reactor.rabbitmq.AcknowledgableDelivery;
 import reactor.rabbitmq.ConsumeOptions;
-import reactor.rabbitmq.RabbitFlux;
-import reactor.rabbitmq.ReceiverOptions;
 
 class Dequeuer {
     private static final boolean REQUEUE = true;
@@ -79,14 +77,14 @@ class Dequeuer {
     private final MailReferenceSerializer mailReferenceSerializer;
     private final MailQueueView mailQueueView;
 
-    Dequeuer(MailQueueName name, Mono<Connection> connectionMono, Function<MailReferenceDTO, MailWithEnqueueId> mailLoader,
+    Dequeuer(MailQueueName name, ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, Function<MailReferenceDTO, MailWithEnqueueId> mailLoader,
              MailReferenceSerializer serializer, MetricFactory metricFactory,
              MailQueueView mailQueueView) {
         this.mailLoader = mailLoader;
         this.mailReferenceSerializer = serializer;
         this.mailQueueView = mailQueueView;
         this.dequeueMetric = metricFactory.generate(DEQUEUED_METRIC_NAME_PREFIX + name.asString());
-        this.flux = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionMono))
+        this.flux = reactorRabbitMQChannelPool.createReceiver()
             .consumeManualAck(name.toWorkQueueName().asString(), new ConsumeOptions().qos(EXECUTION_RATE))
             .filter(getResponse -> getResponse.getBody() != null);
     }
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
index ea7d04a..4e0485c 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
@@ -27,6 +27,7 @@ import java.time.Clock;
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.Store;
 import org.apache.james.blob.mail.MimeMessagePartsId;
 import org.apache.james.metrics.api.Metric;
@@ -51,11 +52,11 @@ class Enqueuer {
     private final MailQueueView mailQueueView;
     private final Clock clock;
 
-    Enqueuer(MailQueueName name, Sender sender, Store<MimeMessage, MimeMessagePartsId> mimeMessageStore,
+    Enqueuer(MailQueueName name, ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, Store<MimeMessage, MimeMessagePartsId> mimeMessageStore,
              MailReferenceSerializer serializer, MetricFactory metricFactory,
              MailQueueView mailQueueView, Clock clock) {
         this.name = name;
-        this.sender = sender;
+        this.sender = reactorRabbitMQChannelPool.getSender();
         this.mimeMessageStore = mimeMessageStore;
         this.mailReferenceSerializer = serializer;
         this.mailQueueView = mailQueueView;
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
index b0748c0..b48f60f 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
@@ -32,17 +32,14 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 
-import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.mail.internet.MimeMessage;
 
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.Store;
 import org.apache.james.blob.mail.MimeMessagePartsId;
 import org.apache.james.blob.mail.MimeMessageStore;
-import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.metrics.api.GaugeRegistry;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
@@ -53,23 +50,18 @@ import org.apache.james.queue.rabbitmq.view.api.MailQueueView;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
-import com.rabbitmq.client.Connection;
 
 import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
 import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ExchangeSpecification;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.Sender;
 
-public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQueue>, Startable {
-    private static final int MAX_CHANNELS_NUMBER = 5;
+public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQueue> {
 
     @VisibleForTesting static class PrivateFactory {
         private final MetricFactory metricFactory;
         private final GaugeRegistry gaugeRegistry;
-        private final Mono<Connection> connectionMono;
-        private final Sender sender;
+        private final ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
         private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore;
         private final MailReferenceSerializer mailReferenceSerializer;
         private final Function<MailReferenceDTO, MailWithEnqueueId> mailLoader;
@@ -81,7 +73,8 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
         @Inject
         @VisibleForTesting PrivateFactory(MetricFactory metricFactory,
                                           GaugeRegistry gaugeRegistry,
-                                          Mono<Connection> connectionMono, Sender sender, MimeMessageStore.Factory mimeMessageStoreFactory,
+                                          ReactorRabbitMQChannelPool reactorRabbitMQChannelPool,
+                                          MimeMessageStore.Factory mimeMessageStoreFactory,
                                           BlobId.Factory blobIdFactory,
                                           MailQueueView.Factory mailQueueViewFactory,
                                           Clock clock,
@@ -89,8 +82,7 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
                                           RabbitMQMailQueueConfiguration configuration) {
             this.metricFactory = metricFactory;
             this.gaugeRegistry = gaugeRegistry;
-            this.connectionMono = connectionMono;
-            this.sender = sender;
+            this.reactorRabbitMQChannelPool = reactorRabbitMQChannelPool;
             this.mimeMessageStore = mimeMessageStoreFactory.mimeMessageStore();
             this.mailQueueViewFactory = mailQueueViewFactory;
             this.clock = clock;
@@ -107,9 +99,9 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
             RabbitMQMailQueue rabbitMQMailQueue = new RabbitMQMailQueue(
                 metricFactory,
                 mailQueueName,
-                new Enqueuer(mailQueueName, sender, mimeMessageStore, mailReferenceSerializer,
+                new Enqueuer(mailQueueName, reactorRabbitMQChannelPool, mimeMessageStore, mailReferenceSerializer,
                     metricFactory, mailQueueView, clock),
-                new Dequeuer(mailQueueName, connectionMono, mailLoader, mailReferenceSerializer,
+                new Dequeuer(mailQueueName, reactorRabbitMQChannelPool, mailLoader, mailReferenceSerializer,
                     metricFactory, mailQueueView),
                 mailQueueView,
                 decoratorFactory);
@@ -145,26 +137,19 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
     private final RabbitMQMailQueueManagement mqManagementApi;
     private final PrivateFactory privateFactory;
     private final RabbitMQMailQueueObjectPool mailQueueObjectPool;
-    private final Mono<Connection> connectionMono;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
-    private Sender sender;
+    private final ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @VisibleForTesting
     @Inject
-    RabbitMQMailQueueFactory(SimpleConnectionPool simpleConnectionPool,
+    RabbitMQMailQueueFactory(ReactorRabbitMQChannelPool reactorRabbitMQChannelPool,
                              RabbitMQMailQueueManagement mqManagementApi,
                              PrivateFactory privateFactory) {
-        this.connectionMono = simpleConnectionPool.getResilientConnection();
+        this.reactorRabbitMQChannelPool = reactorRabbitMQChannelPool;
         this.mqManagementApi = mqManagementApi;
         this.privateFactory = privateFactory;
         this.mailQueueObjectPool = new RabbitMQMailQueueObjectPool();
     }
 
-    public void start() {
-        this.reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, MAX_CHANNELS_NUMBER);
-        this.sender = reactorRabbitMQChannelPool.createSender();
-    }
-
     @Override
     public Optional<RabbitMQMailQueue> getQueue(String name) {
         return getQueueFromRabbitServer(MailQueueName.fromString(name));
@@ -187,15 +172,15 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
     private RabbitMQMailQueue createQueueIntoRabbitServer(MailQueueName mailQueueName) {
         String exchangeName = mailQueueName.toRabbitExchangeName().asString();
         Flux.concat(
-            sender.declareExchange(ExchangeSpecification.exchange(exchangeName)
+            reactorRabbitMQChannelPool.getSender().declareExchange(ExchangeSpecification.exchange(exchangeName)
                 .durable(true)
                 .type("direct")),
-            sender.declareQueue(QueueSpecification.queue(mailQueueName.toWorkQueueName().asString())
+            reactorRabbitMQChannelPool.getSender().declareQueue(QueueSpecification.queue(mailQueueName.toWorkQueueName().asString())
                 .durable(DURABLE)
                 .exclusive(!EXCLUSIVE)
                 .autoDelete(!AUTO_DELETE)
                 .arguments(NO_ARGUMENTS)),
-            sender.bind(BindingSpecification.binding()
+            reactorRabbitMQChannelPool.getSender().bind(BindingSpecification.binding()
                 .exchange(mailQueueName.toRabbitExchangeName().asString())
                 .queue(mailQueueName.toWorkQueueName().asString())
                 .routingKey(EMPTY_ROUTING_KEY)))
@@ -210,11 +195,4 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
             .map(mailQueueObjectPool::retrieveInstanceFor)
             .findFirst();
     }
-
-    @PreDestroy
-    public void stop() {
-        sender.close();
-        reactorRabbitMQChannelPool.close();
-    }
-
 }
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 7c23f0f..4ad6f85 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
@@ -61,9 +61,6 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
-import com.rabbitmq.client.Connection;
-
-import reactor.core.publisher.Mono;
 
 class RabbitMQMailQueueConfigurationChangeTest {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
@@ -79,7 +76,6 @@ class RabbitMQMailQueueConfigurationChangeTest {
     private static final Instant IN_SLICE_1 = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final Instant IN_SLICE_2 = IN_SLICE_1.plus(1, HOURS);
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
-    public static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
@@ -94,6 +90,7 @@ class RabbitMQMailQueueConfigurationChangeTest {
     private UpdatableTickingClock clock;
     private RabbitMQMailQueueManagement mqManagementApi;
     private MimeMessageStore.Factory mimeMessageStoreFactory;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setup(CassandraCluster cassandra) throws Exception {
@@ -101,11 +98,14 @@ class RabbitMQMailQueueConfigurationChangeTest {
         mimeMessageStoreFactory = MimeMessageStore.factory(blobsDAO);
         clock = new UpdatableTickingClock(IN_SLICE_1);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
     }
 
     @AfterEach
     void tearDown() {
         mqManagementApi.deleteAllQueues();
+        reactorRabbitMQChannelPool.close();
     }
 
     private RabbitMQMailQueue getRabbitMQMailQueue(CassandraCluster cassandra, CassandraMailQueueViewConfiguration mailQueueViewConfiguration) throws Exception {
@@ -119,21 +119,18 @@ class RabbitMQMailQueueConfigurationChangeTest {
             .sizeMetricsEnabled(true)
             .build();
 
-        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
-        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
+
         RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            connectionMono,
-            reactorRabbitMQChannelPool.createSender(),
+            reactorRabbitMQChannelPool,
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
             clock,
             new RawMailQueueItemDecoratorFactory(),
             mailQueueSizeConfiguration);
-        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, privateFactory);
-        mailQueueFactory.start();
+        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, privateFactory);
         return mailQueueFactory.createQueue(SPOOL);
     }
 
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index 127ed23..0102a05 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -44,6 +44,7 @@ import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
 import org.apache.james.blob.mail.MimeMessageStore;
 import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreModule;
+
 import org.apache.james.metrics.api.Gauge;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueMetricContract;
@@ -68,7 +69,6 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.ArgumentCaptor;
 
 import com.github.fge.lambdas.Throwing;
-import com.rabbitmq.client.Connection;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -84,7 +84,6 @@ class RabbitMQMailQueueTest {
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
     private static final Instant IN_SLICE_5 = IN_SLICE_1.plus(4, HOURS);
     private static final Instant IN_SLICE_7 = IN_SLICE_1.plus(6, HOURS);
-    private static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
@@ -100,9 +99,11 @@ class RabbitMQMailQueueTest {
     private UpdatableTickingClock clock;
     private RabbitMQMailQueue mailQueue;
     private RabbitMQMailQueueManagement mqManagementApi;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @AfterEach
     void tearDown() {
+        reactorRabbitMQChannelPool.close();
         mqManagementApi.deleteAllQueues();
     }
 
@@ -238,11 +239,6 @@ class RabbitMQMailQueueTest {
                 }))
                 .blockLast();
         }
-
-        @AfterEach
-        void tearDown() {
-            mqManagementApi.deleteAllQueues();
-        }
     }
 
     @Nested
@@ -264,11 +260,6 @@ class RabbitMQMailQueueTest {
             ArgumentCaptor<Gauge<?>> gaugeCaptor = ArgumentCaptor.forClass(Gauge.class);
             verify(metricTestSystem.getSpyGaugeRegistry(), never()).register(any(), gaugeCaptor.capture());
         }
-
-        @AfterEach
-        void tearDown() {
-            mqManagementApi.deleteAllQueues();
-        }
     }
 
     private void setUp(CassandraCluster cassandra, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem, RabbitMQMailQueueConfiguration configuration) throws Exception {
@@ -284,14 +275,12 @@ class RabbitMQMailQueueTest {
                 .build(),
             mimeMessageStoreFactory);
 
-        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
-        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
-
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
         RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
             metricTestSystem.getMetricFactory(),
             metricTestSystem.getSpyGaugeRegistry(),
-            connectionMono,
-            reactorRabbitMQChannelPool.createSender(),
+            reactorRabbitMQChannelPool,
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
@@ -299,8 +288,7 @@ class RabbitMQMailQueueTest {
             new RawMailQueueItemDecoratorFactory(),
             configuration);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, factory);
-        mailQueueFactory.start();
+        mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, factory);
         mailQueue = mailQueueFactory.createQueue(SPOOL);
     }
 }
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 fb5b8b7..8ac46b3 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
@@ -46,19 +46,15 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-import com.rabbitmq.client.Connection;
-
-import reactor.core.publisher.Mono;
-
 class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQMailQueue> {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
-    public static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
 
     private RabbitMQMailQueueFactory mailQueueFactory;
     private RabbitMQMailQueueManagement mqManagementApi;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setup() throws Exception {
@@ -72,13 +68,12 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             .sizeMetricsEnabled(true)
             .build();
 
-        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
-        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
         RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            connectionMono,
-            reactorRabbitMQChannelPool.createSender(),
+            reactorRabbitMQChannelPool,
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
@@ -86,13 +81,13 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             new RawMailQueueItemDecoratorFactory(),
             configuration);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, privateFactory);
-        mailQueueFactory.start();
+        mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, privateFactory);
     }
 
     @AfterEach
     void tearDown() {
         mqManagementApi.deleteAllQueues();
+        reactorRabbitMQChannelPool.close();
     }
 
     @Override
diff --git a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
index d2bdeeb..dbb4b8f 100644
--- a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
+++ b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
@@ -42,6 +42,7 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.rabbitmq.client.AMQP;
 import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
+
 import reactor.core.Disposable;
 import reactor.core.publisher.DirectProcessor;
 import reactor.core.publisher.Mono;
@@ -83,7 +84,8 @@ public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Sta
     }
 
     public void start() {
-        sender = channelPool.createSender();
+        channelPool.start();
+        sender = channelPool.getSender();
 
         sender.declareExchange(ExchangeSpecification.exchange(EXCHANGE_NAME)).block();
         sender.declare(QueueSpecification.queue(queueName).durable(false).autoDelete(true)).block();
diff --git a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueue.java b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueue.java
index 21a9880..62a2f1b 100644
--- a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueue.java
+++ b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueue.java
@@ -25,8 +25,6 @@ import java.util.Optional;
 import java.util.UUID;
 
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
-import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskId;
@@ -39,8 +37,8 @@ import org.slf4j.LoggerFactory;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.google.common.collect.ImmutableMap;
 import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
+
 import reactor.core.Disposable;
 import reactor.core.publisher.Mono;
 import reactor.core.publisher.UnicastProcessor;
@@ -51,12 +49,11 @@ import reactor.rabbitmq.ConsumeOptions;
 import reactor.rabbitmq.ExchangeSpecification;
 import reactor.rabbitmq.OutboundMessage;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.RabbitFlux;
 import reactor.rabbitmq.Receiver;
 import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
 
-public class RabbitMQWorkQueue implements WorkQueue, Startable {
+public class RabbitMQWorkQueue implements WorkQueue {
     private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQWorkQueue.class);
 
     // Need at least one by receivers plus a shared one for senders
@@ -71,10 +68,8 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
     public static final String TASK_ID = "taskId";
 
     private final TaskManagerWorker worker;
-    private final Mono<Connection> connectionMono;
     private final ReactorRabbitMQChannelPool channelPool;
     private final JsonTaskSerializer taskSerializer;
-    private Sender sender;
     private RabbitMQExclusiveConsumer receiver;
     private UnicastProcessor<TaskId> sendCancelRequestsQueue;
     private Disposable sendCancelRequestsQueueHandle;
@@ -83,29 +78,28 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
     private Sender cancelRequestSender;
     private Receiver cancelRequestListener;
 
-    public RabbitMQWorkQueue(TaskManagerWorker worker, SimpleConnectionPool simpleConnectionPool, JsonTaskSerializer taskSerializer) {
+    public RabbitMQWorkQueue(TaskManagerWorker worker, ReactorRabbitMQChannelPool reactorRabbitMQChannelPool, JsonTaskSerializer taskSerializer) {
         this.worker = worker;
-        this.connectionMono = simpleConnectionPool.getResilientConnection();
+        this.channelPool = reactorRabbitMQChannelPool;
         this.taskSerializer = taskSerializer;
-        this.channelPool = new ReactorRabbitMQChannelPool(connectionMono, MAX_CHANNELS_NUMBER);
     }
 
+    @Override
     public void start() {
         startWorkqueue();
         listenToCancelRequests();
     }
 
     private void startWorkqueue() {
-        sender = channelPool.createSender();
-        sender.declareExchange(ExchangeSpecification.exchange(EXCHANGE_NAME)).block();
-        sender.declare(QueueSpecification.queue(QUEUE_NAME).durable(true)).block();
-        sender.bind(BindingSpecification.binding(EXCHANGE_NAME, ROUTING_KEY, QUEUE_NAME)).block();
+        channelPool.getSender().declareExchange(ExchangeSpecification.exchange(EXCHANGE_NAME)).block();
+        channelPool.getSender().declare(QueueSpecification.queue(QUEUE_NAME).durable(true)).block();
+        channelPool.getSender().bind(BindingSpecification.binding(EXCHANGE_NAME, ROUTING_KEY, QUEUE_NAME)).block();
 
         consumeWorkqueue();
     }
 
     private void consumeWorkqueue() {
-        receiver = new RabbitMQExclusiveConsumer(new ReceiverOptions().connectionMono(connectionMono));
+        receiver = new RabbitMQExclusiveConsumer(new ReceiverOptions().connectionMono(channelPool.getConnectionMono()));
         receiverHandle = receiver.consumeExclusiveManualAck(QUEUE_NAME, new ConsumeOptions())
             .subscribeOn(Schedulers.boundedElastic())
             .flatMap(this::executeTask)
@@ -143,7 +137,7 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
     }
 
     void listenToCancelRequests() {
-        cancelRequestSender = channelPool.createSender();
+        cancelRequestSender = channelPool.getSender();
         String queueName = CANCEL_REQUESTS_QUEUE_NAME_PREFIX + UUID.randomUUID().toString();
 
         cancelRequestSender.declareExchange(ExchangeSpecification.exchange(CANCEL_REQUESTS_EXCHANGE_NAME)).block();
@@ -159,8 +153,7 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
     }
 
     private void registerCancelRequestsListener(String queueName) {
-        cancelRequestListener = RabbitFlux
-            .createReceiver(new ReceiverOptions().connectionMono(connectionMono));
+        cancelRequestListener = channelPool.createReceiver();
         cancelRequestListenerHandle = cancelRequestListener
             .consumeAutoAck(queueName)
             .subscribeOn(Schedulers.boundedElastic())
@@ -188,7 +181,7 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
                 .headers(ImmutableMap.of(TASK_ID, taskWithId.getId().asString()))
                 .build();
             OutboundMessage outboundMessage = new OutboundMessage(EXCHANGE_NAME, ROUTING_KEY, basicProperties, payload);
-            sender.send(Mono.just(outboundMessage)).block();
+            channelPool.getSender().send(Mono.just(outboundMessage)).block();
         } catch (JsonProcessingException e) {
             throw new RuntimeException(e);
         }
@@ -203,12 +196,9 @@ public class RabbitMQWorkQueue implements WorkQueue, Startable {
     public void close() {
         Optional.ofNullable(receiverHandle).ifPresent(Disposable::dispose);
         Optional.ofNullable(receiver).ifPresent(RabbitMQExclusiveConsumer::close);
-        Optional.ofNullable(sender).ifPresent(Sender::close);
         Optional.ofNullable(sendCancelRequestsQueueHandle).ifPresent(Disposable::dispose);
         Optional.ofNullable(cancelRequestListenerHandle).ifPresent(Disposable::dispose);
-        Optional.ofNullable(sender).ifPresent(Sender::close);
         Optional.ofNullable(cancelRequestSender).ifPresent(Sender::close);
         Optional.ofNullable(cancelRequestListener).ifPresent(Receiver::close);
-        channelPool.close();
     }
 }
diff --git a/server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueSupplier.scala b/server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueSupplier.scala
index f86be44..7feed07 100644
--- a/server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueSupplier.scala
+++ b/server/task/task-distributed/src/main/scala/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueSupplier.scala
@@ -22,13 +22,13 @@ import java.time.Duration
 
 import com.google.common.annotations.VisibleForTesting
 import javax.inject.Inject
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool
 import org.apache.james.eventsourcing.EventSourcingSystem
 import org.apache.james.server.task.json.JsonTaskSerializer
 import org.apache.james.task.SerialTaskManagerWorker
 import org.apache.james.task.eventsourcing.{WorkQueueSupplier, WorkerStatusListener}
 
-class RabbitMQWorkQueueSupplier @Inject()(private val rabbitMQConnectionPool: SimpleConnectionPool,
+class RabbitMQWorkQueueSupplier @Inject()(private val rabbitMQConnectionPool: ReactorRabbitMQChannelPool,
                                 private val jsonTaskSerializer: JsonTaskSerializer) extends WorkQueueSupplier {
 
   val DEFAULT_ADDITIONAL_INFORMATION_POLLING_INTERVAL =  Duration.ofSeconds(30)
@@ -41,7 +41,6 @@ class RabbitMQWorkQueueSupplier @Inject()(private val rabbitMQConnectionPool: Si
     val listener = WorkerStatusListener(eventSourcingSystem)
     val worker = new SerialTaskManagerWorker(listener, additionalInformationPollingInterval)
     val rabbitMQWorkQueue = new RabbitMQWorkQueue(worker, rabbitMQConnectionPool, jsonTaskSerializer)
-    rabbitMQWorkQueue.start()
     rabbitMQWorkQueue
   }
 }
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
index 42f6f25..83c60d8 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
@@ -34,7 +34,7 @@ import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.init.CassandraZonedDateTimeModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.eventsourcing.EventSourcingSystem;
 import org.apache.james.eventsourcing.eventstore.EventStore;
 import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreExtension;
@@ -74,11 +74,13 @@ import com.github.steveash.guavate.Guavate;
 
 class DistributedTaskManagerTest implements TaskManagerContract {
 
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
+
     private static class TrackedRabbitMQWorkQueueSupplier implements WorkQueueSupplier {
         private final List<RabbitMQWorkQueue> workQueues;
         private final RabbitMQWorkQueueSupplier supplier;
 
-        TrackedRabbitMQWorkQueueSupplier(SimpleConnectionPool rabbitConnectionPool, JsonTaskSerializer taskSerializer) {
+        TrackedRabbitMQWorkQueueSupplier(ReactorRabbitMQChannelPool rabbitConnectionPool, JsonTaskSerializer taskSerializer) {
             workQueues = new ArrayList<>();
             supplier = new RabbitMQWorkQueueSupplier(rabbitConnectionPool, taskSerializer);
         }
@@ -86,6 +88,7 @@ class DistributedTaskManagerTest implements TaskManagerContract {
         @Override
         public WorkQueue apply(EventSourcingSystem eventSourcingSystem) {
             RabbitMQWorkQueue workQueue = supplier.apply(eventSourcingSystem, UPDATE_INFORMATION_POLLING_INTERVAL);
+            workQueue.start();
             workQueues.add(workQueue);
             return workQueue;
         }
@@ -138,7 +141,9 @@ class DistributedTaskManagerTest implements TaskManagerContract {
 
     @BeforeEach
     void setUp(EventStore eventStore) {
-        workQueueSupplier = new TrackedRabbitMQWorkQueueSupplier(rabbitMQExtension.getRabbitConnectionPool(), TASK_SERIALIZER);
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
+        workQueueSupplier = new TrackedRabbitMQWorkQueueSupplier(reactorRabbitMQChannelPool, TASK_SERIALIZER);
         this.eventStore = eventStore;
         terminationSubscribers = new ArrayList<>();
     }
@@ -147,6 +152,7 @@ class DistributedTaskManagerTest implements TaskManagerContract {
     void tearDown() {
         terminationSubscribers.forEach(RabbitMQTerminationSubscriber::close);
         workQueueSupplier.stopWorkQueues();
+        reactorRabbitMQChannelPool.close();
     }
 
     public EventSourcingTaskManager taskManager() {
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
index 91af0e2..5468af1 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
@@ -35,6 +35,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.apache.james.server.task.json.TestTask;
 import org.apache.james.server.task.json.dto.TestTaskDTOModules;
@@ -68,6 +69,7 @@ class RabbitMQWorkQueueTest {
     private RabbitMQWorkQueue testee;
     private ImmediateWorker worker;
     private JsonTaskSerializer serializer;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     private static class ImmediateWorker implements TaskManagerWorker {
 
@@ -101,13 +103,16 @@ class RabbitMQWorkQueueTest {
     void setUp() {
         worker = spy(new ImmediateWorker());
         serializer = new JsonTaskSerializer(TestTaskDTOModules.COMPLETED_TASK_MODULE);
-        testee = new RabbitMQWorkQueue(worker, rabbitMQExtension.getRabbitConnectionPool(), serializer);
+        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
+        reactorRabbitMQChannelPool.start();
+        testee = new RabbitMQWorkQueue(worker, reactorRabbitMQChannelPool, serializer);
         testee.start();
     }
 
     @AfterEach
     void tearDown() {
         testee.close();
+        reactorRabbitMQChannelPool.close();
     }
 
     @Test
@@ -132,7 +137,7 @@ class RabbitMQWorkQueueTest {
         testee.submit(TASK_WITH_ID);
 
         ImmediateWorker otherTaskManagerWorker = new ImmediateWorker();
-        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, rabbitMQExtension.getRabbitConnectionPool(), serializer)) {
+        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, reactorRabbitMQChannelPool, serializer)) {
             otherWorkQueue.start();
 
             IntStream.range(0, 9)
@@ -151,7 +156,7 @@ class RabbitMQWorkQueueTest {
 
         ImmediateWorker otherTaskManagerWorker = new ImmediateWorker();
         JsonTaskSerializer otherTaskSerializer = new JsonTaskSerializer(TestTaskDTOModules.TEST_TYPE);
-        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, rabbitMQExtension.getRabbitConnectionPool(), otherTaskSerializer)) {
+        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, reactorRabbitMQChannelPool, otherTaskSerializer)) {
             //wait to be sur that the first workqueue has subscribed as an exclusive consumer of the RabbitMQ queue.
             Thread.sleep(200);
             otherWorkQueue.start();
diff --git a/server/task/task-memory/pom.xml b/server/task/task-memory/pom.xml
index 0b60d59..e6dccd7 100644
--- a/server/task/task-memory/pom.xml
+++ b/server/task/task-memory/pom.xml
@@ -44,6 +44,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-lifecycle-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>
diff --git a/server/task/task-memory/src/main/java/org/apache/james/task/WorkQueue.java b/server/task/task-memory/src/main/java/org/apache/james/task/WorkQueue.java
index ae363ff..8a4f490 100644
--- a/server/task/task-memory/src/main/java/org/apache/james/task/WorkQueue.java
+++ b/server/task/task-memory/src/main/java/org/apache/james/task/WorkQueue.java
@@ -20,7 +20,13 @@ package org.apache.james.task;
 
 import java.io.Closeable;
 
-public interface WorkQueue extends Closeable {
+import org.apache.james.lifecycle.api.Startable;
+
+public interface WorkQueue extends Closeable, Startable {
+
+    default void start() {
+
+    }
 
     void submit(TaskWithId taskWithId);
 
diff --git a/server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/EventSourcingTaskManager.scala b/server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/EventSourcingTaskManager.scala
index 35856b0..fe2d869 100644
--- a/server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/EventSourcingTaskManager.scala
+++ b/server/task/task-memory/src/main/scala/org/apache/james/task/eventsourcing/EventSourcingTaskManager.scala
@@ -22,14 +22,15 @@ import java.io.Closeable
 import java.time.Duration
 import java.util
 
+import com.google.common.annotations.VisibleForTesting
+import javax.annotation.PreDestroy
 import javax.inject.Inject
 import org.apache.james.eventsourcing.eventstore.{EventStore, History}
 import org.apache.james.eventsourcing.{AggregateId, Subscriber}
+import org.apache.james.lifecycle.api.Startable
 import org.apache.james.task.TaskManager.ReachedTimeoutException
 import org.apache.james.task._
 import org.apache.james.task.eventsourcing.TaskCommand._
-import com.google.common.annotations.VisibleForTesting
-import javax.annotation.PreDestroy
 import reactor.core.publisher.{Flux, Mono}
 import reactor.core.scheduler.Schedulers
 
@@ -38,7 +39,7 @@ class EventSourcingTaskManager @Inject @VisibleForTesting private[eventsourcing]
                                                                                   val eventStore: EventStore,
                                                                                   val executionDetailsProjection: TaskExecutionDetailsProjection,
                                                                                   val hostname: Hostname,
-                                                                                  val terminationSubscriber: TerminationSubscriber) extends TaskManager with Closeable {
+                                                                                  val terminationSubscriber: TerminationSubscriber) extends TaskManager with Closeable with Startable {
 
   private def workDispatcher: Subscriber = {
     case Created(aggregateId, _, task, _) =>
@@ -69,6 +70,8 @@ class EventSourcingTaskManager @Inject @VisibleForTesting private[eventsourcing]
 
   private val workQueue: WorkQueue = workQueueSupplier(eventSourcingSystem)
 
+  def start(): Unit = workQueue.start()
+
   override def submit(task: Task): TaskId = {
     val taskId = TaskId.generateTaskId
     val command = Create(taskId, task)


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


[james-project] 12/30: JAMES-2948 Allow 255 characters-usernames to be created

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b9f55a83c13c8c71562843a4e88aa0a1ea8d7911
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Wed Oct 30 14:54:14 2019 +0100

    JAMES-2948 Allow 255 characters-usernames to be created
---
 core/src/main/java/org/apache/james/core/User.java     |  4 +++-
 core/src/test/java/org/apache/james/core/UserTest.java | 18 +++++++++++++++++-
 server/protocols/webadmin/webadmin-data/pom.xml        |  9 +++++++++
 .../org/apache/james/webadmin/service/UserService.java |  6 +-----
 .../apache/james/webadmin/routes/UsersRoutesTest.java  | 12 ++++++++++++
 5 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/User.java b/core/src/main/java/org/apache/james/core/User.java
index 299f767..044f730 100644
--- a/core/src/main/java/org/apache/james/core/User.java
+++ b/core/src/main/java/org/apache/james/core/User.java
@@ -32,9 +32,11 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 
 public class User {
+    public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
+
     public static User fromUsername(String username) {
-        Preconditions.checkNotNull(username);
         Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
+        Preconditions.checkArgument(username.length() <= MAXIMUM_MAIL_ADDRESS_LENGTH);
 
         List<String> parts = ImmutableList.copyOf(Splitter.on('@').split(username));
         switch (parts.size()) {
diff --git a/core/src/test/java/org/apache/james/core/UserTest.java b/core/src/test/java/org/apache/james/core/UserTest.java
index 29ae95b..bbf83d9 100644
--- a/core/src/test/java/org/apache/james/core/UserTest.java
+++ b/core/src/test/java/org/apache/james/core/UserTest.java
@@ -24,6 +24,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
+import org.apache.commons.lang3.StringUtils;
+
 import org.junit.Test;
 
 public class UserTest {
@@ -116,7 +118,7 @@ public class UserTest {
     @Test
     public void fromUsernameShouldThrowOnNull() {
         assertThatThrownBy(() -> User.fromUsername(null))
-            .isInstanceOf(NullPointerException.class);
+            .isInstanceOf(IllegalArgumentException.class);
     }
 
     @Test
@@ -126,6 +128,20 @@ public class UserTest {
     }
 
     @Test
+    public void fromUsernameShouldAllow255LongUsername() {
+        String tail = "@a";
+        assertThat(User.fromUsername(StringUtils.repeat('j', 255 - tail.length()) + tail).asString())
+            .hasSize(255);
+    }
+
+    @Test
+    public void fromUsernameShouldThrowWhenTooLong() {
+        String tail = "@a";
+        assertThatThrownBy(() -> User.fromUsername(StringUtils.repeat('j', 255 - tail.length() + 1) + tail))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
     public void fromUsernameShouldThrowWhenMultipleDomainDelimiter() {
         assertThatThrownBy(() -> User.fromUsername("aa@aa@aa"))
             .isInstanceOf(IllegalArgumentException.class);
diff --git a/server/protocols/webadmin/webadmin-data/pom.xml b/server/protocols/webadmin/webadmin-data/pom.xml
index 30b0527..8694906 100644
--- a/server/protocols/webadmin/webadmin-data/pom.xml
+++ b/server/protocols/webadmin/webadmin-data/pom.xml
@@ -88,6 +88,15 @@
             <artifactId>guava</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
+        <dependency>
             <groupId>io.rest-assured</groupId>
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
index c31357b..9b09d7a 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
@@ -36,8 +36,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.steveash.guavate.Guavate;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Strings;
 
 import spark.Response;
 
@@ -51,7 +49,6 @@ public class UserService {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(UserService.class);
     private static final String EMPTY_BODY = "";
-    public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
 
     private final UsersRepository usersRepository;
 
@@ -88,8 +85,7 @@ public class UserService {
 
     private void usernamePreconditions(String username) {
         try {
-            Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
-            Preconditions.checkArgument(username.length() < MAXIMUM_MAIL_ADDRESS_LENGTH);
+            org.apache.james.core.User.fromUsername(username);
         } catch (IllegalArgumentException e) {
             throw new InvalidUsername(e);
         }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index ce287bb..e43b8ea 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -32,6 +32,7 @@ import static org.mockito.Mockito.when;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.user.api.UsersRepository;
@@ -143,6 +144,17 @@ class UsersRoutesTest {
         }
 
         @Test
+        void putShouldReturnOkWhenWithA255LongUsername() {
+            String usernameTail = "@" + DOMAIN.name();
+            given()
+                .body("{\"password\":\"password\"}")
+            .when()
+                .put(StringUtils.repeat('j', 255 - usernameTail.length()) + usernameTail)
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
         void putShouldReturnRequireNonNullPassword() {
             given()
                 .body("{\"password\":null}")


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


[james-project] 22/30: JAMES-2957 Tail recursive refactoring "extracting message body"

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit fedf72894f1c438a213d8d94ed887c4fe09c1d2c
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Mon Nov 4 09:53:20 2019 +0700

    JAMES-2957 Tail recursive refactoring "extracting message body"
---
 .../apache/james/transport/matchers/dlp/DlpDomainRules.java  | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
index 3fbf59a..9f44886 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/matchers/dlp/DlpDomainRules.java
@@ -106,16 +106,22 @@ public class DlpDomainRules {
                 if (content instanceof String) {
                     return Stream.of((String) content);
                 }
+
+                return extractContentsComplexType(content)
+                    .flatMap(Throwing.function(this::getMessageBodiesFromContent).sneakyThrow());
+            }
+
+            private Stream<Object> extractContentsComplexType(Object content) throws IOException, MessagingException {
                 if (content instanceof Message) {
                     Message message = (Message) content;
-                    return getMessageBodiesFromContent(message.getContent());
+                    return Stream.of(message.getContent());
                 }
                 if (content instanceof Multipart) {
                     return MultipartUtil.retrieveBodyParts((Multipart) content)
                         .stream()
-                        .map(Throwing.function(BodyPart::getContent).sneakyThrow())
-                        .flatMap(Throwing.function(this::getMessageBodiesFromContent).sneakyThrow());
+                        .map(Throwing.function(BodyPart::getContent).sneakyThrow());
                 }
+
                 return Stream.of();
             }
         }


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


[james-project] 28/30: JAMES-2959 SieveQuotaRoutes should return bad request when invalid body

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 66fa9210507fed343b167e28f4b7962bbc0baeae
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Nov 1 17:14:57 2019 +0700

    JAMES-2959 SieveQuotaRoutes should return bad request when invalid body
    
    - Invalid body: invalid number format, invalid integer format
    - Remove the unnecessary json extraction of a single long value. Just
    use Long.parseLong() directly
---
 .../james/webadmin/routes/SieveQuotaRoutes.java    | 56 ++++++++--------------
 .../webadmin/routes/SieveQuotaRoutesTest.java      | 31 ++++++++++--
 2 files changed, 48 insertions(+), 39 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
index 5ae5def..de6f71c 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
@@ -34,13 +34,9 @@ import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.api.exception.QuotaNotFoundException;
 import org.apache.james.webadmin.Routes;
 import org.apache.james.webadmin.utils.ErrorResponder;
-import org.apache.james.webadmin.utils.JsonExtractException;
-import org.apache.james.webadmin.utils.JsonExtractor;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.apache.james.webadmin.utils.Responses;
 import org.eclipse.jetty.http.HttpStatus;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Joiner;
 
@@ -63,17 +59,14 @@ public class SieveQuotaRoutes implements Routes {
     private static final String USER_ID = "userId";
     private static final String USER_SIEVE_QUOTA_PATH = Joiner.on(SEPARATOR).join(ROOT_PATH, "users", ":" + USER_ID);
     private static final String REQUESTED_SIZE = "requestedSize";
-    private static final Logger LOGGER = LoggerFactory.getLogger(SieveQuotaRoutes.class);
 
     private final SieveQuotaRepository sieveQuotaRepository;
     private final JsonTransformer jsonTransformer;
-    private final JsonExtractor<Long> jsonExtractor;
 
     @Inject
     public SieveQuotaRoutes(SieveQuotaRepository sieveQuotaRepository, JsonTransformer jsonTransformer) {
         this.sieveQuotaRepository = sieveQuotaRepository;
         this.jsonTransformer = jsonTransformer;
-        this.jsonExtractor = new JsonExtractor<>(Long.class);
     }
 
     @Override
@@ -123,19 +116,9 @@ public class SieveQuotaRoutes implements Routes {
     })
     public void defineUpdateGlobalSieveQuota(Service service) {
         service.put(DEFAULT_QUOTA_PATH, (request, response) -> {
-            try {
-                QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
-                sieveQuotaRepository.setDefaultQuota(requestedSize);
-                return Responses.returnNoContent(response);
-            } catch (JsonExtractException e) {
-                LOGGER.info("Malformed JSON", e);
-                throw ErrorResponder.builder()
-                    .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                    .statusCode(HttpStatus.BAD_REQUEST_400)
-                    .message("Malformed JSON")
-                    .cause(e)
-                    .haltError();
-            }
+            QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
+            sieveQuotaRepository.setDefaultQuota(requestedSize);
+            return Responses.returnNoContent(response);
         }, jsonTransformer);
     }
 
@@ -193,19 +176,9 @@ public class SieveQuotaRoutes implements Routes {
     public void defineUpdatePerUserSieveQuota(Service service) {
         service.put(USER_SIEVE_QUOTA_PATH, (request, response) -> {
             User userId = User.fromUsername(request.params(USER_ID));
-            try {
-                QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
-                sieveQuotaRepository.setQuota(userId, requestedSize);
-                return Responses.returnNoContent(response);
-            } catch (JsonExtractException e) {
-                LOGGER.info("Malformed JSON", e);
-                throw ErrorResponder.builder()
-                    .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
-                    .statusCode(HttpStatus.BAD_REQUEST_400)
-                    .message("Malformed JSON")
-                    .cause(e)
-                    .haltError();
-            }
+            QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
+            sieveQuotaRepository.setQuota(userId, requestedSize);
+            return Responses.returnNoContent(response);
         }, jsonTransformer);
     }
 
@@ -230,8 +203,8 @@ public class SieveQuotaRoutes implements Routes {
         });
     }
 
-    private QuotaSize extractRequestedQuotaSizeFromRequest(Request request) throws JsonExtractException {
-        Long requestedSize = jsonExtractor.parse(request.body());
+    private QuotaSize extractRequestedQuotaSizeFromRequest(Request request) {
+        long requestedSize = extractNumberFromRequestBody(request);
         if (requestedSize < 0) {
             throw ErrorResponder.builder()
                 .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
@@ -241,4 +214,17 @@ public class SieveQuotaRoutes implements Routes {
         }
         return QuotaSize.size(requestedSize);
     }
+
+    private long extractNumberFromRequestBody(Request request) {
+        String body = request.body();
+        try {
+            return Long.parseLong(body);
+        } catch (NumberFormatException e) {
+            throw ErrorResponder.builder()
+                .type(ErrorResponder.ErrorType.INVALID_ARGUMENT)
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .message(String.format("unrecognized integer number '%s'", body))
+                .haltError();
+        }
+    }
 }
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
index 1bb159b..863cfb6 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
@@ -21,6 +21,7 @@ package org.apache.james.webadmin.routes;
 
 import static io.restassured.RestAssured.given;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.is;
 
 import org.apache.james.core.User;
 import org.apache.james.core.quota.QuotaSize;
@@ -99,12 +100,23 @@ class SieveQuotaRoutesTest {
     }
 
     @Test
-    void updateGlobalSieveQuotaShouldReturn400WhenMalformedJSON() {
+    void updateGlobalSieveQuotaShouldReturn400WhenInvalidNumberFormatInTheBody() {
         given()
             .body("invalid")
             .put("/sieve/quota/default")
         .then()
-            .statusCode(HttpStatus.BAD_REQUEST_400);
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("message", is("unrecognized integer number 'invalid'"));
+    }
+
+    @Test
+    void updateGlobalSieveQuotaShouldReturn400WhenInvalidIntegerFormatInTheBody() {
+        given()
+            .body("1900.999")
+            .put("/sieve/quota/default")
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("message", is("unrecognized integer number '1900.999'"));
     }
 
     @Test
@@ -174,12 +186,23 @@ class SieveQuotaRoutesTest {
     }
 
     @Test
-    void updatePerUserSieveQuotaShouldReturn400WhenMalformedJSON() {
+    void updatePerUserSieveQuotaShouldReturn400WhenInvalidNumberFormatInTheBody() {
         given()
             .body("invalid")
             .put("/sieve/quota/users/" + USER_A.asString())
         .then()
-            .statusCode(HttpStatus.BAD_REQUEST_400);
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("message", is("unrecognized integer number 'invalid'"));
+    }
+
+    @Test
+    void updatePerUserSieveQuotaShouldReturn400WhenInvalidIntegerFormatInTheBody() {
+        given()
+            .body("89884743.9999")
+            .put("/sieve/quota/users/" + USER_A.asString())
+        .then()
+            .statusCode(HttpStatus.BAD_REQUEST_400)
+            .body("message", is("unrecognized integer number '89884743.9999'"));
     }
 
     @Test


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


[james-project] 03/30: JAMES-2937 RabbitMQHealthCheck is testing a non used channel pool

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 3e6ea8bd7f4021755cb2dea98a317499be028b37
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 13:43:23 2019 +0700

    JAMES-2937 RabbitMQHealthCheck is testing a non used channel pool
    
    Our production code no longer uses SimpleChannelPool but Reactor channel pool
---
 .../james/backends/rabbitmq/RabbitMQHealthCheck.java     |  8 +++++---
 .../backends/rabbitmq/ReactorRabbitMQChannelPool.java    | 10 ++++++++++
 .../james/backends/rabbitmq/RabbitMQExtension.java       | 16 ++++++++--------
 .../james/backends/rabbitmq/RabbitMQHealthCheckTest.java |  4 ++--
 .../rabbitmq/ReactorRabbitMQChannelPoolTest.java         |  2 +-
 5 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheck.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheck.java
index d766a5f..7946173 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheck.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheck.java
@@ -31,10 +31,12 @@ public class RabbitMQHealthCheck implements HealthCheck {
     private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQHealthCheck.class);
     private static final ComponentName COMPONENT_NAME = new ComponentName("RabbitMQ backend");
 
-    private final RabbitMQChannelPool rabbitChannelPoolImpl;
+    private final SimpleConnectionPool connectionPool;
+    private final ReactorRabbitMQChannelPool rabbitChannelPoolImpl;
 
     @Inject
-    public RabbitMQHealthCheck(RabbitMQChannelPool rabbitChannelPoolImpl) {
+    public RabbitMQHealthCheck(SimpleConnectionPool connectionPool, ReactorRabbitMQChannelPool rabbitChannelPoolImpl) {
+        this.connectionPool = connectionPool;
         this.rabbitChannelPoolImpl = rabbitChannelPoolImpl;
     }
 
@@ -46,7 +48,7 @@ public class RabbitMQHealthCheck implements HealthCheck {
     @Override
     public Result check() {
         try {
-            if (rabbitChannelPoolImpl.tryConnection()) {
+            if (connectionPool.tryConnection() && rabbitChannelPoolImpl.tryChannel()) {
                 return Result.healthy(COMPONENT_NAME);
             } else {
                 String message = "The created connection was not opened";
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
index e240b93..645a68a 100644
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
+++ b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPool.java
@@ -37,6 +37,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.fge.lambdas.Throwing;
+import com.google.common.base.Preconditions;
 import com.rabbitmq.client.Channel;
 import com.rabbitmq.client.Connection;
 
@@ -138,6 +139,7 @@ public class ReactorRabbitMQChannelPool implements ChannelPool, Startable {
     public Mono<? extends Channel> getChannelMono() {
         return Mono.fromCallable(() -> {
             Channel channel = pool.borrowObject(MAXIMUM_BORROW_TIMEOUT_IN_MS);
+            Preconditions.checkArgument(channel.isOpen());
             borrowedChannels.add(channel);
             return channel;
         });
@@ -182,4 +184,12 @@ public class ReactorRabbitMQChannelPool implements ChannelPool, Startable {
         borrowedChannels.clear();
         pool.close();
     }
+
+    public boolean tryChannel() {
+        try {
+            return getChannelMono().block().isOpen();
+        } catch (Throwable t) {
+            return false;
+        }
+    }
 }
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
index 668b808..a909bb0 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQExtension.java
@@ -93,8 +93,7 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
     private final DockerRabbitMQ rabbitMQ;
     private final DockerRestartPolicy dockerRestartPolicy;
 
-    private SimpleChannelPool simpleChannelPool;
-    private RabbitMQConnectionFactory connectionFactory;
+    private ReactorRabbitMQChannelPool channelPool;
     private SimpleConnectionPool connectionPool;
 
     public RabbitMQExtension(DockerRabbitMQ rabbitMQ,
@@ -112,14 +111,15 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
     public void beforeEach(ExtensionContext extensionContext) throws Exception {
         dockerRestartPolicy.beforeEach(rabbitMQ);
 
-        connectionFactory = createRabbitConnectionFactory();
+        RabbitMQConnectionFactory connectionFactory = createRabbitConnectionFactory();
         connectionPool = new SimpleConnectionPool(connectionFactory);
-        this.simpleChannelPool = new SimpleChannelPool(connectionPool);
+        channelPool = new ReactorRabbitMQChannelPool(connectionPool);
+        channelPool.start();
     }
 
     @Override
     public void afterEach(ExtensionContext context) throws Exception {
-        simpleChannelPool.close();
+        channelPool.close();
         connectionPool.close();
         rabbitMQ.reset();
         dockerRestartPolicy.afterEach(rabbitMQ);
@@ -140,11 +140,11 @@ public class RabbitMQExtension implements BeforeAllCallback, BeforeEachCallback,
         return rabbitMQ;
     }
 
-    public RabbitMQChannelPool getRabbitChannelPool() {
-        return simpleChannelPool;
+    public ReactorRabbitMQChannelPool getRabbitChannelPool() {
+        return channelPool;
     }
 
-    public SimpleConnectionPool getRabbitConnectionPool() {
+    public SimpleConnectionPool getConnectionPool() {
         return connectionPool;
     }
 
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
index 15c22c3..9f1d9f8 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/RabbitMQHealthCheckTest.java
@@ -35,8 +35,8 @@ class RabbitMQHealthCheckTest {
     private RabbitMQHealthCheck healthCheck;
 
     @BeforeEach
-    void setUp() throws Exception {
-        healthCheck = new RabbitMQHealthCheck(rabbitMQExtension.getRabbitChannelPool());
+    void setUp() {
+        healthCheck = new RabbitMQHealthCheck(rabbitMQExtension.getConnectionPool(), rabbitMQExtension.getRabbitChannelPool());
     }
 
     @AfterEach
diff --git a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
index 21be0bd..9eaf53f 100644
--- a/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
+++ b/backends-common/rabbitmq/src/test/java/org/apache/james/backends/rabbitmq/ReactorRabbitMQChannelPoolTest.java
@@ -67,7 +67,7 @@ class ReactorRabbitMQChannelPoolTest implements ChannelPoolContract {
 
     private ReactorRabbitMQChannelPool generateChannelPool(int poolSize) {
         ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(
-            rabbitMQExtension.getRabbitConnectionPool().getResilientConnection(),
+            rabbitMQExtension.getConnectionPool().getResilientConnection(),
             poolSize);
         reactorRabbitMQChannelPool.start();
         return reactorRabbitMQChannelPool;


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


[james-project] 04/30: JAMES-2937 RabbitMQTerminationSubscriber should not initialize his own channelPool

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 27d3fa4208f77b89b6813c58951692a697ef26cc
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 13:44:32 2019 +0700

    JAMES-2937 RabbitMQTerminationSubscriber should not initialize his own
    channelPool
---
 .../distributed/RabbitMQTerminationSubscriber.java         | 14 +++-----------
 .../distributed/RabbitMQTerminationSubscriberTest.java     |  3 ++-
 2 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
index dbb4b8f..44a17f5 100644
--- a/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
+++ b/server/task/task-distributed/src/main/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriber.java
@@ -29,7 +29,6 @@ import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
-import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
 import org.apache.james.eventsourcing.Event;
 import org.apache.james.eventsourcing.eventstore.cassandra.JsonEventSerializer;
 import org.apache.james.lifecycle.api.Startable;
@@ -40,7 +39,6 @@ import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.rabbitmq.client.AMQP;
-import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
 
 import reactor.core.Disposable;
@@ -52,9 +50,7 @@ import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ExchangeSpecification;
 import reactor.rabbitmq.OutboundMessage;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.RabbitFlux;
 import reactor.rabbitmq.Receiver;
-import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
 
 public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Startable, Closeable {
@@ -65,7 +61,6 @@ public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Sta
     private static final String ROUTING_KEY = "terminationSubscriberRoutingKey";
 
     private final JsonEventSerializer serializer;
-    private final Mono<Connection> connectionMono;
     private final ReactorRabbitMQChannelPool channelPool;
     private final String queueName;
     private UnicastProcessor<OutboundMessage> sendQueue;
@@ -76,15 +71,13 @@ public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Sta
     private Sender sender;
 
     @Inject
-    public RabbitMQTerminationSubscriber(SimpleConnectionPool simpleConnectionPool, JsonEventSerializer serializer) {
+    RabbitMQTerminationSubscriber(ReactorRabbitMQChannelPool channelPool, JsonEventSerializer serializer) {
         this.serializer = serializer;
-        this.connectionMono = simpleConnectionPool.getResilientConnection();
-        this.channelPool = new ReactorRabbitMQChannelPool(connectionMono, MAX_CHANNELS_NUMBER);
+        this.channelPool = channelPool;
         this.queueName = QUEUE_NAME_PREFIX + UUID.randomUUID().toString();
     }
 
     public void start() {
-        channelPool.start();
         sender = channelPool.getSender();
 
         sender.declareExchange(ExchangeSpecification.exchange(EXCHANGE_NAME)).block();
@@ -96,7 +89,7 @@ public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Sta
             .subscribeOn(Schedulers.boundedElastic())
             .subscribe();
 
-        listenerReceiver = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionMono));
+        listenerReceiver = channelPool.createReceiver();
         listener = DirectProcessor.create();
         listenQueueHandle = listenerReceiver
             .consumeAutoAck(queueName)
@@ -141,6 +134,5 @@ public class RabbitMQTerminationSubscriber implements TerminationSubscriber, Sta
         Optional.ofNullable(listenQueueHandle).ifPresent(Disposable::dispose);
         Optional.ofNullable(listenerReceiver).ifPresent(Receiver::close);
         Optional.ofNullable(sender).ifPresent(Sender::close);
-        channelPool.close();
     }
 }
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
index d878c69..e826690 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQTerminationSubscriberTest.java
@@ -40,6 +40,7 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.steveash.guavate.Guavate;
+
 import reactor.core.publisher.Flux;
 
 class RabbitMQTerminationSubscriberTest implements TerminationSubscriberContract {
@@ -53,7 +54,7 @@ class RabbitMQTerminationSubscriberTest implements TerminationSubscriberContract
 
     @Override
     public TerminationSubscriber subscriber() {
-        RabbitMQTerminationSubscriber subscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getRabbitConnectionPool(), SERIALIZER);
+        RabbitMQTerminationSubscriber subscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getRabbitChannelPool(), SERIALIZER);
         subscriber.start();
         return subscriber;
     }


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


[james-project] 21/30: JAMES-2957 Exclude geronimo java mail in the classpath

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit dc182e25fea52b7207b7045d44a502d2f43399e3
Author: Tran Tien Duc <dt...@linagora.com>
AuthorDate: Fri Nov 1 11:35:22 2019 +0700

    JAMES-2957 Exclude geronimo java mail in the classpath
---
 server/mailet/dkim/pom.xml                                            | 4 ++++
 .../java/org/apache/james/transport/mailets/DlpIntegrationTest.java   | 3 ---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/server/mailet/dkim/pom.xml b/server/mailet/dkim/pom.xml
index 5f3cd88..a4c2d26 100644
--- a/server/mailet/dkim/pom.xml
+++ b/server/mailet/dkim/pom.xml
@@ -71,6 +71,10 @@
                     <groupId>log4j</groupId>
                     <artifactId>log4j</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>org.apache.geronimo.javamail</groupId>
+                    <artifactId>geronimo-javamail_1.4_mail</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
         <dependency>
diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
index aa49e1d..f1be200 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/DlpIntegrationTest.java
@@ -48,7 +48,6 @@ import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.mailet.base.test.FakeMail;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.After;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -241,8 +240,6 @@ public class DlpIntegrationTest {
         awaitAtMostOneMinute.until(() -> containsExactlyOneMail(repositoryUrl));
     }
 
-    @Ignore("Dlp got an exception of parsing email body containing attachment with a part of error message: " +
-        "javax.activation.UnsupportedDataTypeException: Unknown image type image/jpeg; name=\"linux.jpeg\"")
     @Test
     public void dlpShouldBeAbleToReadMailContentWithAttachments() throws Exception {
         createJamesServer(MailetConfiguration.builder()


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


[james-project] 17/30: JAMES-2943 Forbid default domain removal as well

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 3164753d2cd5575bc897f816264f0e59213c5c93
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 09:43:21 2019 +0700

    JAMES-2943 Forbid default domain removal as well
---
 .../james/domainlist/lib/AbstractDomainList.java     | 13 +++++++++----
 .../lib/AbstractDomainListPrivateMethodsTest.java    |  9 +++++++++
 .../james/webadmin/routes/DomainsRoutesTest.java     | 20 ++++++++++++++++++--
 src/site/markdown/server/manage-webadmin.md          |  2 +-
 4 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
index a723829..8be0ee5 100644
--- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
+++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java
@@ -23,6 +23,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Stream;
 
 import org.apache.commons.configuration2.HierarchicalConfiguration;
@@ -55,6 +56,7 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
     private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDomainList.class);
 
     enum DomainType {
+        DefaultDomain,
         Internal,
         Detected,
         DetectedIp
@@ -187,11 +189,13 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
             .build();
         ImmutableList<Domain> ips = detectIps(domainsWithoutIp);
 
-        return ImmutableMultimap.<DomainType, Domain>builder()
+        ImmutableMultimap.Builder<DomainType, Domain> result = ImmutableMultimap.<DomainType, Domain>builder()
             .putAll(DomainType.Internal, domains)
             .putAll(DomainType.Detected, detectedDomains)
-            .putAll(DomainType.DetectedIp, ips)
-            .build();
+            .putAll(DomainType.DetectedIp, ips);
+        Optional.ofNullable(defaultDomain)
+            .ifPresent(domain -> result.put(DomainType.DefaultDomain, domain));
+        return result.build();
     }
 
     private ImmutableList<Domain> detectIps(Collection<Domain> domains) {
@@ -281,7 +285,8 @@ public abstract class AbstractDomainList implements DomainList, Configurable {
         Multimap<DomainType, Domain> domainsWithType = getDomainsWithType();
 
         return domainsWithType.get(DomainType.Detected).contains(domain)
-            || domainsWithType.get(DomainType.DetectedIp).contains(domain);
+            || domainsWithType.get(DomainType.DetectedIp).contains(domain)
+            || domainsWithType.get(DomainType.DefaultDomain).contains(domain);
     }
 
     /**
diff --git a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
index 2100ec1..9c48401 100644
--- a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
@@ -348,6 +348,15 @@ public class AbstractDomainListPrivateMethodsTest {
     }
 
     @Test
+    public void removeDomainShouldThrowWhenRemovingDefaultDomain() throws Exception {
+        Domain defaultDomain = Domain.of("default.tld");
+        domainList.configureDefaultDomain(defaultDomain);
+
+        assertThatThrownBy(() -> domainList.removeDomain(defaultDomain))
+            .isInstanceOf(AutoDetectedDomainRemovalException.class);
+    }
+
+    @Test
     public void configuredDomainShouldBeAddedUponConfiguration() throws Exception {
         Domain domain1 = Domain.of("conf1.tld");
         Domain domain2 = Domain.of("conf2.tld");
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index f57070a..8db07eb 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -40,6 +40,7 @@ import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.domainlist.api.DomainListException;
+import org.apache.james.domainlist.lib.DomainListConfiguration;
 import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.rrt.memory.MemoryRecipientRewriteTable;
 import org.apache.james.webadmin.WebAdminServer;
@@ -678,8 +679,11 @@ class DomainsRoutesTest {
             when(dnsService.getHostName(any())).thenReturn("james.local");
 
             MemoryDomainList domainList = new MemoryDomainList(dnsService);
-            domainList.setAutoDetectIP(true);
-            domainList.setAutoDetect(true);
+            domainList.configure(DomainListConfiguration.builder()
+                .autoDetect(true)
+                .autoDetectIp(true)
+                .defaultDomain(Domain.of("default.tld"))
+                .build());
             createServer(domainList);
         }
 
@@ -706,6 +710,18 @@ class DomainsRoutesTest {
                 .body("message", is("Can not remove domain"))
                 .body("details", is("172.45.62.13 is autodetected and cannot be removed"));
         }
+
+        @Test
+        void deleteShouldFailWhenDefaultDomain() {
+            when()
+                .delete("default.tld")
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is("InvalidArgument"))
+                .body("message", is("Can not remove domain"))
+                .body("details", is("default.tld is autodetected and cannot be removed"));
+        }
     }
 
 }
diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 12256ad..2fb39ba 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -182,7 +182,7 @@ Response codes:
 curl -XDELETE http://ip:port/domains/domainToBeDeleted
 ```
 
-Note: Deletion of an auto-detected domain or of an auto-detected ip is not supported. We encourage you instead to review 
+Note: Deletion of an auto-detected domain, default domain or of an auto-detected ip is not supported. We encourage you instead to review 
 your [domain list configuration](https://james.apache.org/server/config-domainlist.html).
 
 Response codes:


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


[james-project] 13/30: JAMES-2943 Deleting auto detected domain has no effect

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f818dce3ddebe7956c471570a0233739b05026a9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed Oct 30 13:27:55 2019 +0700

    JAMES-2943 Deleting auto detected domain has no effect
---
 .../lib/AbstractDomainListPrivateMethodsTest.java  | 35 +++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
index c711436..e8e8060 100644
--- a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.domainlist.lib;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verifyZeroInteractions;
@@ -30,7 +31,9 @@ import java.util.List;
 
 import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.domainlist.api.DomainListException;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
@@ -68,7 +71,7 @@ public class AbstractDomainListPrivateMethodsTest {
         }
 
         @Override
-        public void removeDomain(Domain domain) {
+        public void doRemoveDomain(Domain domain) {
             domains.remove(domain);
         }
 
@@ -317,6 +320,36 @@ public class AbstractDomainListPrivateMethodsTest {
         assertThat(domainList.containsDomain(Domain.of(envDomain))).isTrue();
     }
 
+    @Ignore("JAMES-2943 Removing an auto-detected domain leads to a noop")
+    @Test
+    public void removeDomainShouldThrowWhenRemovingAutoDetectedDomains() throws Exception {
+        domainList.configure(DomainListConfiguration.builder()
+            .autoDetect(true)
+            .autoDetectIp(false));
+
+        String detected = "detected.tld";
+        when(dnsService.getLocalHost()).thenReturn(InetAddress.getByName("127.0.0.1"));
+        when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
+
+        assertThatThrownBy(() -> domainList.removeDomain(Domain.of(detected)))
+            .isInstanceOf(DomainListException.class);
+    }
+
+    @Ignore("JAMES-2943 Removing an auto-detected ip leads to a noop")
+    @Test
+    public void removeDomainShouldThrowWhenRemovingAutoDetectedIps() throws Exception {
+        String detected = "detected.tld";
+        String detectedIp = "148.25.32.1";
+        when(dnsService.getLocalHost()).thenReturn(InetAddress.getByName("127.0.0.1"));
+        when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
+        InetAddress detectedAddress = mock(InetAddress.class);
+        when(detectedAddress.getHostAddress()).thenReturn(detectedIp);
+        when(dnsService.getAllByName(detected)).thenReturn(ImmutableList.of(detectedAddress));
+
+        assertThatThrownBy(() -> domainList.removeDomain(Domain.of(detectedIp)))
+            .isInstanceOf(DomainListException.class);
+    }
+
     @Test
     public void configuredDomainShouldBeAddedUponConfiguration() throws Exception {
         Domain domain1 = Domain.of("conf1.tld");


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


[james-project] 11/30: JAMES-2948 Rename UsersRoutesTests tests

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d13fb7d53cc50bebd4d8d22657d17864e6fd3144
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Wed Oct 30 14:50:15 2019 +0100

    JAMES-2948 Rename UsersRoutesTests tests
---
 .../james/webadmin/routes/UsersRoutesTest.java     | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index dbb4fc4..ce287bb 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -123,7 +123,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldReturnUserErrorWhenWrongJsonBody() {
+        void putShouldReturnUserErrorWhenWrongJsonBody() {
             given()
                 .body("{\"bad\":\"any\"}")
             .when()
@@ -133,7 +133,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldReturnOkWhenValidJsonBody() {
+        void putShouldReturnOkWhenValidJsonBody() {
             given()
                 .body("{\"password\":\"password\"}")
             .when()
@@ -143,7 +143,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldReturnRequireNonNullPassword() {
+        void putShouldReturnRequireNonNullPassword() {
             given()
                 .body("{\"password\":null}")
             .when()
@@ -153,7 +153,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldAddTheUser() {
+        void putShouldAddTheUser() {
             with()
                 .body("{\"password\":\"password\"}")
                 .put(USERNAME);
@@ -173,7 +173,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postingTwoTimesShouldBeAllowed() {
+        void puttingTwoTimesShouldBeAllowed() {
             // Given
             with()
                 .body("{\"password\":\"password\"}")
@@ -351,7 +351,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldFailOnRepositoryExceptionOnGetUserByName() throws Exception {
+        void putShouldFailOnRepositoryExceptionOnGetUserByName() throws Exception {
             when(usersRepository.getUserByName(username)).thenThrow(new UsersRepositoryException("message"));
 
             given()
@@ -363,7 +363,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldNotFailOnRepositoryExceptionOnAddUser() throws Exception {
+        void putShouldNotFailOnRepositoryExceptionOnAddUser() throws Exception {
             when(usersRepository.getUserByName(username)).thenReturn(null);
             doThrow(new UsersRepositoryException("message")).when(usersRepository).addUser(username, password);
 
@@ -376,7 +376,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldFailOnRepositoryExceptionOnUpdateUser() throws Exception {
+        void putShouldFailOnRepositoryExceptionOnUpdateUser() throws Exception {
             when(usersRepository.getUserByName(username)).thenReturn(mock(User.class));
             doThrow(new UsersRepositoryException("message")).when(usersRepository).updateUser(any());
 
@@ -410,7 +410,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldFailOnUnknownExceptionOnGetUserByName() throws Exception {
+        void putShouldFailOnUnknownExceptionOnGetUserByName() throws Exception {
             when(usersRepository.getUserByName(username)).thenThrow(new RuntimeException());
 
             given()
@@ -422,7 +422,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldFailOnUnknownExceptionOnAddUser() throws Exception {
+        void putShouldFailOnUnknownExceptionOnAddUser() throws Exception {
             when(usersRepository.getUserByName(username)).thenReturn(null);
             doThrow(new RuntimeException()).when(usersRepository).addUser(username, password);
 
@@ -435,7 +435,7 @@ class UsersRoutesTest {
         }
 
         @Test
-        void postShouldFailOnUnknownExceptionOnGetUpdateUser() throws Exception {
+        void putShouldFailOnUnknownExceptionOnGetUpdateUser() throws Exception {
             when(usersRepository.getUserByName(username)).thenReturn(mock(User.class));
             doThrow(new RuntimeException()).when(usersRepository).updateUser(any());
 


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


[james-project] 01/30: JAMES-2937 RabbitMQMailQueue should rely on ReactorRabbitMQChannelPool

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 4b9135ae8e81cc707de1e910bf1de6d7d895dfa1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Oct 4 11:52:59 2019 +0700

    JAMES-2937 RabbitMQMailQueue should rely on ReactorRabbitMQChannelPool
---
 .../james/modules/rabbitmq/RabbitMQModule.java     |  24 +++++
 .../org/apache/james/queue/rabbitmq/Dequeuer.java  |  12 ++-
 .../org/apache/james/queue/rabbitmq/Enqueuer.java  |  35 ++++---
 .../apache/james/queue/rabbitmq/RabbitClient.java  |  72 -------------
 .../queue/rabbitmq/RabbitMQMailQueueFactory.java   |  69 +++++++++++--
 .../RabbitMQMailQueueConfigurationChangeTest.java  |  16 ++-
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      | 114 ++++++++++-----------
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     |  17 ++-
 8 files changed, 191 insertions(+), 168 deletions(-)

diff --git a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
index bdb9f70..5eb49df 100644
--- a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
+++ b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
@@ -32,6 +32,7 @@ import org.apache.james.backends.rabbitmq.RabbitMQHealthCheck;
 import org.apache.james.backends.rabbitmq.SimpleChannelPool;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
+import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.rabbitmq.RabbitMQMailQueue;
@@ -49,11 +50,13 @@ import org.apache.james.queue.rabbitmq.view.cassandra.EnqueuedMailsDAO;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfiguration;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfigurationModule;
 import org.apache.james.queue.rabbitmq.view.cassandra.configuration.EventsourcingConfigurationManagement;
+import org.apache.james.utils.InitialisationOperation;
 import org.apache.james.utils.PropertiesProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
@@ -85,6 +88,7 @@ public class RabbitMQModule extends AbstractModule {
         eventDTOModuleBinder.addBinding().toInstance(CassandraMailQueueViewConfigurationModule.MAIL_QUEUE_VIEW_CONFIGURATION);
 
         Multibinder.newSetBinder(binder(), HealthCheck.class).addBinding().to(RabbitMQHealthCheck.class);
+        Multibinder.newSetBinder(binder(), InitialisationOperation.class).addBinding().to(RabbitMQMailQueueFactoryInitialisationOperation.class);
     }
 
     @Provides
@@ -140,4 +144,24 @@ public class RabbitMQModule extends AbstractModule {
     private RabbitMQMailQueueConfiguration getMailQueueSizeConfiguration(@Named(RABBITMQ_CONFIGURATION_NAME) Configuration configuration) {
         return RabbitMQMailQueueConfiguration.from(configuration);
     }
+
+    @Singleton
+    public static class RabbitMQMailQueueFactoryInitialisationOperation implements InitialisationOperation {
+        private final RabbitMQMailQueueFactory rabbitMQMailQueueFactory;
+
+        @Inject
+        public RabbitMQMailQueueFactoryInitialisationOperation(RabbitMQMailQueueFactory rabbitMQMailQueueFactory) {
+            this.rabbitMQMailQueueFactory = rabbitMQMailQueueFactory;
+        }
+
+        @Override
+        public void initModule() {
+            rabbitMQMailQueueFactory.start();
+        }
+
+        @Override
+        public Class<? extends Startable> forClass() {
+            return RabbitMQMailQueueFactory.class;
+        }
+    }
 }
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
index ae9829e..a6de706 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Dequeuer.java
@@ -33,15 +33,19 @@ import org.apache.james.queue.rabbitmq.view.api.MailQueueView;
 import org.apache.mailet.Mail;
 
 import com.github.fge.lambdas.consumers.ThrowingConsumer;
+import com.rabbitmq.client.Connection;
 import com.rabbitmq.client.Delivery;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import reactor.rabbitmq.AcknowledgableDelivery;
+import reactor.rabbitmq.ConsumeOptions;
+import reactor.rabbitmq.RabbitFlux;
+import reactor.rabbitmq.ReceiverOptions;
 
 class Dequeuer {
-
     private static final boolean REQUEUE = true;
+    private static final int EXECUTION_RATE = 5;
     private final Flux<AcknowledgableDelivery> flux;
 
     private static class RabbitMQMailQueueItem implements MailQueue.MailQueueItem {
@@ -75,15 +79,15 @@ class Dequeuer {
     private final MailReferenceSerializer mailReferenceSerializer;
     private final MailQueueView mailQueueView;
 
-    Dequeuer(MailQueueName name, RabbitClient rabbitClient, Function<MailReferenceDTO, MailWithEnqueueId> mailLoader,
+    Dequeuer(MailQueueName name, Mono<Connection> connectionMono, Function<MailReferenceDTO, MailWithEnqueueId> mailLoader,
              MailReferenceSerializer serializer, MetricFactory metricFactory,
              MailQueueView mailQueueView) {
         this.mailLoader = mailLoader;
         this.mailReferenceSerializer = serializer;
         this.mailQueueView = mailQueueView;
         this.dequeueMetric = metricFactory.generate(DEQUEUED_METRIC_NAME_PREFIX + name.asString());
-        this.flux = rabbitClient
-            .receive(name)
+        this.flux = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(connectionMono))
+            .consumeManualAck(name.toWorkQueueName().asString(), new ConsumeOptions().qos(EXECUTION_RATE))
             .filter(getResponse -> getResponse.getBody() != null);
     }
 
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
index 776a739..ea7d04a 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/Enqueuer.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.queue.rabbitmq;
 
+import static org.apache.james.backends.rabbitmq.Constants.EMPTY_ROUTING_KEY;
 import static org.apache.james.queue.api.MailQueue.ENQUEUED_METRIC_NAME_PREFIX;
 
 import java.time.Clock;
@@ -38,21 +39,23 @@ import com.fasterxml.jackson.core.JsonProcessingException;
 import com.github.fge.lambdas.Throwing;
 
 import reactor.core.publisher.Mono;
+import reactor.rabbitmq.OutboundMessage;
+import reactor.rabbitmq.Sender;
 
 class Enqueuer {
     private final MailQueueName name;
-    private final RabbitClient rabbitClient;
+    private final Sender sender;
     private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore;
     private final MailReferenceSerializer mailReferenceSerializer;
     private final Metric enqueueMetric;
     private final MailQueueView mailQueueView;
     private final Clock clock;
 
-    Enqueuer(MailQueueName name, RabbitClient rabbitClient, Store<MimeMessage, MimeMessagePartsId> mimeMessageStore,
+    Enqueuer(MailQueueName name, Sender sender, Store<MimeMessage, MimeMessagePartsId> mimeMessageStore,
              MailReferenceSerializer serializer, MetricFactory metricFactory,
              MailQueueView mailQueueView, Clock clock) {
         this.name = name;
-        this.rabbitClient = rabbitClient;
+        this.sender = sender;
         this.mimeMessageStore = mimeMessageStore;
         this.mailReferenceSerializer = serializer;
         this.mailQueueView = mailQueueView;
@@ -64,7 +67,7 @@ class Enqueuer {
         EnqueueId enqueueId = EnqueueId.generate();
         saveMail(mail)
             .map(partIds -> new MailReference(enqueueId, mail, partIds))
-            .map(Throwing.function(this::publishReferenceToRabbit).sneakyThrow())
+            .flatMap(Throwing.function(this::publishReferenceToRabbit).sneakyThrow())
             .flatMap(mailQueueView::storeMail)
             .thenEmpty(Mono.fromRunnable(enqueueMetric::increment))
             .block();
@@ -78,16 +81,20 @@ class Enqueuer {
         }
     }
 
-    private EnqueuedItem publishReferenceToRabbit(MailReference mailReference) throws MailQueue.MailQueueException {
-        rabbitClient.publish(name, getMailReferenceBytes(mailReference));
-
-        return EnqueuedItem.builder()
-            .enqueueId(mailReference.getEnqueueId())
-            .mailQueueName(name)
-            .mail(mailReference.getMail())
-            .enqueuedTime(clock.instant())
-            .mimeMessagePartsId(mailReference.getPartsId())
-            .build();
+    private Mono<EnqueuedItem> publishReferenceToRabbit(MailReference mailReference) throws MailQueue.MailQueueException {
+        OutboundMessage data = new OutboundMessage(
+            name.toRabbitExchangeName().asString(),
+            EMPTY_ROUTING_KEY,
+            getMailReferenceBytes(mailReference));
+        return sender.send(Mono.just(data))
+            .then(Mono.just(
+                EnqueuedItem.builder()
+                    .enqueueId(mailReference.getEnqueueId())
+                    .mailQueueName(name)
+                    .mail(mailReference.getMail())
+                    .enqueuedTime(clock.instant())
+                    .mimeMessagePartsId(mailReference.getPartsId())
+                    .build()));
     }
 
     private byte[] getMailReferenceBytes(MailReference mailReference) throws MailQueue.MailQueueException {
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
deleted file mode 100644
index 779e71e..0000000
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitClient.java
+++ /dev/null
@@ -1,72 +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.james.queue.rabbitmq;
-
-import static org.apache.james.backends.rabbitmq.Constants.AUTO_DELETE;
-import static org.apache.james.backends.rabbitmq.Constants.DURABLE;
-import static org.apache.james.backends.rabbitmq.Constants.EMPTY_ROUTING_KEY;
-import static org.apache.james.backends.rabbitmq.Constants.EXCLUSIVE;
-import static org.apache.james.backends.rabbitmq.Constants.NO_ARGUMENTS;
-
-import java.io.IOException;
-
-import javax.inject.Inject;
-
-import org.apache.james.backends.rabbitmq.RabbitMQChannelPool;
-import org.apache.james.queue.api.MailQueue;
-
-import com.rabbitmq.client.AMQP;
-import reactor.core.publisher.Flux;
-import reactor.rabbitmq.AcknowledgableDelivery;
-
-class RabbitClient {
-    private final RabbitMQChannelPool channelPool;
-
-    @Inject
-    RabbitClient(RabbitMQChannelPool channelPool) {
-        this.channelPool = channelPool;
-    }
-
-    void attemptQueueCreation(MailQueueName name) {
-        channelPool.execute(channel -> {
-            try {
-                channel.exchangeDeclare(name.toRabbitExchangeName().asString(), "direct", DURABLE);
-                channel.queueDeclare(name.toWorkQueueName().asString(), DURABLE, !EXCLUSIVE, !AUTO_DELETE, NO_ARGUMENTS);
-                channel.queueBind(name.toWorkQueueName().asString(), name.toRabbitExchangeName().asString(), EMPTY_ROUTING_KEY);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
-        });
-    }
-
-    void publish(MailQueueName name, byte[] message) throws MailQueue.MailQueueException {
-        channelPool.execute(channel -> {
-            try {
-                channel.basicPublish(name.toRabbitExchangeName().asString(), EMPTY_ROUTING_KEY, new AMQP.BasicProperties(), message);
-            } catch (IOException e) {
-                throw new MailQueue.MailQueueException("Unable to publish to RabbitMQ", e);
-            }
-        });
-    }
-
-    Flux<AcknowledgableDelivery> receive(MailQueueName name) {
-        return channelPool.receive(name.toWorkQueueName().asString());
-    }
-}
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
index 0e1bf95..b0748c0 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
@@ -19,6 +19,11 @@
 
 package org.apache.james.queue.rabbitmq;
 
+import static org.apache.james.backends.rabbitmq.Constants.AUTO_DELETE;
+import static org.apache.james.backends.rabbitmq.Constants.DURABLE;
+import static org.apache.james.backends.rabbitmq.Constants.EMPTY_ROUTING_KEY;
+import static org.apache.james.backends.rabbitmq.Constants.EXCLUSIVE;
+import static org.apache.james.backends.rabbitmq.Constants.NO_ARGUMENTS;
 import static org.apache.james.queue.api.MailQueue.QUEUE_SIZE_METRIC_NAME_PREFIX;
 
 import java.time.Clock;
@@ -27,13 +32,17 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
 
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.mail.internet.MimeMessage;
 
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
+import org.apache.james.backends.rabbitmq.SimpleConnectionPool;
 import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.Store;
 import org.apache.james.blob.mail.MimeMessagePartsId;
 import org.apache.james.blob.mail.MimeMessageStore;
+import org.apache.james.lifecycle.api.Startable;
 import org.apache.james.metrics.api.GaugeRegistry;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
@@ -44,13 +53,23 @@ import org.apache.james.queue.rabbitmq.view.api.MailQueueView;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
+import com.rabbitmq.client.Connection;
 
-public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQueue> {
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+import reactor.rabbitmq.BindingSpecification;
+import reactor.rabbitmq.ExchangeSpecification;
+import reactor.rabbitmq.QueueSpecification;
+import reactor.rabbitmq.Sender;
+
+public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQueue>, Startable {
+    private static final int MAX_CHANNELS_NUMBER = 5;
 
     @VisibleForTesting static class PrivateFactory {
         private final MetricFactory metricFactory;
         private final GaugeRegistry gaugeRegistry;
-        private final RabbitClient rabbitClient;
+        private final Mono<Connection> connectionMono;
+        private final Sender sender;
         private final Store<MimeMessage, MimeMessagePartsId> mimeMessageStore;
         private final MailReferenceSerializer mailReferenceSerializer;
         private final Function<MailReferenceDTO, MailWithEnqueueId> mailLoader;
@@ -62,8 +81,7 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
         @Inject
         @VisibleForTesting PrivateFactory(MetricFactory metricFactory,
                                           GaugeRegistry gaugeRegistry,
-                                          RabbitClient rabbitClient,
-                                          MimeMessageStore.Factory mimeMessageStoreFactory,
+                                          Mono<Connection> connectionMono, Sender sender, MimeMessageStore.Factory mimeMessageStoreFactory,
                                           BlobId.Factory blobIdFactory,
                                           MailQueueView.Factory mailQueueViewFactory,
                                           Clock clock,
@@ -71,7 +89,8 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
                                           RabbitMQMailQueueConfiguration configuration) {
             this.metricFactory = metricFactory;
             this.gaugeRegistry = gaugeRegistry;
-            this.rabbitClient = rabbitClient;
+            this.connectionMono = connectionMono;
+            this.sender = sender;
             this.mimeMessageStore = mimeMessageStoreFactory.mimeMessageStore();
             this.mailQueueViewFactory = mailQueueViewFactory;
             this.clock = clock;
@@ -88,9 +107,9 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
             RabbitMQMailQueue rabbitMQMailQueue = new RabbitMQMailQueue(
                 metricFactory,
                 mailQueueName,
-                new Enqueuer(mailQueueName, rabbitClient, mimeMessageStore, mailReferenceSerializer,
+                new Enqueuer(mailQueueName, sender, mimeMessageStore, mailReferenceSerializer,
                     metricFactory, mailQueueView, clock),
-                new Dequeuer(mailQueueName, rabbitClient, mailLoader, mailReferenceSerializer,
+                new Dequeuer(mailQueueName, connectionMono, mailLoader, mailReferenceSerializer,
                     metricFactory, mailQueueView),
                 mailQueueView,
                 decoratorFactory);
@@ -123,22 +142,29 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
         }
     }
 
-    private final RabbitClient rabbitClient;
     private final RabbitMQMailQueueManagement mqManagementApi;
     private final PrivateFactory privateFactory;
     private final RabbitMQMailQueueObjectPool mailQueueObjectPool;
+    private final Mono<Connection> connectionMono;
+    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
+    private Sender sender;
 
     @VisibleForTesting
     @Inject
-    RabbitMQMailQueueFactory(RabbitClient rabbitClient,
+    RabbitMQMailQueueFactory(SimpleConnectionPool simpleConnectionPool,
                              RabbitMQMailQueueManagement mqManagementApi,
                              PrivateFactory privateFactory) {
-        this.rabbitClient = rabbitClient;
+        this.connectionMono = simpleConnectionPool.getResilientConnection();
         this.mqManagementApi = mqManagementApi;
         this.privateFactory = privateFactory;
         this.mailQueueObjectPool = new RabbitMQMailQueueObjectPool();
     }
 
+    public void start() {
+        this.reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, MAX_CHANNELS_NUMBER);
+        this.sender = reactorRabbitMQChannelPool.createSender();
+    }
+
     @Override
     public Optional<RabbitMQMailQueue> getQueue(String name) {
         return getQueueFromRabbitServer(MailQueueName.fromString(name));
@@ -159,7 +185,22 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
     }
 
     private RabbitMQMailQueue createQueueIntoRabbitServer(MailQueueName mailQueueName) {
-        rabbitClient.attemptQueueCreation(mailQueueName);
+        String exchangeName = mailQueueName.toRabbitExchangeName().asString();
+        Flux.concat(
+            sender.declareExchange(ExchangeSpecification.exchange(exchangeName)
+                .durable(true)
+                .type("direct")),
+            sender.declareQueue(QueueSpecification.queue(mailQueueName.toWorkQueueName().asString())
+                .durable(DURABLE)
+                .exclusive(!EXCLUSIVE)
+                .autoDelete(!AUTO_DELETE)
+                .arguments(NO_ARGUMENTS)),
+            sender.bind(BindingSpecification.binding()
+                .exchange(mailQueueName.toRabbitExchangeName().asString())
+                .queue(mailQueueName.toWorkQueueName().asString())
+                .routingKey(EMPTY_ROUTING_KEY)))
+            .then()
+            .block();
         return mailQueueObjectPool.retrieveInstanceFor(mailQueueName);
     }
 
@@ -170,4 +211,10 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
             .findFirst();
     }
 
+    @PreDestroy
+    public void stop() {
+        sender.close();
+        reactorRabbitMQChannelPool.close();
+    }
+
 }
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 464faf2..7c23f0f 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
@@ -36,6 +36,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
@@ -60,6 +61,9 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import com.github.fge.lambdas.Throwing;
+import com.rabbitmq.client.Connection;
+
+import reactor.core.publisher.Mono;
 
 class RabbitMQMailQueueConfigurationChangeTest {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
@@ -75,6 +79,7 @@ class RabbitMQMailQueueConfigurationChangeTest {
     private static final Instant IN_SLICE_1 = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final Instant IN_SLICE_2 = IN_SLICE_1.plus(1, HOURS);
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
+    public static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
@@ -88,7 +93,6 @@ class RabbitMQMailQueueConfigurationChangeTest {
 
     private UpdatableTickingClock clock;
     private RabbitMQMailQueueManagement mqManagementApi;
-    private RabbitClient rabbitClient;
     private MimeMessageStore.Factory mimeMessageStoreFactory;
 
     @BeforeEach
@@ -96,7 +100,6 @@ class RabbitMQMailQueueConfigurationChangeTest {
         CassandraBlobStore blobsDAO = new CassandraBlobStore(cassandra.getConf());
         mimeMessageStoreFactory = MimeMessageStore.factory(blobsDAO);
         clock = new UpdatableTickingClock(IN_SLICE_1);
-        rabbitClient = new RabbitClient(rabbitMQExtension.getRabbitChannelPool());
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
     }
 
@@ -111,21 +114,26 @@ class RabbitMQMailQueueConfigurationChangeTest {
             mailQueueViewConfiguration,
             mimeMessageStoreFactory);
 
+
         RabbitMQMailQueueConfiguration mailQueueSizeConfiguration = RabbitMQMailQueueConfiguration.builder()
             .sizeMetricsEnabled(true)
             .build();
 
+        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
+        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
         RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            rabbitClient,
+            connectionMono,
+            reactorRabbitMQChannelPool.createSender(),
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
             clock,
             new RawMailQueueItemDecoratorFactory(),
             mailQueueSizeConfiguration);
-        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, privateFactory);
+        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, privateFactory);
+        mailQueueFactory.start();
         return mailQueueFactory.createQueue(SPOOL);
     }
 
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index ea738d9..127ed23 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -38,6 +38,7 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
@@ -67,6 +68,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.ArgumentCaptor;
 
 import com.github.fge.lambdas.Throwing;
+import com.rabbitmq.client.Connection;
 
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -82,6 +84,7 @@ class RabbitMQMailQueueTest {
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
     private static final Instant IN_SLICE_5 = IN_SLICE_1.plus(4, HOURS);
     private static final Instant IN_SLICE_7 = IN_SLICE_1.plus(6, HOURS);
+    private static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
@@ -107,36 +110,11 @@ class RabbitMQMailQueueTest {
     class MailQueueSizeMetricsEnabled implements ManageableMailQueueContract, MailQueueMetricContract {
         @BeforeEach
         void setup(CassandraCluster cassandra, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem) throws Exception {
-            CassandraBlobStore blobStore = new CassandraBlobStore(cassandra.getConf());
-            MimeMessageStore.Factory mimeMessageStoreFactory = MimeMessageStore.factory(blobStore);
-            clock = new UpdatableTickingClock(IN_SLICE_1);
-
-            MailQueueView.Factory mailQueueViewFactory = CassandraMailQueueViewTestFactory.factory(clock, cassandra.getConf(),
-                CassandraMailQueueViewConfiguration.builder()
-                    .bucketCount(THREE_BUCKET_COUNT)
-                    .updateBrowseStartPace(UPDATE_BROWSE_START_PACE)
-                    .sliceWindow(ONE_HOUR_SLICE_WINDOW)
-                    .build(),
-                mimeMessageStoreFactory);
-
-            RabbitMQMailQueueConfiguration configuration = RabbitMQMailQueueConfiguration.builder()
-                .sizeMetricsEnabled(true)
-                .build();
-
-            RabbitClient rabbitClient = new RabbitClient(rabbitMQExtension.getRabbitChannelPool());
-            RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
-                metricTestSystem.getMetricFactory(),
-                metricTestSystem.getSpyGaugeRegistry(),
-                rabbitClient,
-                mimeMessageStoreFactory,
-                BLOB_ID_FACTORY,
-                mailQueueViewFactory,
-                clock,
-                new RawMailQueueItemDecoratorFactory(),
-                configuration);
-            mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-            mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);
-            mailQueue = mailQueueFactory.createQueue(SPOOL);
+            setUp(cassandra,
+                metricTestSystem,
+                RabbitMQMailQueueConfiguration.builder()
+                    .sizeMetricsEnabled(true)
+                    .build());
         }
 
         @Override
@@ -260,6 +238,11 @@ class RabbitMQMailQueueTest {
                 }))
                 .blockLast();
         }
+
+        @AfterEach
+        void tearDown() {
+            mqManagementApi.deleteAllQueues();
+        }
     }
 
     @Nested
@@ -269,36 +252,11 @@ class RabbitMQMailQueueTest {
 
         @BeforeEach
         void setup(CassandraCluster cassandra, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem) throws Exception {
-            CassandraBlobStore blobStore = new CassandraBlobStore(cassandra.getConf());
-            MimeMessageStore.Factory mimeMessageStoreFactory = MimeMessageStore.factory(blobStore);
-            clock = new UpdatableTickingClock(IN_SLICE_1);
-
-            MailQueueView.Factory mailQueueViewFactory = CassandraMailQueueViewTestFactory.factory(clock, cassandra.getConf(),
-                CassandraMailQueueViewConfiguration.builder()
-                    .bucketCount(THREE_BUCKET_COUNT)
-                    .updateBrowseStartPace(UPDATE_BROWSE_START_PACE)
-                    .sliceWindow(ONE_HOUR_SLICE_WINDOW)
-                    .build(),
-                mimeMessageStoreFactory);
-
-            RabbitMQMailQueueConfiguration configuration = RabbitMQMailQueueConfiguration.builder()
+            setUp(cassandra,
+                metricTestSystem,
+                RabbitMQMailQueueConfiguration.builder()
                 .sizeMetricsEnabled(false)
-                .build();
-
-            RabbitClient rabbitClient = new RabbitClient(rabbitMQExtension.getRabbitChannelPool());
-            RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
-                metricTestSystem.getMetricFactory(),
-                metricTestSystem.getSpyGaugeRegistry(),
-                rabbitClient,
-                mimeMessageStoreFactory,
-                BLOB_ID_FACTORY,
-                mailQueueViewFactory,
-                clock,
-                new RawMailQueueItemDecoratorFactory(),
-                configuration);
-            mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-            mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);
-            mailQueue = mailQueueFactory.createQueue(SPOOL);
+                .build());
         }
 
         @Test
@@ -306,5 +264,43 @@ class RabbitMQMailQueueTest {
             ArgumentCaptor<Gauge<?>> gaugeCaptor = ArgumentCaptor.forClass(Gauge.class);
             verify(metricTestSystem.getSpyGaugeRegistry(), never()).register(any(), gaugeCaptor.capture());
         }
+
+        @AfterEach
+        void tearDown() {
+            mqManagementApi.deleteAllQueues();
+        }
+    }
+
+    private void setUp(CassandraCluster cassandra, MailQueueMetricExtension.MailQueueMetricTestSystem metricTestSystem, RabbitMQMailQueueConfiguration configuration) throws Exception {
+        CassandraBlobStore blobStore = new CassandraBlobStore(cassandra.getConf());
+        MimeMessageStore.Factory mimeMessageStoreFactory = MimeMessageStore.factory(blobStore);
+        clock = new UpdatableTickingClock(IN_SLICE_1);
+
+        MailQueueView.Factory mailQueueViewFactory = CassandraMailQueueViewTestFactory.factory(clock, cassandra.getConf(),
+            CassandraMailQueueViewConfiguration.builder()
+                .bucketCount(THREE_BUCKET_COUNT)
+                .updateBrowseStartPace(UPDATE_BROWSE_START_PACE)
+                .sliceWindow(ONE_HOUR_SLICE_WINDOW)
+                .build(),
+            mimeMessageStoreFactory);
+
+        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
+        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
+
+        RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
+            metricTestSystem.getMetricFactory(),
+            metricTestSystem.getSpyGaugeRegistry(),
+            connectionMono,
+            reactorRabbitMQChannelPool.createSender(),
+            mimeMessageStoreFactory,
+            BLOB_ID_FACTORY,
+            mailQueueViewFactory,
+            clock,
+            new RawMailQueueItemDecoratorFactory(),
+            configuration);
+        mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
+        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, factory);
+        mailQueueFactory.start();
+        mailQueue = mailQueueFactory.createQueue(SPOOL);
     }
 }
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 625f988..fb5b8b7 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
@@ -30,6 +30,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
+import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.mail.MimeMessageStore;
 import org.apache.james.metrics.api.NoopGaugeRegistry;
@@ -45,8 +46,13 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
+import com.rabbitmq.client.Connection;
+
+import reactor.core.publisher.Mono;
+
 class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQMailQueue> {
     private static final HashBlobId.Factory BLOB_ID_FACTORY = new HashBlobId.Factory();
+    public static final int POOL_SIZE = 5;
 
     @RegisterExtension
     static RabbitMQExtension rabbitMQExtension = RabbitMQExtension.singletonRabbitMQ();
@@ -66,11 +72,13 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             .sizeMetricsEnabled(true)
             .build();
 
-        RabbitClient rabbitClient = new RabbitClient(rabbitMQExtension.getRabbitChannelPool());
-        RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
+        Mono<Connection> connectionMono = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
+        ReactorRabbitMQChannelPool reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(connectionMono, POOL_SIZE);
+        RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            rabbitClient,
+            connectionMono,
+            reactorRabbitMQChannelPool.createSender(),
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
@@ -78,7 +86,8 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             new RawMailQueueItemDecoratorFactory(),
             configuration);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitClient, mqManagementApi, factory);
+        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitConnectionPool(), mqManagementApi, privateFactory);
+        mailQueueFactory.start();
     }
 
     @AfterEach


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


[james-project] 27/30: JAMES-2958 Add route tests to check that the domain name can not be longer than 255 characters

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit fbfdf0846c61341fd5d670dc5f4f3ac6f9c6444e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 1 15:29:26 2019 +0700

    JAMES-2958 Add route tests to check that the domain name can not be longer than 255 characters
---
 .../webadmin/routes/DomainMappingsRoutesTest.java  | 53 ++++++++++++++++++++++
 .../james/webadmin/routes/DomainsRoutesTest.java   |  8 ++++
 2 files changed, 61 insertions(+)

diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
index 376a1b1..d8b1b6e 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainMappingsRoutesTest.java
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.core.Domain;
 import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.rrt.api.RecipientRewriteTableException;
@@ -125,6 +126,26 @@ class DomainMappingsRoutesTest {
         }
 
         @Test
+        void addDomainMappingsShouldReturnOkWhenWithA255LongDomainSource() {
+            given()
+                .body("to.com")
+            .when()
+                .put(StringUtils.repeat('a', 255))
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
+        void addDomainMappingsShouldReturnOkWhenWithA255LongDomainDestination() {
+            given()
+                .body(StringUtils.repeat('a', 255))
+            .when()
+                .put("from.com")
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
         void getDomainMappingsShouldReturnAllDomainMappings() throws RecipientRewriteTableException {
             String alias1 = "to_1.com";
             String alias2 = "to_2.com";
@@ -402,6 +423,38 @@ class DomainMappingsRoutesTest {
                 .hasEntrySatisfying("message", o -> assertThat((String) o).matches("^The domain .* is invalid\\.$"));
         }
 
+        @Test
+        void addDomainMappingShouldReturnBadRequestWhenDomainSourceTooLong() {
+            String longDomainName = StringUtils.repeat('a', 256);
+
+            given()
+                .body("destination.tld")
+            .when()
+                .put(longDomainName)
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("The domain " + longDomainName + " is invalid."))
+                .body("details", is("Domain name length should not exceed 255 characters"));
+        }
+
+        @Test
+        void addDomainMappingShouldReturnBadRequestWhenDomainDestinationTooLong() {
+            String longDomainName = StringUtils.repeat('a', 256);
+
+            given()
+                .body(longDomainName)
+            .when()
+                .put("source.tld")
+            .then()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("The domain " + longDomainName + " is invalid."))
+                .body("details", is("Domain name length should not exceed 255 characters"));
+        }
+
         private void assertBadRequest(String toDomain, Function<RequestSpecification, Response> requestingFunction) {
             Map<String, Object> errors = requestingFunction.apply(given().body(toDomain).when())
                 .then()
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index cfd298e..185cabb 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -162,6 +162,14 @@ class DomainsRoutesTest {
         }
 
         @Test
+        void putShouldReturnOkWhenWithA255LongDomainName() {
+            when()
+                .put(StringUtils.repeat('a', 255))
+            .then()
+                .statusCode(HttpStatus.NO_CONTENT_204);
+        }
+
+        @Test
         void putShouldReturnBadRequestWhenDomainNameIsTooLong() {
             String longDomainName = StringUtils.repeat('a', 256);
 


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


[james-project] 25/30: JAMES-2958 Small refactoring in DomainRoutesTest

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e35c5ccc68a9d075227e316ce117db620773a618
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 1 14:35:38 2019 +0700

    JAMES-2958 Small refactoring in DomainRoutesTest
---
 .../james/webadmin/routes/DomainsRoutesTest.java   | 104 +++++++--------------
 1 file changed, 36 insertions(+), 68 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index 8db07eb..cfd298e 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -23,8 +23,8 @@ import static io.restassured.RestAssured.given;
 import static io.restassured.RestAssured.when;
 import static io.restassured.RestAssured.with;
 import static org.apache.james.webadmin.Constants.SEPARATOR;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.hasSize;
 import static org.mockito.ArgumentMatchers.any;
@@ -33,9 +33,8 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.net.InetAddress;
-import java.util.List;
-import java.util.Map;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.core.Domain;
 import org.apache.james.dnsservice.api.DNSService;
 import org.apache.james.domainlist.api.DomainList;
@@ -97,22 +96,16 @@ class DomainsRoutesTest {
 
         @Test
         void getDomainsShouldBeEmptyByDefault() {
-            List<String> domains =
-                given()
-                    .get()
-                .then()
-                    .statusCode(HttpStatus.OK_200)
-                    .contentType(ContentType.JSON)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(domains).isEmpty();
+            given()
+                .get()
+            .then()
+                .statusCode(HttpStatus.OK_200)
+                .contentType(ContentType.JSON)
+                .body(".", hasSize(0));
         }
 
         @Test
-        void putShouldReturnErrorWhenUsedWithEmptyDomain() {
+        void putShouldReturnNotFoundWhenUsedWithEmptyDomain() {
             given()
                 .put(SEPARATOR)
             .then()
@@ -120,7 +113,7 @@ class DomainsRoutesTest {
         }
 
         @Test
-        void deleteShouldReturnErrorWhenUsedWithEmptyDomain() {
+        void deleteShouldReturnNotFoundWhenUsedWithEmptyDomain() {
             given()
                 .delete(SEPARATOR)
             .then()
@@ -140,40 +133,28 @@ class DomainsRoutesTest {
             with()
                 .put(DOMAIN);
 
-            List<String> domains =
-                when()
-                    .get()
-                .then()
-                    .contentType(ContentType.JSON)
-                    .statusCode(HttpStatus.OK_200)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-            assertThat(domains).containsExactly(DOMAIN);
+            when()
+                .get()
+            .then()
+                .contentType(ContentType.JSON)
+                .statusCode(HttpStatus.OK_200)
+                .body(".", contains(DOMAIN));
         }
 
         @Test
-        void putShouldReturnUserErrorWhenNameContainsAT() {
-            Map<String, Object> errors = when()
+        void putShouldReturnBadRequestWhenDomainNameContainsAT() {
+            when()
                 .put(DOMAIN + "@" + DOMAIN)
             .then()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .contentType(ContentType.JSON)
-                .extract()
-                .body()
-                .jsonPath()
-                .getMap(".");
-
-            assertThat(errors)
-                .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
-                .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "Invalid request for domain creation domain@domain");
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is("InvalidArgument"))
+                .body("message", is("Invalid request for domain creation domain@domain"));
         }
 
         @Test
-        void putShouldReturnUserErrorWhenNameContainsUrlSeparator() {
+        void putShouldReturnNotFoundWhenDomainNameContainsUrlSeparator() {
             when()
                 .put(DOMAIN + "/" + DOMAIN)
             .then()
@@ -181,25 +162,18 @@ class DomainsRoutesTest {
         }
 
         @Test
-        void putShouldReturnUserErrorWhenNameIsTooLong() {
-            String longDomainName = DOMAIN + "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
-                "0123456789.0123456789.0123456789.";
-            Map<String, Object> errors = when()
+        void putShouldReturnBadRequestWhenDomainNameIsTooLong() {
+            String longDomainName = StringUtils.repeat('a', 256);
+
+            when()
                 .put(longDomainName)
             .then()
                 .statusCode(HttpStatus.BAD_REQUEST_400)
                 .contentType(ContentType.JSON)
-                .extract()
-                .body()
-                .jsonPath()
-                .getMap(".");
-
-            assertThat(errors)
-                .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
-                .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "Invalid request for domain creation " + longDomainName)
-                .containsEntry("details", "Domain name length should not exceed 255 characters");
+                .body("statusCode", is(HttpStatus.BAD_REQUEST_400))
+                .body("type", is("InvalidArgument"))
+                .body("message", is("Invalid request for domain creation " + longDomainName))
+                .body("details", is("Domain name length should not exceed 255 characters"));
         }
 
         @Test
@@ -223,18 +197,12 @@ class DomainsRoutesTest {
             .then()
                 .statusCode(HttpStatus.NO_CONTENT_204);
 
-            List<String> domains =
-                when()
-                    .get()
-                .then()
-                    .contentType(ContentType.JSON)
-                    .statusCode(HttpStatus.OK_200)
-                    .extract()
-                    .body()
-                    .jsonPath()
-                    .getList(".");
-
-           assertThat(domains).isEmpty();
+            when()
+                .get()
+            .then()
+                .contentType(ContentType.JSON)
+                .statusCode(HttpStatus.OK_200)
+                .body(".", hasSize(0));
         }
 
         @Test


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


[james-project] 10/30: JAMES-2948 Improve error message for WebAdmin's user creation username errors

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c664b17b77bd0e8b3d258826cb4ed392dcdf6b0c
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Wed Oct 30 14:32:33 2019 +0100

    JAMES-2948 Improve error message for WebAdmin's user creation username errors
---
 .../org/apache/james/webadmin/routes/UserRoutes.java     | 16 ++++++++++++++++
 .../org/apache/james/webadmin/service/UserService.java   | 14 ++++++++++++--
 .../apache/james/webadmin/routes/UsersRoutesTest.java    | 12 ++++++++++--
 3 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
index 75f4a92..9006e96 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/UserRoutes.java
@@ -150,6 +150,14 @@ public class UserRoutes implements Routes {
                 .message("The user " + username + " does not exists")
                 .cause(e)
                 .haltError();
+        } catch (UserService.InvalidUsername e) {
+            LOGGER.info("Invalid username", e);
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorType.INVALID_ARGUMENT)
+                .message("Invalid username: it should be between 1 and 255 long without '/'")
+                .cause(e)
+                .haltError();
         } catch (IllegalArgumentException e) {
             LOGGER.info("Invalid user path", e);
             throw ErrorResponder.builder()
@@ -174,6 +182,14 @@ public class UserRoutes implements Routes {
                 .message("Error while deserializing addUser request")
                 .cause(e)
                 .haltError();
+        } catch (UserService.InvalidUsername e) {
+            LOGGER.info("Invalid username", e);
+            throw ErrorResponder.builder()
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .type(ErrorType.INVALID_ARGUMENT)
+                .message("Invalid username: it should be between 1 and 255 long without '/'")
+                .cause(e)
+                .haltError();
         } catch (IllegalArgumentException e) {
             LOGGER.info("Invalid user path", e);
             throw ErrorResponder.builder()
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
index 6f6fe41..c31357b 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/UserService.java
@@ -43,6 +43,12 @@ import spark.Response;
 
 public class UserService {
 
+    public static class InvalidUsername extends RuntimeException {
+        InvalidUsername(Exception e) {
+            super("Username invariants violation", e);
+        }
+    }
+
     private static final Logger LOGGER = LoggerFactory.getLogger(UserService.class);
     private static final String EMPTY_BODY = "";
     public static final int MAXIMUM_MAIL_ADDRESS_LENGTH = 255;
@@ -81,8 +87,12 @@ public class UserService {
     }
 
     private void usernamePreconditions(String username) {
-        Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
-        Preconditions.checkArgument(username.length() < MAXIMUM_MAIL_ADDRESS_LENGTH);
+        try {
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(username));
+            Preconditions.checkArgument(username.length() < MAXIMUM_MAIL_ADDRESS_LENGTH);
+        } catch (IllegalArgumentException e) {
+            throw new InvalidUsername(e);
+        }
     }
 
     private void upsert(User user, String username, char[] password) throws UsersRepositoryException {
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
index 6476048..dbb4fc4 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/UsersRoutesTest.java
@@ -23,6 +23,7 @@ import static io.restassured.RestAssured.given;
 import static io.restassured.RestAssured.when;
 import static io.restassured.RestAssured.with;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.Matchers.is;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.mock;
@@ -40,6 +41,7 @@ import org.apache.james.user.memory.MemoryUsersRepository;
 import org.apache.james.webadmin.WebAdminServer;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.service.UserService;
+import org.apache.james.webadmin.utils.ErrorResponder;
 import org.apache.james.webadmin.utils.JsonTransformer;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.jupiter.api.AfterEach;
@@ -223,7 +225,10 @@ class UsersRoutesTest {
                     "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
                     "0123456789.0123456789.0123456789.")
             .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("Invalid username: it should be between 1 and 255 long without '/'"));
         }
 
         @Test
@@ -255,7 +260,10 @@ class UsersRoutesTest {
                     "0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789.0123456789." +
                     "0123456789.0123456789.0123456789.")
             .then()
-                .statusCode(HttpStatus.BAD_REQUEST_400);
+                .statusCode(HttpStatus.BAD_REQUEST_400)
+                .body("statusCode", is(400))
+                .body("type", is(ErrorResponder.ErrorType.INVALID_ARGUMENT.getType()))
+                .body("message", is("Invalid username: it should be between 1 and 255 long without '/'"));
         }
 
         @Test


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


[james-project] 19/30: JAMES-2953 Disambiguate WebAdmin's addresses forwards error messages

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 5df245169c5272189fcf0ee8699de498547e1c80
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Thu Oct 31 14:15:13 2019 +0100

    JAMES-2953 Disambiguate WebAdmin's addresses forwards error messages
---
 .../org/apache/james/webadmin/routes/ForwardRoutes.java | 17 +++++++++--------
 .../apache/james/webadmin/routes/ForwardRoutesTest.java | 10 +++++-----
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
index ee9f8d6..f4b3226 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/ForwardRoutes.java
@@ -79,7 +79,8 @@ public class ForwardRoutes implements Routes {
         "targets" + SEPARATOR + ":" + FORWARD_DESTINATION_ADDRESS;
     private static final String MAILADDRESS_ASCII_DISCLAIMER = "Note that email addresses are restricted to ASCII character set. " +
         "Mail addresses not matching this criteria will be rejected.";
-    private static final String ADDRESS_TYPE = "forward";
+    private static final String FORWARD_BASE_ADDRESS_TYPE = "base forward";
+    private static final String FORWARD_DESTINATION_ADDRESS_TYPE = "target forward";
 
     private final UsersRepository usersRepository;
     private final JsonTransformer jsonTransformer;
@@ -149,9 +150,9 @@ public class ForwardRoutes implements Routes {
             message = "Internal server error - Something went bad on the server side.")
     })
     public HaltException addToForwardDestinations(Request request, Response response) throws RecipientRewriteTableException, UsersRepositoryException {
-        MailAddress forwardBaseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), ADDRESS_TYPE);
+        MailAddress forwardBaseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), FORWARD_BASE_ADDRESS_TYPE);
         ensureUserExist(forwardBaseAddress);
-        MailAddress destinationAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS), ADDRESS_TYPE);
+        MailAddress destinationAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS), FORWARD_DESTINATION_ADDRESS_TYPE);
         MappingSource source = MappingSource.fromUser(User.fromLocalPartWithDomain(forwardBaseAddress.getLocalPart(), forwardBaseAddress.getDomain()));
         addForward(source, destinationAddress);
         return halt(HttpStatus.NO_CONTENT_204);
@@ -197,8 +198,8 @@ public class ForwardRoutes implements Routes {
             message = "Internal server error - Something went bad on the server side.")
     })
     public HaltException removeFromForwardDestination(Request request, Response response) throws RecipientRewriteTableException {
-        MailAddress baseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), ADDRESS_TYPE);
-        MailAddress destinationAddressToBeRemoved = MailAddressParser.parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS), ADDRESS_TYPE);
+        MailAddress baseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), FORWARD_BASE_ADDRESS_TYPE);
+        MailAddress destinationAddressToBeRemoved = MailAddressParser.parseMailAddress(request.params(FORWARD_DESTINATION_ADDRESS), FORWARD_DESTINATION_ADDRESS_TYPE);
         MappingSource source = MappingSource.fromUser(User.fromLocalPartWithDomain(baseAddress.getLocalPart(), baseAddress.getDomain()));
         recipientRewriteTable.removeForwardMapping(source, destinationAddressToBeRemoved.asString());
         return halt(HttpStatus.NO_CONTENT_204);
@@ -212,13 +213,13 @@ public class ForwardRoutes implements Routes {
     })
     @ApiResponses(value = {
         @ApiResponse(code = HttpStatus.OK_200, message = "OK", response = List.class),
-        @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "The forward is not an address"),
-        @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The forward does not exist"),
+        @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "The base forward is not an address"),
+        @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The base forward does not exist"),
         @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500,
             message = "Internal server error - Something went bad on the server side.")
     })
     public ImmutableSet<ForwardDestinationResponse> listForwardDestinations(Request request, Response response) throws RecipientRewriteTableException {
-        MailAddress baseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), ADDRESS_TYPE);
+        MailAddress baseAddress = MailAddressParser.parseMailAddress(request.params(FORWARD_BASE_ADDRESS), FORWARD_BASE_ADDRESS_TYPE);
         Mappings mappings = recipientRewriteTable.getStoredMappings(MappingSource.fromMailAddress(baseAddress))
             .select(Mapping.Type.Forward);
 
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
index e92c665..ef8fbd6 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/ForwardRoutesTest.java
@@ -475,7 +475,7 @@ class ForwardRoutesTest {
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
                 .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "The forward is not an email address")
+                .containsEntry("message", "The base forward is not an email address")
                 .containsEntry("details", "Out of data at position 1 in 'not-an-address'");
         }
 
@@ -494,7 +494,7 @@ class ForwardRoutesTest {
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
                 .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "The forward is not an email address")
+                .containsEntry("message", "The base forward is not an email address")
                 .containsEntry("details", "Out of data at position 1 in 'not-an-address'");
         }
 
@@ -550,7 +550,7 @@ class ForwardRoutesTest {
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
                 .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "The forward is not an email address")
+                .containsEntry("message", "The target forward is not an email address")
                 .containsEntry("details", "Out of data at position 1 in 'not-an-address'");
         }
 
@@ -580,7 +580,7 @@ class ForwardRoutesTest {
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
                 .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "The forward is not an email address")
+                .containsEntry("message", "The base forward is not an email address")
                 .containsEntry("details", "Out of data at position 1 in 'not-an-address'");
         }
 
@@ -599,7 +599,7 @@ class ForwardRoutesTest {
             assertThat(errors)
                 .containsEntry("statusCode", HttpStatus.BAD_REQUEST_400)
                 .containsEntry("type", "InvalidArgument")
-                .containsEntry("message", "The forward is not an email address")
+                .containsEntry("message", "The target forward is not an email address")
                 .containsEntry("details", "Out of data at position 1 in 'not-an-address'");
         }
 


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


[james-project] 16/30: JAMES-2943 Document auto-detected domain removal failure

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit dec068ffae0940e655b6eb0833efc1c64953ff5a
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 09:34:38 2019 +0700

    JAMES-2943 Document auto-detected domain removal failure
---
 src/site/markdown/server/manage-webadmin.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index ef0cc8f..12256ad 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -182,6 +182,9 @@ Response codes:
 curl -XDELETE http://ip:port/domains/domainToBeDeleted
 ```
 
+Note: Deletion of an auto-detected domain or of an auto-detected ip is not supported. We encourage you instead to review 
+your [domain list configuration](https://james.apache.org/server/config-domainlist.html).
+
 Response codes:
 
  - 204: The domain was successfully removed


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


[james-project] 24/30: JAMES-2958 Limit the domain creation to a number of 255 characters

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit c55b4afad0e0327ac63f0b7d21fb7d5f83ac3d05
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Nov 1 14:18:17 2019 +0700

    JAMES-2958 Limit the domain creation to a number of 255 characters
---
 core/src/main/java/org/apache/james/core/Domain.java         |  3 +++
 .../java/org/apache/james/domainlist/api/DomainTest.java     | 12 ++++++++++++
 .../java/org/apache/james/webadmin/routes/DomainsRoutes.java |  9 +--------
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/core/src/main/java/org/apache/james/core/Domain.java b/core/src/main/java/org/apache/james/core/Domain.java
index 1bcea59..3bf831a 100644
--- a/core/src/main/java/org/apache/james/core/Domain.java
+++ b/core/src/main/java/org/apache/james/core/Domain.java
@@ -28,6 +28,7 @@ import com.google.common.base.Preconditions;
 public class Domain implements Serializable {
 
     public static final Domain LOCALHOST = Domain.of("localhost");
+    public static final int MAXIMUM_DOMAIN_LENGTH = 255;
 
     private static String removeBrackets(String domainName) {
         if (!(domainName.startsWith("[") && domainName.endsWith("]"))) {
@@ -40,6 +41,8 @@ public class Domain implements Serializable {
         Preconditions.checkNotNull(domain, "Domain can not be null");
         Preconditions.checkArgument(!domain.isEmpty() && !domain.contains("@"),
             "Domain can not be empty nor contain `@`");
+        Preconditions.checkArgument(domain.length() <= MAXIMUM_DOMAIN_LENGTH,
+            "Domain name length should not exceed " + MAXIMUM_DOMAIN_LENGTH + " characters");
         return new Domain(domain);
     }
 
diff --git a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
index 8230223..1abffc6 100644
--- a/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
+++ b/core/src/test/java/org/apache/james/domainlist/api/DomainTest.java
@@ -22,6 +22,7 @@ package org.apache.james.domainlist.api;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.core.Domain;
 import org.junit.jupiter.api.Test;
 
@@ -101,4 +102,15 @@ class DomainTest {
         assertThatThrownBy(() -> Domain.of(null)).isInstanceOf(NullPointerException.class);
     }
 
+    @Test
+    void shouldAllow255LongDomain() {
+        assertThat(Domain.of(StringUtils.repeat('a', 255)).asString())
+            .hasSize(255);
+    }
+
+    @Test
+    void shouldThrowWhenTooLong() {
+        assertThatThrownBy(() -> Domain.of(StringUtils.repeat('a', 256)))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
 }
\ No newline at end of file
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index 1aee7e9..936b3ea 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -48,7 +48,6 @@ import org.eclipse.jetty.http.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 
 import io.swagger.annotations.Api;
@@ -244,7 +243,7 @@ public class DomainsRoutes implements Routes {
     private String addDomain(Request request, Response response) {
         Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
         try {
-            addDomain(domain);
+            domainList.addDomain(domain);
             return Responses.returnNoContent(response);
         } catch (DomainListException e) {
             LOGGER.info("{} already exists", domain);
@@ -278,12 +277,6 @@ public class DomainsRoutes implements Routes {
         }
     }
 
-    private void addDomain(Domain domain) throws DomainListException {
-        Preconditions.checkArgument(domain.name().length() < MAXIMUM_DOMAIN_SIZE,
-            "Domain name length should not exceed " + (MAXIMUM_DOMAIN_SIZE - 1) + " characters");
-        domainList.addDomain(domain);
-    }
-
     private String exists(Request request, Response response) throws DomainListException {
         Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
 


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


[james-project] 18/30: JAMES-2937 Dequeue should work after network outage

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 00acb85935ef99c0a262aa3f2a94a57e79d0c507
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 14:34:20 2019 +0700

    JAMES-2937 Dequeue should work after network outage
---
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      | 32 ++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index 9ba2b50..f8f7bd3 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify;
 
 import java.time.Duration;
 import java.time.Instant;
+import java.util.List;
 import java.util.function.Function;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
@@ -218,6 +219,37 @@ class RabbitMQMailQueueTest {
 
         }
 
+        @Test
+        void dequeueShouldWorkAfterNetworkOutage() throws Exception {
+            String name1 = "myMail1";
+            String name2 = "myMail2";
+            String name3 = "myMail3";
+            Flux<MailQueue.MailQueueItem> dequeueFlux = Flux.from(getMailQueue().deQueue());
+            getMailQueue().enQueue(defaultMail()
+                .name(name1)
+                .build());
+
+            rabbitMQExtension.getRabbitMQ().pause();
+            Thread.sleep(2000);
+
+            getMailQueue().enQueue(defaultMail()
+                .name(name2)
+                .build());
+
+            rabbitMQExtension.getRabbitMQ().unpause();
+            Thread.sleep(100);
+
+            getMailQueue().enQueue(defaultMail()
+                .name(name3)
+                .build());
+
+            List<MailQueue.MailQueueItem> items = dequeueFlux.take(3).collectList().block(Duration.ofSeconds(10));
+
+            assertThat(items)
+                .extracting(item -> item.getMail().getName())
+                .containsExactly(name1, name2, name3);
+        }
+
         private void enqueueSomeMails(Function<Integer, String> namePattern, int emailCount) {
             IntStream.rangeClosed(1, emailCount)
                 .forEach(Throwing.intConsumer(i -> enQueue(defaultMail()


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


[james-project] 07/30: JAMES-2939 Prevent mixed case INBOX creation through JMAP

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b505d74da583712543f0507b651d5a74ff8d41ba
Author: Gautier DI FOLCO <gd...@linagora.com>
AuthorDate: Tue Oct 29 13:05:47 2019 +0100

    JAMES-2939 Prevent mixed case INBOX creation through JMAP
---
 .../org/apache/james/mailbox/MailboxManager.java   | 13 ++++
 .../mailbox/exception/InboxAlreadyCreated.java     | 50 ++++++++++++++
 .../apache/james/mailbox/MailboxManagerTest.java   | 63 ++++++++++++++++++
 .../james/mailbox/store/StoreMailboxManager.java   | 76 +++++++++++++++-------
 .../org/apache/james/imap/scripts/StringArgs.test  |  6 +-
 .../integration/SetMailboxesMethodTest.java        | 32 +++++++++
 .../methods/SetMailboxesCreationProcessor.java     | 14 +++-
 .../james/jmap/draft/model/MailboxFactoryTest.java | 13 ++--
 .../james/jmap/draft/utils/MailboxUtilsTest.java   |  5 +-
 9 files changed, 237 insertions(+), 35 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index 3af341c..d9bdf61 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -256,6 +256,19 @@ public interface MailboxManager extends RequestAware, RightManager, MailboxAnnot
     boolean mailboxExists(MailboxPath mailboxPath, MailboxSession session) throws MailboxException;
 
     /**
+     * Does the user INBOX exist?
+     *
+     * @param session
+     *            the context for this call, not null
+     * @return true when the INBOX exists and is accessible for the given
+     *         user, false otherwise
+     * @throws MailboxException
+     */
+    default boolean hasInbox(MailboxSession session) throws MailboxException {
+        return mailboxExists(MailboxPath.inbox(session), session);
+    }
+
+    /**
      * Creates a new system session.<br>
      * A system session is intended to be used for programmatic access.<br>
      * Use {@link #login(String, String)} when accessing this API from a
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/InboxAlreadyCreated.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/InboxAlreadyCreated.java
new file mode 100644
index 0000000..c673c39
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/InboxAlreadyCreated.java
@@ -0,0 +1,50 @@
+/**
+ * *************************************************************
+ * 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.mailbox.exception;
+
+/**
+ * Indicates that the operation failed since INBOX already exists.
+ */
+public class InboxAlreadyCreated extends MailboxException {
+
+    private static final long serialVersionUID = -486251759505030366L;
+
+    private final String mailboxName;
+
+    public InboxAlreadyCreated(String mailboxName) {
+        super("The mailbox '" + mailboxName + "' already exists as 'INBOX'");
+        this.mailboxName = mailboxName;
+    }
+
+    /**
+     * Gets the name of the mailbox which already exists.
+     *
+     * @return the mailboxName, not null
+     */
+    public final String getMailboxName() {
+        return mailboxName;
+    }
+
+    public String toString() {
+        return getMessage();
+    }
+
+}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
index e0a2ad9..eacf95e 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/MailboxManagerTest.java
@@ -49,7 +49,10 @@ import org.apache.james.mailbox.events.MailboxListener;
 import org.apache.james.mailbox.events.MessageMoveEvent;
 import org.apache.james.mailbox.exception.AnnotationException;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
+import org.apache.james.mailbox.exception.InboxAlreadyCreated;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.exception.MailboxExistsException;
+import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.TooLongMailboxNameException;
 import org.apache.james.mailbox.extension.PreDeletionHook;
 import org.apache.james.mailbox.mock.DataProvisioner;
@@ -165,6 +168,66 @@ public abstract class MailboxManagerTest<T extends MailboxManager> {
     }
 
     @Nested
+    class MailboxCreationTests {
+        @Test
+        void hasInboxShouldBeFalseWhenINBOXIsNotCreated() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            assertThat(mailboxManager.hasInbox(session)).isFalse();
+        }
+
+        @Test
+        void hasInboxShouldBeTrueWhenINBOXIsCreated() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            MailboxPath mailboxPath = MailboxPath.inbox(session);
+            Optional<MailboxId> mailboxId = mailboxManager.createMailbox(mailboxPath, session);
+            MessageManager retrievedMailbox = mailboxManager.getMailbox(mailboxPath, session);
+
+            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
+        }
+
+        @Test
+        void creatingMixedCaseINBOXShouldCreateItAsINBOX() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            Optional<MailboxId> mailboxId = mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx"), session);
+            MessageManager retrievedMailbox = mailboxManager.getMailbox(MailboxPath.inbox(session), session);
+
+            assertThat(mailboxManager.hasInbox(session)).isTrue();
+            assertThat(mailboxId.get()).isEqualTo(retrievedMailbox.getId());
+        }
+
+        @Test
+        void creatingMixedCaseINBOXShouldNotBeRetrievableAsIt() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            MailboxPath mailboxPath = MailboxPath.forUser(USER_1, "iNbOx");
+            Optional<MailboxId> mailboxId = mailboxManager.createMailbox(mailboxPath, session);
+            assertThat(mailboxId).isPresent();
+
+            assertThatThrownBy(() -> mailboxManager.getMailbox(mailboxPath, session))
+                .isInstanceOf(MailboxNotFoundException.class);
+        }
+
+        @Test
+        void creatingMixedCaseINBOXWhenItHasAlreadyBeenCreatedShouldThrow() throws Exception {
+            session = mailboxManager.createSystemSession(USER_1);
+            mailboxManager.startProcessingRequest(session);
+
+            mailboxManager.createMailbox(MailboxPath.inbox(session), session);
+
+            assertThatThrownBy(() -> mailboxManager.createMailbox(MailboxPath.forUser(USER_1, "iNbOx"), session))
+                .isInstanceOf(InboxAlreadyCreated.class);
+        }
+    }
+
+    @Nested
     class MailboxNameLimitTests {
         @Test
         void creatingMailboxShouldNotFailWhenLimitNameLength() throws Exception {
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index abd895c..c76ae83 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -44,6 +44,7 @@ import org.apache.james.mailbox.StandardMailboxMetaDataComparator;
 import org.apache.james.mailbox.events.EventBus;
 import org.apache.james.mailbox.events.MailboxIdRegistrationKey;
 import org.apache.james.mailbox.exception.HasEmptyMailboxNameInHierarchyException;
+import org.apache.james.mailbox.exception.InboxAlreadyCreated;
 import org.apache.james.mailbox.exception.InsufficientRightsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
@@ -352,34 +353,64 @@ public class StoreMailboxManager implements MailboxManager {
         return Optional.empty();
     }
 
-    private List<MailboxId> createMailboxesForPath(MailboxSession mailboxSession, MailboxPath sanitizedMailboxPath) throws MailboxException {
+    private List<MailboxId> createMailboxesForPath(MailboxSession mailboxSession, MailboxPath sanitizedMailboxPath) {
         // Create parents first
         // If any creation fails then the mailbox will not be created
         // TODO: transaction
+        List<MailboxPath> intermediatePaths = sanitizedMailboxPath.getHierarchyLevels(getDelimiter());
+        boolean isRootPath = intermediatePaths.size() == 1;
+
+        return intermediatePaths
+            .stream()
+            .flatMap(Throwing.<MailboxPath, Stream<MailboxId>>function(mailbox -> manageMailboxCreation(mailboxSession, isRootPath, mailbox)).sneakyThrow())
+            .collect(Guavate.toImmutableList());
+    }
+
+    private Stream<MailboxId> manageMailboxCreation(MailboxSession mailboxSession, boolean isRootPath, MailboxPath mailbox) throws MailboxException {
+        if (mailbox.isInbox()) {
+            if (hasInbox(mailboxSession)) {
+                return duplicatedINBOXCreation(isRootPath, mailbox);
+            }
+
+            return performConcurrentMailboxCreation(mailboxSession, MailboxPath.inbox(mailboxSession)).stream();
+        }
+
+        return performConcurrentMailboxCreation(mailboxSession, mailbox).stream();
+    }
+
+
+    private Stream<MailboxId> duplicatedINBOXCreation(boolean isRootPath, MailboxPath mailbox) throws InboxAlreadyCreated {
+        if (isRootPath) {
+            throw new InboxAlreadyCreated(mailbox.getName());
+        }
+
+        return Stream.empty();
+    }
+
+    private List<MailboxId> performConcurrentMailboxCreation(MailboxSession mailboxSession, MailboxPath mailbox) throws MailboxException {
         List<MailboxId> mailboxIds = new ArrayList<>();
-        for (MailboxPath mailbox : sanitizedMailboxPath.getHierarchyLevels(getDelimiter())) {
-            locker.executeWithLock(mailboxSession, mailbox, (LockAwareExecution<Void>) () -> {
-                if (!mailboxExists(mailbox, mailboxSession)) {
-                    Mailbox m = doCreateMailbox(mailbox);
-                    MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
-                    try {
-                        mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m))));
-                        // notify listeners
-                        eventBus.dispatch(EventFactory.mailboxAdded()
-                            .randomEventId()
-                            .mailboxSession(mailboxSession)
-                            .mailbox(m)
-                            .build(),
-                            new MailboxIdRegistrationKey(m.getMailboxId()))
-                            .block();
-                    } catch (MailboxExistsException e) {
-                        LOGGER.info("{} mailbox was created concurrently", m.generateAssociatedPath());
-                    }
+        locker.executeWithLock(mailboxSession, mailbox, (LockAwareExecution<Void>) () -> {
+            if (!mailboxExists(mailbox, mailboxSession)) {
+                Mailbox m = doCreateMailbox(mailbox);
+                MailboxMapper mapper = mailboxSessionMapperFactory.getMailboxMapper(mailboxSession);
+                try {
+                    mapper.execute(Mapper.toTransaction(() -> mailboxIds.add(mapper.save(m))));
+                    // notify listeners
+                    eventBus.dispatch(EventFactory.mailboxAdded()
+                        .randomEventId()
+                        .mailboxSession(mailboxSession)
+                        .mailbox(m)
+                        .build(),
+                        new MailboxIdRegistrationKey(m.getMailboxId()))
+                        .block();
+                } catch (MailboxExistsException e) {
+                    LOGGER.info("{} mailbox was created concurrently", m.generateAssociatedPath());
                 }
-                return null;
+            }
+            return null;
+
+        }, true);
 
-            }, true);
-        }
         return mailboxIds;
     }
 
@@ -645,7 +676,6 @@ public class StoreMailboxManager implements MailboxManager {
         } catch (MailboxNotFoundException e) {
             return false;
         }
-
     }
 
     /**
diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/StringArgs.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/StringArgs.test
index eb81a9a..220a42c 100644
--- a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/StringArgs.test
+++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/StringArgs.test
@@ -28,11 +28,15 @@ C: a001 STATUS INBOX (MESSAGES)
 S: \* STATUS \"INBOX\" \(MESSAGES \d+\)
 S: a001 OK STATUS completed.
 
-# Case-insensitive inbox
+# Case-insensitive INBOX
 C: a001 STATUS InBoX (MESSAGES)
 S: \* STATUS \"INBOX\" \(MESSAGES \d+\)
 S: a001 OK STATUS completed.
 
+# Case-insensitive INBOX creation check
+C: a1 CREATE "iNbOx"
+S: a1 NO CREATE failed. Mailbox already exists.
+
 # Tests with an atomic mailbox name.
 C: a1 CREATE atomMailbox
 S: a1 OK CREATE completed.
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
index 919b640..c55f9d1 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
@@ -275,6 +275,38 @@ public abstract class SetMailboxesMethodTest {
         assertThat(mailboxProbe.listSubscriptions(username)).contains("foo");
     }
 
+    @Category(BasicFeature.class)
+    @Test
+    public void userShouldGetAnErrorWhenNotBeAbleToCreateACaseVariationOfINBOX() throws Exception {
+        String requestBody =
+            "[" +
+                "  [ \"setMailboxes\"," +
+                "    {" +
+                "      \"create\": {" +
+                "        \"create-id01\" : {" +
+                "          \"name\" : \"iNbOx\"" +
+                "        }" +
+                "      }" +
+                "    }," +
+                "    \"#0\"" +
+                "  ]" +
+                "]";
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body(requestBody)
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("mailboxesSet"))
+            .body(ARGUMENTS + ".notCreated", hasKey("create-id01"))
+            .body(ARGUMENTS + ".notCreated.create-id01.type", equalTo("invalidArguments"))
+            .body(ARGUMENTS + ".notCreated.create-id01.description", equalTo("The mailbox 'iNbOx' already exists as 'INBOX'"));
+
+        assertThat(mailboxProbe.listUserMailboxes(username)).doesNotContain("iNbOx");
+    }
+
     @Test
     public void userShouldBeSubscribedOnCreatedMailboxWhenCreateChildOfInboxMailbox() throws Exception {
         MailboxId inboxId = mailboxProbe.getMailboxId(MailboxConstants.USER_NAMESPACE, username, MailboxConstants.INBOX);
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesCreationProcessor.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesCreationProcessor.java
index 84c0c01..7663c5b 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesCreationProcessor.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/SetMailboxesCreationProcessor.java
@@ -41,6 +41,7 @@ import org.apache.james.jmap.draft.utils.SortingHierarchicalCollections;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.SubscriptionManager;
+import org.apache.james.mailbox.exception.InboxAlreadyCreated;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.exception.MailboxNameException;
@@ -153,13 +154,20 @@ public class SetMailboxesCreationProcessor implements SetMailboxesProcessor {
                     .type(SetError.Type.INVALID_ARGUMENTS)
                     .description(message)
                     .build());
+        } catch (InboxAlreadyCreated e) {
+            String message = String.format("The mailbox '%s' already exists as 'INBOX'", e.getMailboxName());
+            LOGGER.error(message, e);
+            builder.notCreated(mailboxCreationId, SetError.builder()
+                .type(SetError.Type.INVALID_ARGUMENTS)
+                .description(message)
+                .build());
         } catch (MailboxException e) {
             String message = String.format("An error occurred when creating the mailbox '%s'", mailboxCreationId.getCreationId());
             LOGGER.error(message, e);
             builder.notCreated(mailboxCreationId, SetError.builder()
-                    .type(SetError.Type.ERROR)
-                    .description(message)
-                    .build());
+                .type(SetError.Type.ERROR)
+                .description(message)
+                .build());
         }
     }
 
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
index 36edf82..e507930 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/model/MailboxFactoryTest.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.manager.ManagerTestProvisionner;
 import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -132,11 +133,11 @@ public class MailboxFactoryTest {
 
     @Test
     public void getParentIdFromMailboxPathShouldReturnParentIdWhenChildMailbox() throws Exception {
-        MailboxPath parentMailboxPath = MailboxPath.forUser(user, "inbox");
+        MailboxPath parentMailboxPath = MailboxPath.forUser(user, MailboxConstants.INBOX);
         mailboxManager.createMailbox(parentMailboxPath, mailboxSession);
         MailboxId parentId = mailboxManager.getMailbox(parentMailboxPath, mailboxSession).getId();
 
-        MailboxPath mailboxPath = MailboxPath.forUser(user, "inbox.mailbox");
+        MailboxPath mailboxPath = MailboxPath.forUser(user, "INBOX.mailbox");
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
 
         Optional<MailboxId> id = sut.getParentIdFromMailboxPath(mailboxPath, Optional.empty(), mailboxSession);
@@ -192,7 +193,7 @@ public class MailboxFactoryTest {
 
     @Test
     public void getNamespaceShouldReturnDelegatedNamespaceWhenUserMailboxPathAndUserMailboxSessionAreNotTheSame() throws Exception {
-        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        MailboxPath inbox = MailboxPath.forUser(user, MailboxConstants.INBOX);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession);
         mailboxManager.applyRightsCommand(inbox,
             MailboxACL.command()
@@ -232,7 +233,7 @@ public class MailboxFactoryTest {
 
     @Test
     public void delegatedUserShouldHaveMayAddItemsWhenAllowedToInsert() throws Exception {
-        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        MailboxPath inbox = MailboxPath.forUser(user, MailboxConstants.INBOX);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession);
         mailboxManager.applyRightsCommand(inbox,
             MailboxACL.command()
@@ -257,7 +258,7 @@ public class MailboxFactoryTest {
 
     @Test
     public void delegatedUserShouldHaveMayReadItemsWhenAllowedToRead() throws Exception {
-        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        MailboxPath inbox = MailboxPath.forUser(user, MailboxConstants.INBOX);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession);
         mailboxManager.applyRightsCommand(inbox,
             MailboxACL.command()
@@ -282,7 +283,7 @@ public class MailboxFactoryTest {
 
     @Test
     public void delegatedUserShouldHaveMayRemoveItemsWhenAllowedToRemoveItems() throws Exception {
-        MailboxPath inbox = MailboxPath.forUser(user, "inbox");
+        MailboxPath inbox = MailboxPath.forUser(user, MailboxConstants.INBOX);
         Optional<MailboxId> mailboxId = mailboxManager.createMailbox(inbox, mailboxSession);
         mailboxManager.applyRightsCommand(inbox,
             MailboxACL.command()
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MailboxUtilsTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MailboxUtilsTest.java
index 7a48a3a..5269169 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MailboxUtilsTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/utils/MailboxUtilsTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.junit.Before;
@@ -55,11 +56,11 @@ public class MailboxUtilsTest {
 
     @Test
     public void hasChildrenShouldReturnTrueWhenHasAChild() throws Exception {
-        MailboxPath parentMailboxPath = MailboxPath.forUser(user, "inbox");
+        MailboxPath parentMailboxPath = MailboxPath.forUser(user, MailboxConstants.INBOX);
         mailboxManager.createMailbox(parentMailboxPath, mailboxSession);
         MailboxId parentId = mailboxManager.getMailbox(parentMailboxPath, mailboxSession).getId();
 
-        MailboxPath mailboxPath = MailboxPath.forUser(user, "inbox.myBox");
+        MailboxPath mailboxPath = MailboxPath.forUser(user, "INBOX.myBox");
         mailboxManager.createMailbox(mailboxPath, mailboxSession);
 
         assertThat(sut.hasChildren(parentId, mailboxSession)).isTrue();


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


[james-project] 06/30: JAMES-2937 Get rid of simple channelPool

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 7423ee71cba86f767d82c7d3dcca50af9d574caa
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 13:46:15 2019 +0700

    JAMES-2937 Get rid of simple channelPool
---
 .../backends/rabbitmq/RabbitMQChannelPool.java     |  55 ---------
 .../james/backends/rabbitmq/SimpleChannelPool.java | 128 ---------------------
 .../james/modules/rabbitmq/RabbitMQModule.java     |   5 -
 3 files changed, 188 deletions(-)

diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQChannelPool.java
deleted file mode 100644
index a544efb..0000000
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQChannelPool.java
+++ /dev/null
@@ -1,55 +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.james.backends.rabbitmq;
-
-import com.rabbitmq.client.Channel;
-import reactor.core.publisher.Flux;
-import reactor.rabbitmq.AcknowledgableDelivery;
-
-public interface RabbitMQChannelPool {
-    class ConnectionFailedException extends RuntimeException {
-        public ConnectionFailedException(Throwable cause) {
-            super(cause);
-        }
-    }
-
-    @FunctionalInterface
-    interface RabbitFunction<T, E extends Throwable> {
-        T execute(Channel channel) throws E;
-    }
-
-    @FunctionalInterface
-    interface RabbitConsumer<E extends Throwable> {
-        void execute(Channel channel) throws E;
-    }
-
-    <T, E extends Throwable> T execute(RabbitFunction<T, E> f)
-        throws E, ConnectionFailedException;
-
-
-    <E extends Throwable> void execute(RabbitConsumer<E> f)
-        throws E, ConnectionFailedException;
-
-    Flux<AcknowledgableDelivery> receive(String queueName);
-
-    boolean tryConnection();
-
-    void close() throws Exception;
-}
diff --git a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/SimpleChannelPool.java b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/SimpleChannelPool.java
deleted file mode 100644
index c322af7..0000000
--- a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/SimpleChannelPool.java
+++ /dev/null
@@ -1,128 +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.james.backends.rabbitmq;
-
-import java.io.IOException;
-import java.time.Duration;
-import java.util.Optional;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.annotation.PreDestroy;
-import javax.inject.Inject;
-
-import com.github.fge.lambdas.Throwing;
-import com.google.common.annotations.VisibleForTesting;
-import com.rabbitmq.client.Channel;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-import reactor.core.scheduler.Schedulers;
-import reactor.rabbitmq.AcknowledgableDelivery;
-import reactor.rabbitmq.RabbitFlux;
-import reactor.rabbitmq.Receiver;
-import reactor.rabbitmq.ReceiverOptions;
-
-public class SimpleChannelPool implements RabbitMQChannelPool {
-    private final AtomicReference<Channel> channelReference;
-    private final Receiver rabbitFlux;
-    private final SimpleConnectionPool connectionPool;
-
-    @Inject
-    @VisibleForTesting
-    SimpleChannelPool(SimpleConnectionPool connectionPool) {
-        this.connectionPool = connectionPool;
-        this.channelReference = new AtomicReference<>();
-        this.rabbitFlux = RabbitFlux
-            .createReceiver(new ReceiverOptions().connectionMono(connectionPool.getResilientConnection()));
-    }
-
-    @Override
-    public Flux<AcknowledgableDelivery> receive(String queueName) {
-        return rabbitFlux.consumeManualAck(queueName);
-    }
-
-    @Override
-    public <T, E extends Throwable> T execute(RabbitFunction<T, E> f) throws E, ConnectionFailedException {
-        return f.execute(getResilientChannel().block());
-    }
-
-    @Override
-    public <E extends Throwable> void execute(RabbitConsumer<E> f) throws E, ConnectionFailedException {
-        f.execute(getResilientChannel().block());
-    }
-
-    @PreDestroy
-    @Override
-    public void close() {
-        Optional.ofNullable(channelReference.get())
-            .filter(Channel::isOpen)
-            .ifPresent(Throwing.<Channel>consumer(Channel::close).orDoNothing());
-
-        try {
-            rabbitFlux.close();
-        } catch (Throwable ignored) {
-            //ignore exception during close
-        }
-    }
-
-    private Mono<Channel> getResilientChannel() {
-        int numRetries = 100;
-        Duration initialDelay = Duration.ofMillis(100);
-        Duration forever = Duration.ofMillis(Long.MAX_VALUE);
-        return Mono.defer(this::getOpenChannel)
-            .retryBackoff(numRetries, initialDelay, forever, Schedulers.boundedElastic());
-    }
-
-    private Mono<Channel> getOpenChannel() {
-        Channel previous = channelReference.get();
-        return Mono.justOrEmpty(previous)
-            .publishOn(Schedulers.boundedElastic())
-            .filter(Channel::isOpen)
-            .switchIfEmpty(connectionPool.getResilientConnection()
-                .flatMap(connection -> Mono.fromCallable(connection::createChannel)))
-            .flatMap(current -> replaceCurrentChannel(previous, current))
-            .onErrorMap(t -> new RuntimeException("unable to create and register a new Channel", t));
-    }
-
-    private Mono<Channel> replaceCurrentChannel(Channel previous, Channel current) {
-        if (channelReference.compareAndSet(previous, current)) {
-            return Mono.just(current);
-        } else {
-            try {
-                current.close();
-            } catch (IOException | TimeoutException e) {
-                //error below
-            }
-            return Mono.error(new RuntimeException("unable to create and register a new Channel"));
-        }
-    }
-
-    @Override
-    public boolean tryConnection() {
-        try {
-            return connectionPool.tryConnection() &&
-                getOpenChannel()
-                    .blockOptional()
-                    .isPresent();
-        } catch (Throwable t) {
-            return false;
-        }
-    }
-}
diff --git a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
index 4226aea..e887d6a 100644
--- a/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
+++ b/server/container/guice/rabbitmq/src/main/java/org/apache/james/modules/rabbitmq/RabbitMQModule.java
@@ -26,11 +26,9 @@ import javax.inject.Singleton;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.backends.rabbitmq.RabbitMQChannelPool;
 import org.apache.james.backends.rabbitmq.RabbitMQConfiguration;
 import org.apache.james.backends.rabbitmq.RabbitMQHealthCheck;
 import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
-import org.apache.james.backends.rabbitmq.SimpleChannelPool;
 import org.apache.james.core.healthcheck.HealthCheck;
 import org.apache.james.eventsourcing.eventstore.cassandra.dto.EventDTOModule;
 import org.apache.james.queue.api.MailQueueFactory;
@@ -79,9 +77,6 @@ public class RabbitMQModule extends AbstractModule {
         bind(CassandraMailQueueMailDelete.class).in(Scopes.SINGLETON);
         bind(CassandraMailQueueMailStore.class).in(Scopes.SINGLETON);
 
-        bind(SimpleChannelPool.class).in(Scopes.SINGLETON);
-        bind(RabbitMQChannelPool.class).to(SimpleChannelPool.class);
-
         Multibinder<CassandraModule> cassandraModuleBinder = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraModuleBinder.addBinding().toInstance(CassandraMailQueueViewModule.MODULE);
 


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


[james-project] 05/30: JAMES-2937 RabbitMQExtension should be responsible of channelPool lifecycle

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 9a115d8fa1be464c51c74ff17ec1ec1dec7d6729
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 31 13:45:17 2019 +0700

    JAMES-2937 RabbitMQExtension should be responsible of channelPool lifecycle
---
 .../james/mailbox/events/RabbitMQEventBusTest.java | 46 ++++++----------------
 .../queue/rabbitmq/RabbitMQMailQueueFactory.java   |  3 +-
 .../RabbitMQMailQueueConfigurationChangeTest.java  |  9 +----
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      | 10 +----
 .../rabbitmq/RabbitMqMailQueueFactoryTest.java     |  9 +----
 .../distributed/DistributedTaskManagerTest.java    | 10 +----
 .../distributed/RabbitMQWorkQueueTest.java         | 11 ++----
 7 files changed, 24 insertions(+), 74 deletions(-)

diff --git a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
index 2b92e20..1f0ffc8 100644
--- a/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
+++ b/mailbox/event/event-rabbitmq/src/test/java/org/apache/james/mailbox/events/RabbitMQEventBusTest.java
@@ -75,17 +75,11 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.RegisterExtension;
 import org.mockito.stubbing.Answer;
 
-import com.rabbitmq.client.Connection;
-
-import reactor.core.publisher.Mono;
 import reactor.rabbitmq.BindingSpecification;
 import reactor.rabbitmq.ExchangeSpecification;
 import reactor.rabbitmq.QueueSpecification;
-import reactor.rabbitmq.RabbitFlux;
 import reactor.rabbitmq.Receiver;
-import reactor.rabbitmq.ReceiverOptions;
 import reactor.rabbitmq.Sender;
-import reactor.rabbitmq.SenderOptions;
 
 class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract, GroupContract.MultipleEventBusGroupContract,
     KeyContract.SingleEventBusKeyContract, KeyContract.MultipleEventBusKeyContract,
@@ -100,8 +94,6 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     private EventSerializer eventSerializer;
     private RoutingKeyConverter routingKeyConverter;
     private MemoryEventDeadLetters memoryEventDeadLetters;
-    private Mono<Connection> resilientConnection;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setUp() {
@@ -110,8 +102,6 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         TestId.Factory mailboxIdFactory = new TestId.Factory();
         eventSerializer = new EventSerializer(mailboxIdFactory, new TestMessageId.Factory(), new DefaultUserQuotaRootResolver.DefaultQuotaRootDeserializer());
         routingKeyConverter = RoutingKeyConverter.forFactories(new MailboxIdRegistrationKey.Factory(mailboxIdFactory));
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
 
         eventBus = newEventBus();
         eventBus2 = newEventBus();
@@ -120,7 +110,6 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         eventBus.start();
         eventBus2.start();
         eventBus3.start();
-        resilientConnection = rabbitMQExtension.getRabbitConnectionPool().getResilientConnection();
     }
 
     @AfterEach
@@ -130,13 +119,15 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         eventBus3.stop();
         ALL_GROUPS.stream()
             .map(GroupRegistration.WorkQueueName::of)
-            .forEach(queueName -> reactorRabbitMQChannelPool.getSender().delete(QueueSpecification.queue(queueName.asString())).block());
-        reactorRabbitMQChannelPool.getSender().delete(ExchangeSpecification.exchange(MAILBOX_EVENT_EXCHANGE_NAME)).block();
-        reactorRabbitMQChannelPool.close();
+            .forEach(queueName -> rabbitMQExtension.getRabbitChannelPool().getSender().delete(QueueSpecification.queue(queueName.asString())).block());
+        rabbitMQExtension.getRabbitChannelPool()
+            .getSender()
+            .delete(ExchangeSpecification.exchange(MAILBOX_EVENT_EXCHANGE_NAME))
+            .block();
     }
 
     private RabbitMQEventBus newEventBus() {
-        return newEventBus(reactorRabbitMQChannelPool);
+        return newEventBus(rabbitMQExtension.getRabbitChannelPool());
     }
 
     private RabbitMQEventBus newEventBus(ReactorRabbitMQChannelPool rabbitMQChannelPool) {
@@ -262,31 +253,24 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
     @Nested
     class PublishingTest {
         private static final String MAILBOX_WORK_QUEUE_NAME = MAILBOX_EVENT + "-workQueue";
-        private Sender sender1;
 
         @BeforeEach
         void setUp() {
-            SenderOptions senderOption = new SenderOptions().connectionMono(resilientConnection);
-            sender1 = RabbitFlux.createSender(senderOption);
+            Sender sender = rabbitMQExtension.getRabbitChannelPool().getSender();
 
-            sender1.declareQueue(QueueSpecification.queue(MAILBOX_WORK_QUEUE_NAME)
+            sender.declareQueue(QueueSpecification.queue(MAILBOX_WORK_QUEUE_NAME)
                 .durable(DURABLE)
                 .exclusive(!EXCLUSIVE)
                 .autoDelete(!AUTO_DELETE)
                 .arguments(NO_ARGUMENTS))
                 .block();
-            sender1.bind(BindingSpecification.binding()
+            sender.bind(BindingSpecification.binding()
                 .exchange(MAILBOX_EVENT_EXCHANGE_NAME)
                 .queue(MAILBOX_WORK_QUEUE_NAME)
                 .routingKey(EMPTY_ROUTING_KEY))
                 .block();
         }
 
-        @AfterEach
-        void tearDown() {
-            sender1.close();
-        }
-
         @Test
         void dispatchShouldPublishSerializedEventToRabbitMQ() {
             eventBus.dispatch(EVENT, NO_KEYS).block();
@@ -302,7 +286,7 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
         }
 
         private Event dequeueEvent() {
-            try (Receiver receiver = RabbitFlux.createReceiver(new ReceiverOptions().connectionMono(resilientConnection))) {
+            try (Receiver receiver = rabbitMQExtension.getRabbitChannelPool().createReceiver()) {
                 byte[] eventInBytes = receiver.consumeAutoAck(MAILBOX_WORK_QUEUE_NAME)
                     .blockFirst()
                     .getBody();
@@ -341,18 +325,10 @@ class RabbitMQEventBusTest implements GroupContract.SingleEventBusGroupContract,
                     .restartPolicy(DockerRestartPolicy.PER_TEST);
 
                 private RabbitMQEventBus rabbitMQEventBusWithNetWorkIssue;
-                private ReactorRabbitMQChannelPool reactorRabbitMQChannelPoolWithNetWorkIssue;
 
                 @BeforeEach
                 void beforeEach() {
-                    reactorRabbitMQChannelPoolWithNetWorkIssue = new ReactorRabbitMQChannelPool(rabbitMQNetWorkIssueExtension.getRabbitConnectionPool());
-                    reactorRabbitMQChannelPoolWithNetWorkIssue.start();
-                    rabbitMQEventBusWithNetWorkIssue = newEventBus(reactorRabbitMQChannelPoolWithNetWorkIssue);
-                }
-
-                @AfterEach
-                void afterEach() {
-                    reactorRabbitMQChannelPoolWithNetWorkIssue.close();
+                    rabbitMQEventBusWithNetWorkIssue = newEventBus(rabbitMQNetWorkIssueExtension.getRabbitChannelPool());
                 }
 
                 @Test
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
index b48f60f..7c0325a 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
@@ -180,7 +180,8 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
                 .exclusive(!EXCLUSIVE)
                 .autoDelete(!AUTO_DELETE)
                 .arguments(NO_ARGUMENTS)),
-            reactorRabbitMQChannelPool.getSender().bind(BindingSpecification.binding()
+            reactorRabbitMQChannelPool.getSender()
+                .bind(BindingSpecification.binding()
                 .exchange(mailQueueName.toRabbitExchangeName().asString())
                 .queue(mailQueueName.toWorkQueueName().asString())
                 .routingKey(EMPTY_ROUTING_KEY)))
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 4ad6f85..a67fd34 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
@@ -36,7 +36,6 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
-import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
@@ -90,7 +89,6 @@ class RabbitMQMailQueueConfigurationChangeTest {
     private UpdatableTickingClock clock;
     private RabbitMQMailQueueManagement mqManagementApi;
     private MimeMessageStore.Factory mimeMessageStoreFactory;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setup(CassandraCluster cassandra) throws Exception {
@@ -98,14 +96,11 @@ class RabbitMQMailQueueConfigurationChangeTest {
         mimeMessageStoreFactory = MimeMessageStore.factory(blobsDAO);
         clock = new UpdatableTickingClock(IN_SLICE_1);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
     }
 
     @AfterEach
     void tearDown() {
         mqManagementApi.deleteAllQueues();
-        reactorRabbitMQChannelPool.close();
     }
 
     private RabbitMQMailQueue getRabbitMQMailQueue(CassandraCluster cassandra, CassandraMailQueueViewConfiguration mailQueueViewConfiguration) throws Exception {
@@ -123,14 +118,14 @@ class RabbitMQMailQueueConfigurationChangeTest {
         RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            reactorRabbitMQChannelPool,
+            rabbitMQExtension.getRabbitChannelPool(),
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
             clock,
             new RawMailQueueItemDecoratorFactory(),
             mailQueueSizeConfiguration);
-        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, privateFactory);
+        RabbitMQMailQueueFactory mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitChannelPool(), mqManagementApi, privateFactory);
         return mailQueueFactory.createQueue(SPOOL);
     }
 
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index 0102a05..9ba2b50 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -38,13 +38,11 @@ import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionModule;
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
-import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
 import org.apache.james.blob.mail.MimeMessageStore;
 import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreModule;
-
 import org.apache.james.metrics.api.Gauge;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueMetricContract;
@@ -99,11 +97,9 @@ class RabbitMQMailQueueTest {
     private UpdatableTickingClock clock;
     private RabbitMQMailQueue mailQueue;
     private RabbitMQMailQueueManagement mqManagementApi;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @AfterEach
     void tearDown() {
-        reactorRabbitMQChannelPool.close();
         mqManagementApi.deleteAllQueues();
     }
 
@@ -275,12 +271,10 @@ class RabbitMQMailQueueTest {
                 .build(),
             mimeMessageStoreFactory);
 
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
         RabbitMQMailQueueFactory.PrivateFactory factory = new RabbitMQMailQueueFactory.PrivateFactory(
             metricTestSystem.getMetricFactory(),
             metricTestSystem.getSpyGaugeRegistry(),
-            reactorRabbitMQChannelPool,
+            rabbitMQExtension.getRabbitChannelPool(),
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
@@ -288,7 +282,7 @@ class RabbitMQMailQueueTest {
             new RawMailQueueItemDecoratorFactory(),
             configuration);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, factory);
+        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitChannelPool(), mqManagementApi, factory);
         mailQueue = mailQueueFactory.createQueue(SPOOL);
     }
 }
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 8ac46b3..81a5e18 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
@@ -30,7 +30,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
-import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.mail.MimeMessageStore;
 import org.apache.james.metrics.api.NoopGaugeRegistry;
@@ -54,7 +53,6 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
 
     private RabbitMQMailQueueFactory mailQueueFactory;
     private RabbitMQMailQueueManagement mqManagementApi;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     @BeforeEach
     void setup() throws Exception {
@@ -68,12 +66,10 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             .sizeMetricsEnabled(true)
             .build();
 
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
         RabbitMQMailQueueFactory.PrivateFactory privateFactory = new RabbitMQMailQueueFactory.PrivateFactory(
             new NoopMetricFactory(),
             new NoopGaugeRegistry(),
-            reactorRabbitMQChannelPool,
+            rabbitMQExtension.getRabbitChannelPool(),
             mimeMessageStoreFactory,
             BLOB_ID_FACTORY,
             mailQueueViewFactory,
@@ -81,13 +77,12 @@ class RabbitMqMailQueueFactoryTest implements MailQueueFactoryContract<RabbitMQM
             new RawMailQueueItemDecoratorFactory(),
             configuration);
         mqManagementApi = new RabbitMQMailQueueManagement(rabbitMQExtension.managementAPI());
-        mailQueueFactory = new RabbitMQMailQueueFactory(reactorRabbitMQChannelPool, mqManagementApi, privateFactory);
+        mailQueueFactory = new RabbitMQMailQueueFactory(rabbitMQExtension.getRabbitChannelPool(), mqManagementApi, privateFactory);
     }
 
     @AfterEach
     void tearDown() {
         mqManagementApi.deleteAllQueues();
-        reactorRabbitMQChannelPool.close();
     }
 
     @Override
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
index 83c60d8..d6ed9d3 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/DistributedTaskManagerTest.java
@@ -73,9 +73,6 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 import com.github.steveash.guavate.Guavate;
 
 class DistributedTaskManagerTest implements TaskManagerContract {
-
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
-
     private static class TrackedRabbitMQWorkQueueSupplier implements WorkQueueSupplier {
         private final List<RabbitMQWorkQueue> workQueues;
         private final RabbitMQWorkQueueSupplier supplier;
@@ -141,9 +138,7 @@ class DistributedTaskManagerTest implements TaskManagerContract {
 
     @BeforeEach
     void setUp(EventStore eventStore) {
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
-        workQueueSupplier = new TrackedRabbitMQWorkQueueSupplier(reactorRabbitMQChannelPool, TASK_SERIALIZER);
+        workQueueSupplier = new TrackedRabbitMQWorkQueueSupplier(rabbitMQExtension.getRabbitChannelPool(), TASK_SERIALIZER);
         this.eventStore = eventStore;
         terminationSubscribers = new ArrayList<>();
     }
@@ -152,7 +147,6 @@ class DistributedTaskManagerTest implements TaskManagerContract {
     void tearDown() {
         terminationSubscribers.forEach(RabbitMQTerminationSubscriber::close);
         workQueueSupplier.stopWorkQueues();
-        reactorRabbitMQChannelPool.close();
     }
 
     public EventSourcingTaskManager taskManager() {
@@ -160,7 +154,7 @@ class DistributedTaskManagerTest implements TaskManagerContract {
     }
 
     private EventSourcingTaskManager taskManager(Hostname hostname) {
-        RabbitMQTerminationSubscriber terminationSubscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getRabbitConnectionPool(), EVENT_SERIALIZER);
+        RabbitMQTerminationSubscriber terminationSubscriber = new RabbitMQTerminationSubscriber(rabbitMQExtension.getRabbitChannelPool(), EVENT_SERIALIZER);
         terminationSubscribers.add(terminationSubscriber);
         terminationSubscriber.start();
         return new EventSourcingTaskManager(workQueueSupplier, eventStore, executionDetailsProjection, hostname, terminationSubscriber);
diff --git a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
index 5468af1..fefb6f1 100644
--- a/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
+++ b/server/task/task-distributed/src/test/java/org/apache/james/task/eventsourcing/distributed/RabbitMQWorkQueueTest.java
@@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 
 import org.apache.james.backends.rabbitmq.RabbitMQExtension;
-import org.apache.james.backends.rabbitmq.ReactorRabbitMQChannelPool;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.apache.james.server.task.json.TestTask;
 import org.apache.james.server.task.json.dto.TestTaskDTOModules;
@@ -69,7 +68,6 @@ class RabbitMQWorkQueueTest {
     private RabbitMQWorkQueue testee;
     private ImmediateWorker worker;
     private JsonTaskSerializer serializer;
-    private ReactorRabbitMQChannelPool reactorRabbitMQChannelPool;
 
     private static class ImmediateWorker implements TaskManagerWorker {
 
@@ -103,16 +101,13 @@ class RabbitMQWorkQueueTest {
     void setUp() {
         worker = spy(new ImmediateWorker());
         serializer = new JsonTaskSerializer(TestTaskDTOModules.COMPLETED_TASK_MODULE);
-        reactorRabbitMQChannelPool = new ReactorRabbitMQChannelPool(rabbitMQExtension.getRabbitConnectionPool());
-        reactorRabbitMQChannelPool.start();
-        testee = new RabbitMQWorkQueue(worker, reactorRabbitMQChannelPool, serializer);
+        testee = new RabbitMQWorkQueue(worker, rabbitMQExtension.getRabbitChannelPool(), serializer);
         testee.start();
     }
 
     @AfterEach
     void tearDown() {
         testee.close();
-        reactorRabbitMQChannelPool.close();
     }
 
     @Test
@@ -137,7 +132,7 @@ class RabbitMQWorkQueueTest {
         testee.submit(TASK_WITH_ID);
 
         ImmediateWorker otherTaskManagerWorker = new ImmediateWorker();
-        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, reactorRabbitMQChannelPool, serializer)) {
+        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, rabbitMQExtension.getRabbitChannelPool(), serializer)) {
             otherWorkQueue.start();
 
             IntStream.range(0, 9)
@@ -156,7 +151,7 @@ class RabbitMQWorkQueueTest {
 
         ImmediateWorker otherTaskManagerWorker = new ImmediateWorker();
         JsonTaskSerializer otherTaskSerializer = new JsonTaskSerializer(TestTaskDTOModules.TEST_TYPE);
-        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, reactorRabbitMQChannelPool, otherTaskSerializer)) {
+        try (RabbitMQWorkQueue otherWorkQueue = new RabbitMQWorkQueue(otherTaskManagerWorker, rabbitMQExtension.getRabbitChannelPool(), otherTaskSerializer)) {
             //wait to be sur that the first workqueue has subscribed as an exclusive consumer of the RabbitMQ queue.
             Thread.sleep(200);
             otherWorkQueue.start();


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