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 2020/05/20 11:00:26 UTC

[james-project] branch master updated (c26bcfa -> c67b0c3)

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 c26bcfa  JAMES-3091: Add Serializer guice binding for jmap-rfc8621
     new 38bd8e9  JAMES-3140 Avoid a module override for CassandraBlobStore
     new 1be5a93  JAMES-3140 Choosing blob store should be done via configured modules
     new 63f4c6a  JAMES-3140 Generify configuration
     new adc264c  JAMES-3140 JamesServer main should take a GuiceJamesServer as parameter
     new 0e94bc7  JAMES-3140 Configuration for distributed James
     new 763396f  JAMES-3140 CassandraRabbitMQJamesServerMain should not expose its module
     new 0d5de68  JAMES-3140 CassandraRabbitMQLdapJamesServerMain should not expose its module
     new 2254b26  JAMES-3140 Fix JamesDirectoriesProvider JavaDoc
     new 0d9953d  JAMES-3140 Strong typing for ConfigurationPath
     new 41d0a69  Revert "[REFACTORING] MDN parboiled parser can be a constant"
     new c67b0c3  JAMES-3184 Correct Recompute Previews Tasks documentation

The 11 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:
 .../java/org/apache/james/mdn/MDNReportParser.java |   6 +-
 .../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java |  26 ++-
 .../mpt/smtp/CassandraSmtpTestRuleFactory.java     |   2 +
 .../server/core/configuration/Configuration.java   | 139 +++++++++-----
 .../configuration/FileConfigurationProvider.java   |   4 +-
 .../core/configuration/BasicConfigurationTest.java | 121 ++++++++++++
 .../filesystem/api/JamesDirectoriesProvider.java   |  18 +-
 .../ObjectStorageBlobStoreModule.java              |  39 ----
 .../ObjectStorageDependenciesModule.java           |   8 +-
 .../swift/ObjectStorageBlobStoreModuleTest.java    |  14 +-
 .../org/apache/james/CassandraJamesServerMain.java |  14 +-
 ...a => CassandraBlobStoreDependenciesModule.java} |   8 +-
 .../modules/mailbox/CassandraBlobStoreModule.java  |  18 --
 .../AuthenticatedCassandraJamesServerTest.java     |   6 +-
 .../java/org/apache/james/CacheSessionTest.java    |   2 +-
 .../org/apache/james/CassandraJamesServerTest.java |   2 +-
 .../apache/james/CassandraJmapJamesServerTest.java |   2 +-
 .../CassandraMailRepositoryIntegrationTest.java    |   2 +-
 .../CassandraMessageIdManagerInjectionTest.java    |   2 +-
 .../org/apache/james/CassandraNodeConfTest.java    |   2 +-
 .../org/apache/james/CassandraWithTikaTest.java    |   2 +-
 .../james/DefaultCassandraJamesServerTest.java     |   2 +-
 .../test/java/org/apache/james/ESReporterTest.java |   2 +-
 .../apache/james/JamesCapabilitiesServerTest.java  |   2 +-
 .../james/JamesServerWithRetryConnectionTest.java  |   2 +-
 ...esWithNonCompatibleElasticSearchServerTest.java |   2 +-
 .../org/apache/james/KeyspaceCreationTest.java     |   8 +-
 .../apache/james/WithCassandraBlobStoreTest.java   |   2 +-
 .../CassandraSchemaVersionStartUpCheckTest.java    |   2 +-
 .../apache/james/CassandraLdapJamesServerMain.java |  10 +-
 .../apache/james/CassandraLdapJamesServerTest.java |   2 +-
 .../james/CassandraLdapJmapJamesServerTest.java    |   2 +-
 .../CassandraRabbitMQJamesConfiguration.java}      |  71 ++++---
 .../james/CassandraRabbitMQJamesServerMain.java    |  24 ++-
 .../modules/blobstore/BlobStoreChoosingModule.java |  49 -----
 ...figuration.java => BlobStoreConfiguration.java} |  51 +++--
 .../modules/blobstore/BlobStoreModulesChooser.java | 114 +++++++++++
 .../james/CassandraRabbitMQAwsS3JmapTestRule.java  |  11 +-
 .../CassandraRabbitMQJamesConfigurationTest.java   | 115 +++++++++++
 .../james/CassandraRabbitMQJamesServerFixture.java |  20 +-
 .../james/CassandraRabbitMQSwiftJmapTestRule.java  |  12 +-
 .../james/RabbitMQJamesServerReprocessingTest.java |   6 +-
 ...RabbitMQJamesServerWithRetryConnectionTest.java |   2 +
 .../org/apache/james/WithCassandraBlobStore.java   |  18 +-
 .../james/modules/AwsS3BlobStoreExtension.java     |   6 +-
 .../james/modules/SwiftBlobStoreExtension.java     |   6 +-
 .../james/modules/TestAwsS3BlobStoreModule.java    |  47 -----
 .../james/modules/TestSwiftBlobStoreModule.java    |  46 -----
 .../blobstore/BlobStoreChoosingModuleTest.java     | 211 ---------------------
 ...onTest.java => BlobStoreConfigurationTest.java} | 108 +++++++++--
 .../blobstore/BlobStoreModulesChooserTest.java     | 105 ++++++++++
 .../CassandraRabbitMQLdapJamesServerMain.java      |  19 +-
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  |  26 ++-
 .../org/apache/james/utils/PropertiesProvider.java |   9 +-
 .../PropertiesProviderFromEnvVariablesTest.java    |   2 +-
 .../apache/james/utils/PropertiesProviderTest.java |   4 +-
 .../java/org/apache/james/GuiceJamesServer.java    |   7 +-
 .../java/org/apache/james/JamesServerMain.java     |  14 +-
 .../apache/james/modules/CommonServicesModule.java |   7 +-
 .../org/apache/james/FakePropertiesProvider.java   |   4 +-
 .../java/org/apache/james/JamesServerBuilder.java  |  50 +++--
 .../james/utils/FailingPropertiesProvider.java     |   3 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |  10 +-
 .../java/org/apache/james/JPAJamesServerTest.java  |   2 +-
 ...WithAuthenticatedDatabaseSqlValidationTest.java |   2 +-
 ...atabaseAuthenticaticationSqlValidationTest.java |   2 +-
 .../apache/james/JamesCapabilitiesServerTest.java  |   2 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |  10 +-
 .../org/apache/james/MemoryJamesServerMain.java    |  13 +-
 .../apache/james/DefaultMemoryJamesServerTest.java |   2 +-
 .../james/GuiceJamesServerStartUpCheckTest.java    |   2 +-
 .../org/apache/james/GuiceJamesServerTest.java     |   2 +-
 .../apache/james/GuiceLifecycleHeathCheckTest.java |   2 +-
 .../LinshareBlobExportMechanismProvidingTest.java  |   2 +-
 .../org/apache/james/MemoryJamesServerTest.java    |   2 +-
 .../apache/james/MemoryJmapJamesServerTest.java    |   2 +-
 .../apache/james/WebAdminRoutesExtensionTest.java  |   2 +-
 .../jmap/cassandra/CassandraImapErrorTest.java     |   2 +-
 .../jmap/cassandra/CassandraSendMDNMethodTest.java |   2 +-
 .../CassandraSpamAssassinContractTest.java         |   2 +-
 .../james/jmap/memory/MemorySendMDNMethodTest.java |   2 +-
 .../memory/MemorySpamAssassinContractTest.java     |   2 +-
 .../rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java   |  27 +--
 .../RabbitMQAwsS3SpamAssassinContractTest.java     |  13 +-
 .../cucumber/awss3/RabbitMQAwsS3Stepdefs.java      |  20 +-
 .../distributed/DistributedEchoMethodTest.java     |  12 +-
 .../jmap/rfc8621/memory/MemoryEchoMethodTest.java  |   2 +-
 .../rabbitmq/ConsistencyTasksIntegrationTest.java  |  14 +-
 .../rabbitmq/FixingGhostMailboxTest.java           |  12 +-
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  |  13 +-
 .../RabbitMQEventDeadLettersIntegrationTest.java   |  12 +-
 ...stViewProjectionHealthCheckIntegrationTest.java |  14 +-
 .../rabbitmq/RabbitMQForwardIntegrationTest.java   |  14 +-
 .../rabbitmq/RabbitMQJmapExtension.java            |  15 +-
 .../rabbitmq/RabbitMQJwtFilterIntegrationTest.java |  14 +-
 ...RabbitMQReindexingWithEventDeadLettersTest.java |  21 +-
 .../RabbitMQWebAdminServerIntegrationTest.java     |  13 +-
 ...dminServerTaskSerializationIntegrationTest.java |  12 +-
 ...RabbitMQDeletedMessageVaultIntegrationTest.java |  13 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |  13 +-
 .../memory/MemoryAuthorizedEndpointsTest.java      |   2 +-
 ...stViewProjectionHealthCheckIntegrationTest.java |   2 +-
 .../memory/MemoryForwardIntegrationTest.java       |   2 +-
 .../memory/MemoryJwtFilterIntegrationTest.java     |   2 +-
 .../memory/MemoryUnauthorizedEndpointsTest.java    |   2 +-
 .../MemoryWebAdminServerIntegrationTest.java       |   2 +-
 .../MemoryDeletedMessageVaultIntegrationTest.java  |   2 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |   2 +-
 src/site/markdown/server/manage-webadmin.md        |  18 +-
 109 files changed, 1186 insertions(+), 809 deletions(-)
 create mode 100644 server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
 delete mode 100644 server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
 copy server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/{CassandraBlobStoreModule.java => CassandraBlobStoreDependenciesModule.java} (88%)
 copy server/container/{core/src/main/java/org/apache/james/server/core/configuration/Configuration.java => guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java} (51%)
 rename server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/{BlobStoreChoosingConfiguration.java => BlobStoreConfiguration.java} (63%)
 create mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
 create mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
 delete mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
 delete mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
 delete mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
 rename server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/{BlobStoreChoosingConfigurationTest.java => BlobStoreConfigurationTest.java} (52%)
 create mode 100644 server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java


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


[james-project] 09/11: JAMES-3140 Strong typing for ConfigurationPath

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 0d9953da9171e3b76db81d1e88c3985b0e888fb1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 19 11:07:30 2020 +0700

    JAMES-3140 Strong typing for ConfigurationPath
---
 .../server/core/configuration/Configuration.java   | 58 ++++++++++++++++++----
 .../configuration/FileConfigurationProvider.java   |  4 +-
 .../core/configuration/BasicConfigurationTest.java | 18 +++++--
 .../james/CassandraRabbitMQJamesConfiguration.java | 15 +++---
 .../CassandraRabbitMQJamesConfigurationTest.java   |  9 ++--
 .../org/apache/james/utils/PropertiesProvider.java |  7 +--
 .../apache/james/modules/CommonServicesModule.java |  7 +--
 7 files changed, 81 insertions(+), 37 deletions(-)

diff --git a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
index 050d210..58baecb 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
@@ -20,6 +20,7 @@
 package org.apache.james.server.core.configuration;
 
 import java.io.File;
+import java.util.Objects;
 import java.util.Optional;
 
 import org.apache.james.filesystem.api.FileSystem;
@@ -27,18 +28,50 @@ import org.apache.james.filesystem.api.JamesDirectoriesProvider;
 import org.apache.james.server.core.JamesServerResourceLoader;
 import org.apache.james.server.core.MissingArgumentException;
 
+import com.google.common.base.MoreObjects;
+
 public interface Configuration {
 
     String WORKING_DIRECTORY = "working.directory";
 
-    static Basic.Builder builder() {
-        return new Basic.Builder();
+    class ConfigurationPath {
+        private final String value;
+
+        public ConfigurationPath(String value) {
+            this.value = value;
+        }
+
+        public String asString() {
+            return value;
+        }
+
+        @Override
+        public final boolean equals(Object o) {
+            if (o instanceof ConfigurationPath) {
+                ConfigurationPath that = (ConfigurationPath) o;
+
+                return Objects.equals(this.value, that.value);
+            }
+            return false;
+        }
+
+        @Override
+        public final int hashCode() {
+            return Objects.hash(value);
+        }
+
+        @Override
+        public String toString() {
+            return MoreObjects.toStringHelper(this)
+                .add("value", value)
+                .toString();
+        }
     }
 
     class Basic implements Configuration {
         public static class Builder {
             private Optional<String> rootDirectory;
-            private Optional<String> configurationPath;
+            private Optional<ConfigurationPath> configurationPath;
 
             private Builder() {
                 rootDirectory = Optional.empty();
@@ -63,19 +96,18 @@ public interface Configuration {
                 return this;
             }
 
-            public Builder configurationPath(String path) {
+            public Builder configurationPath(ConfigurationPath path) {
                 configurationPath = Optional.of(path);
                 return this;
             }
 
             public Builder configurationFromClasspath() {
-                configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+                configurationPath = Optional.of(new ConfigurationPath(FileSystem.CLASSPATH_PROTOCOL));
                 return this;
             }
 
             public Configuration.Basic build() {
-
-                String configurationPath = this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+                ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
                 JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
                     .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
@@ -85,16 +117,16 @@ public interface Configuration {
             }
         }
 
-        private final String configurationPath;
+        private final ConfigurationPath configurationPath;
         private final JamesDirectoriesProvider directories;
 
-        public Basic(String configurationPath, JamesDirectoriesProvider directories) {
+        public Basic(ConfigurationPath configurationPath, JamesDirectoriesProvider directories) {
             this.configurationPath = configurationPath;
             this.directories = directories;
         }
 
         @Override
-        public String configurationPath() {
+        public ConfigurationPath configurationPath() {
             return configurationPath;
         }
 
@@ -104,7 +136,11 @@ public interface Configuration {
         }
     }
 
-    String configurationPath();
+    static Basic.Builder builder() {
+        return new Basic.Builder();
+    }
+
+    ConfigurationPath configurationPath();
 
     JamesDirectoriesProvider directories();
 }
diff --git a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
index 97036b2..48b965b 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
@@ -62,7 +62,7 @@ public class FileConfigurationProvider implements ConfigurationProvider {
     }
     
     private final FileSystem fileSystem;
-    private final String configurationPrefix;
+    private final Configuration.ConfigurationPath configurationPrefix;
 
     public FileConfigurationProvider(FileSystem fileSystem, Configuration configuration) {
         this.fileSystem = fileSystem;
@@ -91,7 +91,7 @@ public class FileConfigurationProvider implements ConfigurationProvider {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(configurationFileWithoutExtension), "The configuration file name should not be empty or null");
         try {
             return Optional.of(
-                fileSystem.getResource(configurationPrefix + configurationFileWithoutExtension + CONFIGURATION_FILE_SUFFIX));
+                fileSystem.getResource(configurationPrefix.asString() + configurationFileWithoutExtension + CONFIGURATION_FILE_SUFFIX));
         } catch (IOException e) {
             loggingLevelOnError.format(LOGGER, "Unable to locate configuration file {}" + CONFIGURATION_FILE_SUFFIX + ", assuming empty configuration", configurationFileWithoutExtension);
             return Optional.empty();
diff --git a/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
index d1c1105..e7ac0d0 100644
--- a/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
+++ b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
@@ -26,9 +26,17 @@ import org.apache.james.server.core.MissingArgumentException;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
+import nl.jqno.equalsverifier.EqualsVerifier;
+
 class BasicConfigurationTest {
     @Test
-    void buildShouldThrowWhenWorkingDirectoryMissing() {
+    void configurationPathShouldMatchBeanContract() {
+        EqualsVerifier.forClass(Configuration.ConfigurationPath.class)
+            .verify();
+    }
+
+    @Test
+    void buildShouldThrowWhenWorkingDirectoryIsMissing() {
         assertThatThrownBy(() -> Configuration.builder().build())
             .isInstanceOf(MissingArgumentException.class)
             .hasMessage("Server needs a working.directory env entry");
@@ -47,12 +55,12 @@ class BasicConfigurationTest {
     void buildShouldReturnConfigurationWithSuppliedValues() {
         Configuration.Basic configuration = Configuration.builder()
             .workingDirectory("/path")
-            .configurationPath("file://myconf/")
+            .configurationPath(new Configuration.ConfigurationPath("file://myconf/"))
             .build();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://myconf/");
         });
     }
 
@@ -65,7 +73,7 @@ class BasicConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("classpath:");
         });
     }
 
@@ -77,7 +85,7 @@ class BasicConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://conf/");
         });
     }
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index afef000..50c3f59 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -37,11 +37,12 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
     public static class Builder {
         private Optional<BlobStoreConfiguration> blobStoreConfiguration;
         private Optional<String> rootDirectory;
-        private Optional<String> configurationPath;
+        private Optional<ConfigurationPath> configurationPath;
 
         private Builder() {
             rootDirectory = Optional.empty();
             configurationPath = Optional.empty();
+            blobStoreConfiguration = Optional.empty();
         }
 
         public Builder workingDirectory(String path) {
@@ -62,13 +63,13 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
             return this;
         }
 
-        public Builder configurationPath(String path) {
+        public Builder configurationPath(ConfigurationPath path) {
             configurationPath = Optional.of(path);
             return this;
         }
 
         public Builder configurationFromClasspath() {
-            configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+            configurationPath = Optional.of(new ConfigurationPath(FileSystem.CLASSPATH_PROTOCOL));
             return this;
         }
 
@@ -78,7 +79,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
         }
 
         public CassandraRabbitMQJamesConfiguration build() {
-            String configurationPath = this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+            ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
             JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
                 .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
@@ -95,18 +96,18 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
         return new Builder();
     }
 
-    private final String configurationPath;
+    private final ConfigurationPath configurationPath;
     private final JamesDirectoriesProvider directories;
     private final BlobStoreConfiguration blobStoreConfiguration;
 
-    public CassandraRabbitMQJamesConfiguration(String configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration) {
+    public CassandraRabbitMQJamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration) {
         this.configurationPath = configurationPath;
         this.directories = directories;
         this.blobStoreConfiguration = blobStoreConfiguration;
     }
 
     @Override
-    public String configurationPath() {
+    public ConfigurationPath configurationPath() {
         return configurationPath;
     }
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
index ab06912..0eb5004 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.james.server.core.MissingArgumentException;
 import org.apache.james.server.core.configuration.Configuration;
+import org.apache.james.server.core.configuration.Configuration.ConfigurationPath;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.Test;
 
@@ -48,12 +49,12 @@ class CassandraRabbitMQJamesConfigurationTest {
     void buildShouldReturnConfigurationWithSuppliedValues() {
         Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
             .workingDirectory("/path")
-            .configurationPath("file://myconf/")
+            .configurationPath(new ConfigurationPath("file://myconf/"))
             .build();
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://myconf/");
         });
     }
 
@@ -66,7 +67,7 @@ class CassandraRabbitMQJamesConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("classpath:");
         });
     }
 
@@ -78,7 +79,7 @@ class CassandraRabbitMQJamesConfigurationTest {
 
         SoftAssertions.assertSoftly(softly -> {
             softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
-            softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+            softly.assertThat(configuration.configurationPath().asString()).isEqualTo("file://conf/");
         });
     }
 
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
index 1091c55..cefa9d4 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
@@ -34,6 +34,7 @@ import org.apache.commons.configuration2.builder.fluent.Parameters;
 import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.server.core.configuration.Configuration.ConfigurationPath;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -45,10 +46,10 @@ public class PropertiesProvider {
     private static final String COMMA_STRING = ",";
 
     private final FileSystem fileSystem;
-    private final String configurationPrefix;
+    private final ConfigurationPath configurationPrefix;
 
     @Inject
-    public PropertiesProvider(FileSystem fileSystem, String configurationPrefix) {
+    public PropertiesProvider(FileSystem fileSystem, ConfigurationPath configurationPrefix) {
         this.fileSystem = fileSystem;
         this.configurationPrefix = configurationPrefix;
     }
@@ -84,7 +85,7 @@ public class PropertiesProvider {
 
     private Optional<File> getConfigurationFile(String fileName) {
         try {
-            return Optional.of(fileSystem.getFile(configurationPrefix + fileName + ".properties"))
+            return Optional.of(fileSystem.getFile(configurationPrefix.asString() + fileName + ".properties"))
                 .filter(File::exists);
         } catch (FileNotFoundException e) {
             return Optional.empty();
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
index 2ad721c..f9cc271 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/modules/CommonServicesModule.java
@@ -19,7 +19,6 @@
 
 package org.apache.james.modules;
 
-import javax.inject.Named;
 import javax.inject.Singleton;
 
 import org.apache.james.filesystem.api.FileSystem;
@@ -40,8 +39,7 @@ import com.google.inject.Provides;
 import com.google.inject.multibindings.Multibinder;
 
 public class CommonServicesModule extends AbstractModule {
-    
-    public static final String CONFIGURATION_PATH = "configurationPath";
+
     private final Configuration configuration;
     private final FileSystemImpl fileSystem;
 
@@ -74,8 +72,7 @@ public class CommonServicesModule extends AbstractModule {
 
     @Provides
     @Singleton
-    @Named(CONFIGURATION_PATH)
-    public String configurationPath() {
+    public Configuration.ConfigurationPath configurationPath() {
         return configuration.configurationPath();
     }
 


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


[james-project] 11/11: JAMES-3184 Correct Recompute Previews Tasks documentation

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 c67b0c38be76e310c57d8f88fe133dfffa2915f0
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 20 13:59:31 2020 +0700

    JAMES-3184 Correct Recompute Previews Tasks documentation
---
 src/site/markdown/server/manage-webadmin.md | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md
index 3cfd77e..5e6435e 100644
--- a/src/site/markdown/server/manage-webadmin.md
+++ b/src/site/markdown/server/manage-webadmin.md
@@ -522,17 +522,17 @@ Will schedule a task for recomputing the fast message view projection for all ma
 
 An admin can specify the concurrency that should be used when running the task:
 
- - `messageRatePerSecond` rate at which messages should be processed, per second. Defaults to 10.
+ - `messagesPerSecond` rate at which messages should be processed, per second. Defaults to 10.
  
 This optional parameter must have a strictly positive integer as a value and be passed as query parameters.
 
 Example:
 
 ```
-curl -XPOST /mailboxes?task=recomputeFastViewProjectionItems&messageRatePerSecond=20
+curl -XPOST /mailboxes?task=recomputeFastViewProjectionItems&messagesPerSecond=20
 ```
 
-The scheduled task will have the following type `RecomputeAllPreviewsTask` and the following `additionalInformation`:
+The scheduled task will have the following type `RecomputeAllFastViewProjectionItemsTask` and the following `additionalInformation`:
 
 ```
 {
@@ -542,7 +542,7 @@ The scheduled task will have the following type `RecomputeAllPreviewsTask` and t
   "failedUserCount": 2,
   "failedMessageCount": 1,
   "runningOptions": {
-    "messageRatePerSecond":20
+    "messagesPerSecond":20
   }
 }
 ```
@@ -971,26 +971,26 @@ Will schedule a task for recomputing the fast message view projection for all ma
 
 An admin can specify the concurrency that should be used when running the task:
 
- - `messageRatePerSecond` rate at which messages should be processed, per second. Defaults to 10.
+ - `messagesPerSecond` rate at which messages should be processed, per second. Defaults to 10.
  
 This optional parameter must have a strictly positive integer as a value and be passed as query parameters.
 
 Example:
 
 ```
-curl -XPOST /mailboxes?task=recomputeFastViewProjectionItems&messageRatePerSecond=20
+curl -XPOST /mailboxes?task=recomputeFastViewProjectionItems&messagesPerSecond=20
 ```
 
-The scheduled task will have the following type `RecomputeAllPreviewsTask` and the following `additionalInformation`:
+The scheduled task will have the following type `RecomputeUserFastViewProjectionItemsTask` and the following `additionalInformation`:
 
 ```
 {
-  "type":"RecomputeAllPreviewsTask",
+  "type":"RecomputeUserFastViewProjectionItemsTask",
   "username": "{usernameToBeUsed}",
   "processedMessageCount": 3,
   "failedMessageCount": 1,
   "runningOptions": {
-    "messageRatePerSecond":20
+    "messagesPerSecond":20
   }
 }
 ```


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


[james-project] 08/11: JAMES-3140 Fix JamesDirectoriesProvider JavaDoc

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 2254b26638e453d712d3289f7c5b28dc9152317e
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue May 19 10:41:33 2020 +0700

    JAMES-3140 Fix JamesDirectoriesProvider JavaDoc
---
 .../james/filesystem/api/JamesDirectoriesProvider.java | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/JamesDirectoriesProvider.java b/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/JamesDirectoriesProvider.java
index d40aed8..ff1d589 100644
--- a/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/JamesDirectoriesProvider.java
+++ b/server/container/filesystem-api/src/main/java/org/apache/james/filesystem/api/JamesDirectoriesProvider.java
@@ -21,23 +21,23 @@ package org.apache.james.filesystem.api;
 public interface JamesDirectoriesProvider {
 
     /**
-     * Return the configuration directory of the application
-     * 
-     * @return confDir
+     * Return the absolute directory of the application
+     *
+     * @return absolute
      */
     String getAbsoluteDirectory();
 
     /**
-     * Return the var directory of the application
-     * 
-     * @return var
+     * Return the configuration directory of the application
+     *
+     * @return confDir
      */
     String getConfDirectory();
 
     /**
-     * Return the absolute directory of the application
-     * 
-     * @return absolute
+     * Return the var directory of the application
+     *
+     * @return var
      */
     String getVarDirectory();
 


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


[james-project] 03/11: JAMES-3140 Generify configuration

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 63f4c6a8635a529bd4bfd967c4dccd880ccb94af
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 14 17:34:35 2020 +0700

    JAMES-3140 Generify configuration
    
    We will be to add per-products fields to it.
    
    This will enable passing per-product configuration modules option as part of it.
---
 .../server/core/configuration/Configuration.java   | 111 ++++++++++----------
 .../core/configuration/BasicConfigurationTest.java | 113 +++++++++++++++++++++
 .../jmap/rfc8621/memory/MemoryEchoMethodTest.java  |   2 +-
 3 files changed, 174 insertions(+), 52 deletions(-)

diff --git a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
index 233913c..050d210 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/configuration/Configuration.java
@@ -27,75 +27,84 @@ import org.apache.james.filesystem.api.JamesDirectoriesProvider;
 import org.apache.james.server.core.JamesServerResourceLoader;
 import org.apache.james.server.core.MissingArgumentException;
 
-public class Configuration {
+public interface Configuration {
 
-    public static final String WORKING_DIRECTORY = "working.directory";
+    String WORKING_DIRECTORY = "working.directory";
 
-    public static Builder builder() {
-        return new Builder();
+    static Basic.Builder builder() {
+        return new Basic.Builder();
     }
 
-    public static class Builder {
+    class Basic implements Configuration {
+        public static class Builder {
+            private Optional<String> rootDirectory;
+            private Optional<String> configurationPath;
 
-        private Optional<String> rootDirectory;
-        private Optional<String> configurationPath;
+            private Builder() {
+                rootDirectory = Optional.empty();
+                configurationPath = Optional.empty();
+            }
 
-        private Builder() {
-            rootDirectory = Optional.empty();
-            configurationPath = Optional.empty();
-        }
+            public Builder workingDirectory(String path) {
+                rootDirectory = Optional.of(path);
+                return this;
+            }
 
-        public Builder workingDirectory(String path) {
-            rootDirectory = Optional.of(path);
-            return this;
-        }
+            public Builder workingDirectory(File file) {
+                rootDirectory = Optional.of(file.getAbsolutePath());
+                return this;
+            }
 
-        public Builder workingDirectory(File file) {
-            rootDirectory = Optional.of(file.getAbsolutePath());
-            return this;
-        }
+            public Builder useWorkingDirectoryEnvProperty() {
+                rootDirectory = Optional.ofNullable(System.getProperty(WORKING_DIRECTORY));
+                if (!rootDirectory.isPresent()) {
+                    throw new MissingArgumentException("Server needs a working.directory env entry");
+                }
+                return this;
+            }
 
-        public Builder useWorkingDirectoryEnvProperty() {
-            rootDirectory = Optional
-                .ofNullable(System.getProperty(WORKING_DIRECTORY));
-            if (!rootDirectory.isPresent()) {
-                throw new MissingArgumentException("Server needs a working.directory env entry");
+            public Builder configurationPath(String path) {
+                configurationPath = Optional.of(path);
+                return this;
             }
-            return this;
-        }
 
-        public Builder configurationPath(String path) {
-            configurationPath = Optional.of(path);
-            return this;
-        }
+            public Builder configurationFromClasspath() {
+                configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+                return this;
+            }
 
-        public Builder configurationFromClasspath() {
-            configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
-            return this;
-        }
+            public Configuration.Basic build() {
+
+                String configurationPath = this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+                JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
+                    .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
 
-        public Configuration build() {
-            return new Configuration(
-                rootDirectory
-                    .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")),
-                configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF));
+                return new Basic(
+                    configurationPath,
+                    directories);
+            }
         }
-    }
 
-    private final String configurationPath;
-    private final JamesDirectoriesProvider directoriesProvider;
+        private final String configurationPath;
+        private final JamesDirectoriesProvider directories;
 
-    private Configuration(String rootDirectory, String configurationPath) {
-        this.configurationPath = configurationPath;
-        this.directoriesProvider = new JamesServerResourceLoader(rootDirectory);
-    }
+        public Basic(String configurationPath, JamesDirectoriesProvider directories) {
+            this.configurationPath = configurationPath;
+            this.directories = directories;
+        }
 
-    public String configurationPath() {
-        return configurationPath;
-    }
+        @Override
+        public String configurationPath() {
+            return configurationPath;
+        }
 
-    public JamesDirectoriesProvider directories() {
-        return directoriesProvider;
+        @Override
+        public JamesDirectoriesProvider directories() {
+            return directories;
+        }
     }
 
+    String configurationPath();
+
+    JamesDirectoriesProvider directories();
 }
diff --git a/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
new file mode 100644
index 0000000..d1c1105
--- /dev/null
+++ b/server/container/core/src/test/java/org/apache/james/server/core/configuration/BasicConfigurationTest.java
@@ -0,0 +1,113 @@
+/****************************************************************
+ * 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.server.core.configuration;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.james.server.core.MissingArgumentException;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+
+class BasicConfigurationTest {
+    @Test
+    void buildShouldThrowWhenWorkingDirectoryMissing() {
+        assertThatThrownBy(() -> Configuration.builder().build())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void useWorkingDirectoryEnvPropertyShouldThrowWhenEnvVariableIsUnspecified() {
+        assertThatThrownBy(() ->
+            Configuration.builder()
+                .useWorkingDirectoryEnvProperty())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void buildShouldReturnConfigurationWithSuppliedValues() {
+        Configuration.Basic configuration = Configuration.builder()
+            .workingDirectory("/path")
+            .configurationPath("file://myconf/")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+        });
+    }
+
+    @Test
+    void buildShouldReturnConfigurationWithClassPathConfigurationPathWhenSpecified() {
+        Configuration.Basic configuration = Configuration.builder()
+            .workingDirectory("/path")
+            .configurationFromClasspath()
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+        });
+    }
+
+    @Test
+    void configurationPathShouldDefaultToFileConf() {
+        Configuration.Basic configuration = Configuration.builder()
+            .workingDirectory("/path")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+        });
+    }
+
+    @Test
+    void useWorkingDirectoryEnvPropertyShouldReadSystemProperty() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration.Basic configuration = Configuration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+
+    @Test
+    void getConfDirectoryShouldReturnConfFolderOfRootDir() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration.Basic configuration = Configuration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            assertThat(configuration.directories().getConfDirectory()).isEqualTo("/path/conf/");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+}
\ No newline at end of file
diff --git a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java
index f7aa3c7..7f21ab1 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/memory-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/memory/MemoryEchoMethodTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class MemoryEchoMethodTest implements EchoMethodContract {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule()))


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


[james-project] 04/11: JAMES-3140 JamesServer main should take a GuiceJamesServer as parameter

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 adc264c1dfc5049bda00971d84706c06a798af5f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 14 17:39:52 2020 +0700

    JAMES-3140 JamesServer main should take a GuiceJamesServer as parameter
---
 .../src/main/java/org/apache/james/CassandraJamesServerMain.java  | 5 ++++-
 .../main/java/org/apache/james/CassandraLdapJamesServerMain.java  | 5 ++++-
 .../java/org/apache/james/CassandraRabbitMQJamesServerMain.java   | 6 ++++--
 .../org/apache/james/CassandraRabbitMQLdapJamesServerMain.java    | 6 ++++--
 .../src/main/java/org/apache/james/JamesServerMain.java           | 8 +-------
 .../src/main/java/org/apache/james/JPAJamesServerMain.java        | 5 ++++-
 .../src/main/java/org/apache/james/JPAJamesServerMain.java        | 5 ++++-
 .../src/main/java/org/apache/james/MemoryJamesServerMain.java     | 7 +++++--
 8 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index a28abc2..f4370d3 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -167,7 +167,10 @@ public class CassandraJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        JamesServerMain.main(configuration, ALL_BUT_JMX_CASSANDRA_MODULE, new JMXServerModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE, new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
 }
diff --git a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
index 345c725..9dbfd9a 100644
--- a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
+++ b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
@@ -38,7 +38,10 @@ public class CassandraLdapJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        JamesServerMain.main(configuration, MODULES, new JMXServerModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(MODULES, new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index d78ebaa..da6b40b 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -49,8 +49,10 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
 
         Module baseModule = modules(blobStoreConfiguration);
 
-        JamesServerMain.main(configuration,
-            baseModule, new JMXServerModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(baseModule, new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
     public static Module modules(BlobStoreConfiguration blobStoreConfiguration) {
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
index 212d639..d667c64 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
@@ -42,8 +42,10 @@ public class CassandraRabbitMQLdapJamesServerMain implements JamesServerMain {
         BlobStoreConfiguration blobStoreConfiguration = BlobStoreConfiguration.parse(configuration);
 
         Module baseModule = baseModule(blobStoreConfiguration);
-        JamesServerMain.main(configuration,
-            baseModule, new JMXServerModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(baseModule, new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
     public static Module baseModule(BlobStoreConfiguration blobStoreConfiguration) {
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
index c9d3ffb..534354e 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
@@ -19,14 +19,8 @@
 
 package org.apache.james;
 
-import org.apache.james.server.core.configuration.Configuration;
-
-import com.google.inject.Module;
-
 public interface JamesServerMain {
-    static void main(Configuration configuration, Module... modules) throws Exception {
-        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(modules);
+    static void main(GuiceJamesServer server) throws Exception {
         server.start();
 
         Runtime.getRuntime().addShutdownHook(new Thread(server::stop));
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
index f497a41..2560e88 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -99,7 +99,10 @@ public class JPAJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        JamesServerMain.main(configuration, JPA_MODULE_AGGREGATE, new JMXServerModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(JPA_MODULE_AGGREGATE, new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
 }
diff --git a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
index ea629b2..e44b5ea 100644
--- a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -64,7 +64,10 @@ public class JPAJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        JamesServerMain.main(configuration, JPA_SERVER_MODULE,  PROTOCOLS, new DKIMMailetModule());
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(JPA_SERVER_MODULE,  PROTOCOLS, new DKIMMailetModule());
+
+        JamesServerMain.main(server);
     }
 
 }
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
index 05c6649..aca4c6e 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
@@ -138,10 +138,13 @@ public class MemoryJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        JamesServerMain.main(configuration,
-                IN_MEMORY_SERVER_AGGREGATE_MODULE,
+
+        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(IN_MEMORY_SERVER_AGGREGATE_MODULE,
                 new FakeSearchMailboxModule(),
                 new JMXServerModule());
+
+        JamesServerMain.main(server);
     }
 
 }


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


[james-project] 10/11: Revert "[REFACTORING] MDN parboiled parser can be a constant"

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 41d0a69ca53a60986b0d1bfcbfe885d8fffcb0fb
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 20 08:54:31 2020 +0700

    Revert "[REFACTORING] MDN parboiled parser can be a constant"
    
    This reverts commit d429f252df223ad6008cef3969a0ccd7c61bf857.
---
 mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java b/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
index 3c2e8a6..a1dc416 100644
--- a/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
+++ b/mdn/src/main/java/org/apache/james/mdn/MDNReportParser.java
@@ -46,8 +46,6 @@ import org.parboiled.support.ParsingResult;
 import com.google.common.annotations.VisibleForTesting;
 
 public class MDNReportParser {
-    private static final Parser PARSER = Parboiled.createParser(Parser.class);
-
     public MDNReportParser() {
     }
 
@@ -56,8 +54,8 @@ public class MDNReportParser {
     }
 
     public Optional<MDNReport> parse(String mdnReport) {
-        ParsingResult<Object> result = new ReportingParseRunner<>(PARSER.dispositionNotificationContent())
-            .run(mdnReport);
+        Parser parser = Parboiled.createParser(MDNReportParser.Parser.class);
+        ParsingResult<Object> result = new ReportingParseRunner<>(parser.dispositionNotificationContent()).run(mdnReport);
         if (result.matched) {
             return Optional.of((MDNReport)result.resultValue);
         }


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


[james-project] 05/11: JAMES-3140 Configuration for distributed James

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 0e94bc7e4c381e1bdd0ec9a20b3f5a9bd9938c86
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 14 17:46:52 2020 +0700

    JAMES-3140 Configuration for distributed James
---
 .../james/CassandraRabbitMQJamesConfiguration.java | 121 +++++++++++++++++++++
 .../james/CassandraRabbitMQJamesServerMain.java    |   5 +-
 .../modules/blobstore/BlobStoreConfiguration.java  |   3 +-
 .../CassandraRabbitMQJamesConfigurationTest.java   | 114 +++++++++++++++++++
 .../org/apache/james/utils/PropertiesProvider.java |   4 +-
 .../PropertiesProviderFromEnvVariablesTest.java    |   2 +-
 .../apache/james/utils/PropertiesProviderTest.java |   4 +-
 .../org/apache/james/FakePropertiesProvider.java   |   4 +-
 .../james/utils/FailingPropertiesProvider.java     |   3 +-
 9 files changed, 247 insertions(+), 13 deletions(-)

diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
new file mode 100644
index 0000000..55f9e6b
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -0,0 +1,121 @@
+/****************************************************************
+ * 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;
+
+import java.io.File;
+import java.util.Optional;
+
+import org.apache.james.filesystem.api.FileSystem;
+import org.apache.james.filesystem.api.JamesDirectoriesProvider;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.server.core.JamesServerResourceLoader;
+import org.apache.james.server.core.MissingArgumentException;
+import org.apache.james.server.core.configuration.Configuration;
+import org.apache.james.server.core.filesystem.FileSystemImpl;
+import org.apache.james.utils.PropertiesProvider;
+
+import com.github.fge.lambdas.Throwing;
+
+public class CassandraRabbitMQJamesConfiguration implements Configuration {
+    public static class Builder {
+        private Optional<BlobStoreConfiguration> blobStoreConfiguration;
+        private Optional<String> rootDirectory;
+        private Optional<String> configurationPath;
+
+        private Builder() {
+            rootDirectory = Optional.empty();
+            configurationPath = Optional.empty();
+        }
+
+        public Builder workingDirectory(String path) {
+            rootDirectory = Optional.of(path);
+            return this;
+        }
+
+        public Builder workingDirectory(File file) {
+            rootDirectory = Optional.of(file.getAbsolutePath());
+            return this;
+        }
+
+        public Builder useWorkingDirectoryEnvProperty() {
+            rootDirectory = Optional.ofNullable(System.getProperty(WORKING_DIRECTORY));
+            if (!rootDirectory.isPresent()) {
+                throw new MissingArgumentException("Server needs a working.directory env entry");
+            }
+            return this;
+        }
+
+        public Builder configurationPath(String path) {
+            configurationPath = Optional.of(path);
+            return this;
+        }
+
+        public Builder configurationFromClasspath() {
+            configurationPath = Optional.of(FileSystem.CLASSPATH_PROTOCOL);
+            return this;
+        }
+
+        public Builder blobStore(BlobStoreConfiguration blobStoreConfiguration) {
+            this.blobStoreConfiguration = Optional.of(blobStoreConfiguration);
+            return this;
+        }
+
+        public CassandraRabbitMQJamesConfiguration build() {
+            String configurationPath = this.configurationPath.orElse(FileSystem.FILE_PROTOCOL_AND_CONF);
+            JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
+                .orElseThrow(() -> new MissingArgumentException("Server needs a working.directory env entry")));
+
+            return new CassandraRabbitMQJamesConfiguration(
+                configurationPath,
+                directories,
+                blobStoreConfiguration.orElseGet(Throwing.supplier(
+                    () -> BlobStoreConfiguration.parse(
+                        new PropertiesProvider(new FileSystemImpl(directories), configurationPath)))));
+        }
+    }
+
+    static CassandraRabbitMQJamesConfiguration.Builder builder() {
+        return new Builder();
+    }
+
+    private final String configurationPath;
+    private final JamesDirectoriesProvider directories;
+    private final BlobStoreConfiguration blobStoreConfiguration;
+
+    public CassandraRabbitMQJamesConfiguration(String configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration) {
+        this.configurationPath = configurationPath;
+        this.directories = directories;
+        this.blobStoreConfiguration = blobStoreConfiguration;
+    }
+
+    @Override
+    public String configurationPath() {
+        return configurationPath;
+    }
+
+    @Override
+    public JamesDirectoriesProvider directories() {
+        return directories;
+    }
+
+    public BlobStoreConfiguration blobstoreconfiguration() {
+        return blobStoreConfiguration;
+    }
+}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index da6b40b..318f54b 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -28,7 +28,6 @@ import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
 import org.apache.james.modules.server.JMXServerModule;
-import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
@@ -41,11 +40,11 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
             .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new TaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
-        Configuration configuration = Configuration.builder()
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        BlobStoreConfiguration blobStoreConfiguration = BlobStoreConfiguration.parse(configuration);
+        BlobStoreConfiguration blobStoreConfiguration = configuration.blobstoreconfiguration();
 
         Module baseModule = modules(blobStoreConfiguration);
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
index c7f2325..bc210f6 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
@@ -72,7 +72,8 @@ public class BlobStoreConfiguration {
     static final String BLOBSTORE_IMPLEMENTATION_PROPERTY = "implementation";
 
     public static BlobStoreConfiguration parse(org.apache.james.server.core.configuration.Configuration configuration) throws ConfigurationException {
-        PropertiesProvider propertiesProvider = new PropertiesProvider(new FileSystemImpl(configuration.directories()), configuration);
+        PropertiesProvider propertiesProvider = new PropertiesProvider(new FileSystemImpl(configuration.directories()),
+            configuration.configurationPath());
 
         return parse(propertiesProvider);
     }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
new file mode 100644
index 0000000..ab06912
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesConfigurationTest.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.james.server.core.MissingArgumentException;
+import org.apache.james.server.core.configuration.Configuration;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+
+class CassandraRabbitMQJamesConfigurationTest {
+    @Test
+    void buildShouldThrowWhenWorkingDirectoryMissing() {
+        assertThatThrownBy(() -> CassandraRabbitMQJamesConfiguration.builder().build())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void useWorkingDirectoryEnvPropertyShouldThrowWhenEnvVariableIsUnspecified() {
+        assertThatThrownBy(() ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty())
+            .isInstanceOf(MissingArgumentException.class)
+            .hasMessage("Server needs a working.directory env entry");
+    }
+
+    @Test
+    void buildShouldReturnConfigurationWithSuppliedValues() {
+        Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .configurationPath("file://myconf/")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("file://myconf/");
+        });
+    }
+
+    @Test
+    void buildShouldReturnConfigurationWithClassPathConfigurationPathWhenSpecified() {
+        Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .configurationFromClasspath()
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("classpath:");
+        });
+    }
+
+    @Test
+    void configurationPathShouldDefaultToFileConf() {
+        Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory("/path")
+            .build();
+
+        SoftAssertions.assertSoftly(softly -> {
+            softly.assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+            softly.assertThat(configuration.configurationPath()).isEqualTo("file://conf/");
+        });
+    }
+
+    @Test
+    void useWorkingDirectoryEnvPropertyShouldReadSystemProperty() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            assertThat(configuration.directories().getRootDirectory()).isEqualTo("/path");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+
+    @Test
+    void getConfDirectoryShouldReturnConfFolderOfRootDir() {
+        try {
+            System.setProperty("working.directory", "/path");
+
+            Configuration configuration = CassandraRabbitMQJamesConfiguration.builder()
+                .useWorkingDirectoryEnvProperty()
+                .build();
+
+            assertThat(configuration.directories().getConfDirectory()).isEqualTo("/path/conf/");
+        } finally {
+            System.clearProperty("working.directory");
+        }
+    }
+}
\ No newline at end of file
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
index cff883a..1091c55 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
@@ -48,9 +48,9 @@ public class PropertiesProvider {
     private final String configurationPrefix;
 
     @Inject
-    public PropertiesProvider(FileSystem fileSystem, org.apache.james.server.core.configuration.Configuration configuration) {
+    public PropertiesProvider(FileSystem fileSystem, String configurationPrefix) {
         this.fileSystem = fileSystem;
-        this.configurationPrefix = configuration.configurationPath();
+        this.configurationPrefix = configurationPrefix;
     }
 
     public Configuration getConfigurations(String... filenames) throws FileNotFoundException, ConfigurationException {
diff --git a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
index 3aab2bc..3b608d2 100644
--- a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
+++ b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderFromEnvVariablesTest.java
@@ -42,7 +42,7 @@ public class PropertiesProviderFromEnvVariablesTest {
             .configurationFromClasspath()
             .build();
         FileSystemImpl fileSystem = new FileSystemImpl(configuration.directories());
-        testee = new PropertiesProvider(fileSystem, configuration);
+        testee = new PropertiesProvider(fileSystem, configuration.configurationPath());
     }
 
     @Test
diff --git a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
index ab78db3..fcf96c7 100644
--- a/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
+++ b/server/container/guice/configuration/src/test/java/org/apache/james/utils/PropertiesProviderTest.java
@@ -24,8 +24,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.io.FileNotFoundException;
 
-import org.apache.commons.configuration2.PropertiesConfiguration;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.server.core.filesystem.FileSystemImpl;
 import org.junit.jupiter.api.BeforeEach;
@@ -41,7 +39,7 @@ class PropertiesProviderTest {
             .configurationFromClasspath()
             .build();
         FileSystemImpl fileSystem = new FileSystemImpl(configuration.directories());
-        testee = new PropertiesProvider(fileSystem, configuration);
+        testee = new PropertiesProvider(fileSystem, configuration.configurationPath());
     }
 
     @Test
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java b/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
index 2af4dbe..c7882df 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/FakePropertiesProvider.java
@@ -26,7 +26,6 @@ import java.util.Optional;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.james.filesystem.api.FileSystem;
-import org.apache.james.util.OptionalUtils;
 import org.apache.james.utils.PropertiesProvider;
 
 import com.google.common.collect.ImmutableMap;
@@ -40,7 +39,8 @@ public class FakePropertiesProvider extends PropertiesProvider {
     public FakePropertiesProvider(ImmutableMap<String, Configuration> configurations) {
         super(NULL_FILE_SYSTEM, org.apache.james.server.core.configuration.Configuration.builder()
             .workingDirectory("fakePath")
-            .build());
+            .build()
+            .configurationPath());
         this.configurations = configurations;
     }
 
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
index f525a34..50eec0b 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/utils/FailingPropertiesProvider.java
@@ -34,7 +34,8 @@ public class FailingPropertiesProvider extends PropertiesProvider {
     public FailingPropertiesProvider(FileSystem fileSystem) throws FileNotFoundException {
         super(fileSystem, Configuration.builder()
             .workingDirectory(fileSystem.getBasedir().getAbsolutePath())
-            .build());
+            .build()
+            .configurationPath());
     }
 
     @Override


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


[james-project] 07/11: JAMES-3140 CassandraRabbitMQLdapJamesServerMain should not expose its module

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 0d5de68792e3d3e33313ca58bf1ae027e1d8fae8
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 14 18:28:00 2020 +0700

    JAMES-3140 CassandraRabbitMQLdapJamesServerMain should not expose its module
    
    Modules are chosen from the supplied configuration when creating the
    GuiceJamesServer
---
 .../james/CassandraRabbitMQJamesServerFixture.java |  4 ++--
 .../org/apache/james/WithCassandraBlobStore.java   |  2 +-
 .../CassandraRabbitMQLdapJamesServerMain.java      | 22 +++++++++-------------
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  | 10 +++++++---
 .../rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java   | 16 ++++++++--------
 5 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
index 8c57beb..daf7539 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
@@ -26,7 +26,7 @@ import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 
 public class CassandraRabbitMQJamesServerFixture {
 
-    private static final JamesServerBuilder.ServerProvider<CassandraRabbitMQJamesConfiguration> CONFIGURATION_BUILDER =
+    private static final JamesServerBuilder.ServerProvider<CassandraRabbitMQJamesConfiguration> SERVER_PROVIDER =
         configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE);
@@ -45,6 +45,6 @@ public class CassandraRabbitMQJamesServerFixture {
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(rabbitMQExtension)
-            .server(CONFIGURATION_BUILDER);
+            .server(SERVER_PROVIDER);
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
index ca9c115..bcb5118 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
@@ -47,7 +47,7 @@ public class WithCassandraBlobStore implements BeforeAllCallback, AfterAllCallba
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
             .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
-                .overrideWith(TestJMAPServerModule.limitToTenMessages())
+                .overrideWith(new TestJMAPServerModule())
                 .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
             .build();
     }
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
index d667c64..41cfae5 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
@@ -23,9 +23,7 @@ import org.apache.james.data.LdapUsersRepositoryModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.server.JMXServerModule;
-import org.apache.james.server.core.configuration.Configuration;
 
-import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -35,23 +33,21 @@ public class CassandraRabbitMQLdapJamesServerMain implements JamesServerMain {
         .with(new LdapUsersRepositoryModule());
 
     public static void main(String[] args) throws Exception {
-        Configuration configuration = Configuration.builder()
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        BlobStoreConfiguration blobStoreConfiguration = BlobStoreConfiguration.parse(configuration);
-
-        Module baseModule = baseModule(blobStoreConfiguration);
-        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(baseModule, new JMXServerModule());
+        GuiceJamesServer server = createServer(configuration)
+            .combineWith(new JMXServerModule());
 
         JamesServerMain.main(server);
     }
 
-    public static Module baseModule(BlobStoreConfiguration blobStoreConfiguration) {
-        return Modules.combine(ImmutableList.<Module>builder()
-            .add(MODULES)
-            .addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
-            .build());
+    public static GuiceJamesServer createServer(CassandraRabbitMQJamesConfiguration configuration) {
+        BlobStoreConfiguration blobStoreConfiguration = configuration.blobstoreconfiguration();
+
+        return GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(MODULES)
+            .combineWith(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration));
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
index 15e8766..5a5f671 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
@@ -80,13 +80,17 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     }
 
     JamesServerBuilder baseJamesServerExtensionBuilder(BlobStoreConfiguration blobStoreConfiguration) {
-        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
+        return new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .workingDirectory(tmpDir)
+                .configurationFromClasspath()
+                .blobStore(blobStoreConfiguration)
+                .build())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
             .extension(new LdapTestExtension())
-            .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQLdapJamesServerMain.baseModule(blobStoreConfiguration))
+            .server(configuration -> CassandraRabbitMQLdapJamesServerMain.createServer(configuration)
                 .overrideWith(new TestJMAPServerModule())
                 .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
     }
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
index 5928d55..cb04b94 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
@@ -45,14 +45,14 @@ public class RabbitMQAwsS3SendMDNMethodTest extends SendMDNMethodTest {
             .configurationFromClasspath()
             .blobStore(BlobStoreConfiguration.objectStorage())
             .build())
-            .extension(new DockerElasticSearchExtension())
-            .extension(new CassandraExtension())
-            .extension(new AwsS3BlobStoreExtension())
-            .extension(new RabbitMQExtension())
-            .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
-                .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
-                .overrideWith(new TestJMAPServerModule()))
-            .build();
+        .extension(new DockerElasticSearchExtension())
+        .extension(new CassandraExtension())
+        .extension(new AwsS3BlobStoreExtension())
+        .extension(new RabbitMQExtension())
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
+            .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
+            .overrideWith(new TestJMAPServerModule()))
+        .build();
 
     @Override
     protected MessageId randomMessageId() {


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


[james-project] 06/11: JAMES-3140 CassandraRabbitMQJamesServerMain should not expose its module

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 763396ff80d30bde4ea5a0146c62dbebbc6c03b6
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu May 14 18:24:46 2020 +0700

    JAMES-3140 CassandraRabbitMQJamesServerMain should not expose its module
    
    Modules are chosen from the supplied configuration when creating the
    GuiceJamesServer
---
 .../AuthenticatedCassandraJamesServerTest.java     |  6 +--
 .../java/org/apache/james/CacheSessionTest.java    |  2 +-
 .../org/apache/james/CassandraJamesServerTest.java |  2 +-
 .../apache/james/CassandraJmapJamesServerTest.java |  2 +-
 .../CassandraMailRepositoryIntegrationTest.java    |  2 +-
 .../CassandraMessageIdManagerInjectionTest.java    |  2 +-
 .../org/apache/james/CassandraNodeConfTest.java    |  2 +-
 .../org/apache/james/CassandraWithTikaTest.java    |  2 +-
 .../james/DefaultCassandraJamesServerTest.java     |  2 +-
 .../test/java/org/apache/james/ESReporterTest.java |  2 +-
 .../apache/james/JamesCapabilitiesServerTest.java  |  2 +-
 .../james/JamesServerWithRetryConnectionTest.java  |  2 +-
 ...esWithNonCompatibleElasticSearchServerTest.java |  2 +-
 .../org/apache/james/KeyspaceCreationTest.java     |  8 ++--
 .../apache/james/WithCassandraBlobStoreTest.java   |  2 +-
 .../CassandraSchemaVersionStartUpCheckTest.java    |  2 +-
 .../apache/james/CassandraLdapJamesServerTest.java |  2 +-
 .../james/CassandraLdapJmapJamesServerTest.java    |  2 +-
 .../james/CassandraRabbitMQJamesConfiguration.java |  2 +-
 .../james/CassandraRabbitMQJamesServerMain.java    | 20 ++++-----
 .../james/CassandraRabbitMQAwsS3JmapTestRule.java  |  7 ++-
 .../james/CassandraRabbitMQJamesServerFixture.java | 17 +++++---
 .../james/CassandraRabbitMQSwiftJmapTestRule.java  |  7 ++-
 .../james/RabbitMQJamesServerReprocessingTest.java |  4 +-
 .../org/apache/james/WithCassandraBlobStore.java   | 11 +++--
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  |  2 +-
 .../java/org/apache/james/GuiceJamesServer.java    |  7 ++-
 .../java/org/apache/james/JamesServerBuilder.java  | 50 ++++++++++------------
 .../java/org/apache/james/JPAJamesServerTest.java  |  2 +-
 ...WithAuthenticatedDatabaseSqlValidationTest.java |  2 +-
 ...atabaseAuthenticaticationSqlValidationTest.java |  2 +-
 .../apache/james/JamesCapabilitiesServerTest.java  |  2 +-
 .../apache/james/DefaultMemoryJamesServerTest.java |  2 +-
 .../james/GuiceJamesServerStartUpCheckTest.java    |  2 +-
 .../org/apache/james/GuiceJamesServerTest.java     |  2 +-
 .../apache/james/GuiceLifecycleHeathCheckTest.java |  2 +-
 .../LinshareBlobExportMechanismProvidingTest.java  |  2 +-
 .../org/apache/james/MemoryJamesServerTest.java    |  2 +-
 .../apache/james/MemoryJmapJamesServerTest.java    |  2 +-
 .../apache/james/WebAdminRoutesExtensionTest.java  |  2 +-
 .../jmap/cassandra/CassandraImapErrorTest.java     |  2 +-
 .../jmap/cassandra/CassandraSendMDNMethodTest.java |  2 +-
 .../CassandraSpamAssassinContractTest.java         |  2 +-
 .../james/jmap/memory/MemorySendMDNMethodTest.java |  2 +-
 .../memory/MemorySpamAssassinContractTest.java     |  2 +-
 .../rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java   | 12 ++++--
 .../RabbitMQAwsS3SpamAssassinContractTest.java     | 12 ++++--
 .../cucumber/awss3/RabbitMQAwsS3Stepdefs.java      | 19 ++++----
 .../distributed/DistributedEchoMethodTest.java     | 12 ++++--
 .../rabbitmq/ConsistencyTasksIntegrationTest.java  | 11 +++--
 .../rabbitmq/FixingGhostMailboxTest.java           | 11 +++--
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  | 12 ++++--
 .../RabbitMQEventDeadLettersIntegrationTest.java   | 11 +++--
 ...stViewProjectionHealthCheckIntegrationTest.java | 13 +++---
 .../rabbitmq/RabbitMQForwardIntegrationTest.java   | 13 +++---
 .../rabbitmq/RabbitMQJmapExtension.java            | 14 +++---
 .../rabbitmq/RabbitMQJwtFilterIntegrationTest.java | 13 +++---
 ...RabbitMQReindexingWithEventDeadLettersTest.java | 20 +++++----
 .../RabbitMQWebAdminServerIntegrationTest.java     | 12 ++++--
 ...dminServerTaskSerializationIntegrationTest.java | 11 +++--
 ...RabbitMQDeletedMessageVaultIntegrationTest.java | 12 ++++--
 ...LinshareBlobExportMechanismIntegrationTest.java | 12 ++++--
 .../memory/MemoryAuthorizedEndpointsTest.java      |  2 +-
 ...stViewProjectionHealthCheckIntegrationTest.java |  2 +-
 .../memory/MemoryForwardIntegrationTest.java       |  2 +-
 .../memory/MemoryJwtFilterIntegrationTest.java     |  2 +-
 .../memory/MemoryUnauthorizedEndpointsTest.java    |  2 +-
 .../MemoryWebAdminServerIntegrationTest.java       |  2 +-
 .../MemoryDeletedMessageVaultIntegrationTest.java  |  2 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |  2 +-
 70 files changed, 250 insertions(+), 193 deletions(-)

diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/AuthenticatedCassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/AuthenticatedCassandraJamesServerTest.java
index 1e33c62..f88f3b3 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/AuthenticatedCassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/AuthenticatedCassandraJamesServerTest.java
@@ -44,7 +44,7 @@ class AuthenticatedCassandraJamesServerTest {
     @Nested
     class AuthenticationTest implements JamesServerContract {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(cassandraExtension)
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
@@ -63,7 +63,7 @@ class AuthenticatedCassandraJamesServerTest {
     @Nested
     class SslTest {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(cassandraExtension)
             .disableAutoStart()
@@ -91,7 +91,7 @@ class AuthenticatedCassandraJamesServerTest {
     @Nested
     class AuthenticationFailureTest {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(cassandraExtension)
             .disableAutoStart()
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
index c139ccc..29fbf2d 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CacheSessionTest.java
@@ -74,7 +74,7 @@ class CacheSessionTest {
     }
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
index 2effd95..e985dd3 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJamesServerTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraJamesServerTest implements JamesServerContract {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapJamesServerTest.java
index 10bfab2..e213d3e 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraJmapJamesServerTest.java
@@ -29,7 +29,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraJmapJamesServerTest implements JmapJamesServerContract {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
index ba2e94f..17b1c16 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMailRepositoryIntegrationTest.java
@@ -50,7 +50,7 @@ class CassandraMailRepositoryIntegrationTest {
     private SMTPMessageSender smtpMessageSender = new SMTPMessageSender("other.com");
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
index 4b0f384..a0ef4e4 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraMessageIdManagerInjectionTest.java
@@ -37,7 +37,7 @@ import com.google.inject.multibindings.Multibinder;
 
 class CassandraMessageIdManagerInjectionTest {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
index e2b730d..2350dce 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java
@@ -42,7 +42,7 @@ import org.testcontainers.DockerClientFactory;
 class CassandraNodeConfTest {
     private static final int CASSANDRA_PORT = 9042;
     private static JamesServerBuilder extensionBuilder() {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
index 8ff2d6f..8f83f5e 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraWithTikaTest.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class CassandraWithTikaTest implements JamesServerContract {
     @RegisterExtension
     static JamesServerExtension testExtension =
-        new JamesServerBuilder()
+        new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new CassandraExtension())
             .extension(new  TikaExtension())
             .extension(new DockerElasticSearchExtension())
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
index cf332a1..c431e1d 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/DefaultCassandraJamesServerTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class DefaultCassandraJamesServerTest {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
index ec6b532..53713ed 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/ESReporterTest.java
@@ -64,7 +64,7 @@ class ESReporterTest {
     static final DockerElasticSearchExtension elasticSearchExtension = new DockerElasticSearchExtension();
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(elasticSearchExtension)
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index 046bb23..6cacc2c 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -39,7 +39,7 @@ class JamesCapabilitiesServerTest {
     private static final MailboxManager mailboxManager = mock(MailboxManager.class);
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesServerWithRetryConnectionTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesServerWithRetryConnectionTest.java
index 941bf1f..280ab2d 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesServerWithRetryConnectionTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesServerWithRetryConnectionTest.java
@@ -49,7 +49,7 @@ class JamesServerWithRetryConnectionTest {
     private static final CassandraExtension dockerCassandra = new CassandraExtension();
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(dockerElasticSearch)
         .extension(dockerCassandra)
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesWithNonCompatibleElasticSearchServerTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesWithNonCompatibleElasticSearchServerTest.java
index e99948a..643f471 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesWithNonCompatibleElasticSearchServerTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/JamesWithNonCompatibleElasticSearchServerTest.java
@@ -40,7 +40,7 @@ class JamesWithNonCompatibleElasticSearchServerTest {
     static DockerElasticSearch dockerES2 = new DockerElasticSearch.NoAuth(Images.ELASTICSEARCH_2);
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension(dockerES2))
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/KeyspaceCreationTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/KeyspaceCreationTest.java
index b1d9be6..fd85c37 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/KeyspaceCreationTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/KeyspaceCreationTest.java
@@ -35,7 +35,7 @@ class KeyspaceCreationTest {
     @Nested
     class CreateWhenKeyspaceExists {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
@@ -58,7 +58,7 @@ class KeyspaceCreationTest {
     @Nested
     class CreateWhenDoesNotExistAndHasRights {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
@@ -87,7 +87,7 @@ class KeyspaceCreationTest {
     @Nested
     class CreateWhenDoesNotExistAndDoNotHaveRights {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
@@ -116,7 +116,7 @@ class KeyspaceCreationTest {
     @Nested
     class StartWhenKeyspaceDoesNotExist {
         @RegisterExtension
-        JamesServerExtension testExtension = new JamesServerBuilder()
+        JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
index fde036b..596f913 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/WithCassandraBlobStoreTest.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class WithCassandraBlobStoreTest implements JmapJamesServerContract, MailsShouldBeWellReceived, JamesServerContract {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new SpamAssassinModuleExtension())
diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheckTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheckTest.java
index 7209b48..e73b77c 100644
--- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheckTest.java
+++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/modules/mailbox/CassandraSchemaVersionStartUpCheckTest.java
@@ -60,7 +60,7 @@ class CassandraSchemaVersionStartUpCheckTest {
     private static CassandraSchemaVersionDAO versionDAO = mock(CassandraSchemaVersionDAO.class);
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
index 84f092f..a0f773a 100644
--- a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
+++ b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJamesServerTest.java
@@ -53,7 +53,7 @@ class CassandraLdapJamesServerTest implements JamesServerContract {
     SMTPMessageSender messageSender = new SMTPMessageSender(Domain.LOCALHOST.asString());
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new LdapTestExtension())
diff --git a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJmapJamesServerTest.java b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJmapJamesServerTest.java
index 494ce1a..31d0943 100644
--- a/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-ldap-guice/src/test/java/org/apache/james/CassandraLdapJmapJamesServerTest.java
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class CassandraLdapJmapJamesServerTest implements JmapJamesServerContract {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new LdapTestExtension())
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index 55f9e6b..afef000 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -91,7 +91,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
         }
     }
 
-    static CassandraRabbitMQJamesConfiguration.Builder builder() {
+    public static CassandraRabbitMQJamesConfiguration.Builder builder() {
         return new Builder();
     }
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index 318f54b..13a9370 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -29,7 +29,6 @@ import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
 import org.apache.james.modules.server.JMXServerModule;
 
-import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -44,20 +43,17 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
             .useWorkingDirectoryEnvProperty()
             .build();
 
-        BlobStoreConfiguration blobStoreConfiguration = configuration.blobstoreconfiguration();
-
-        Module baseModule = modules(blobStoreConfiguration);
-
-        GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(baseModule, new JMXServerModule());
+        GuiceJamesServer server = createServer(configuration)
+            .combineWith(new JMXServerModule());
 
         JamesServerMain.main(server);
     }
 
-    public static Module modules(BlobStoreConfiguration blobStoreConfiguration) {
-        return Modules.combine(ImmutableList.<Module>builder()
-                .add(MODULES)
-                .addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
-                .build());
+    public static GuiceJamesServer createServer(CassandraRabbitMQJamesConfiguration configuration) {
+        BlobStoreConfiguration blobStoreConfiguration = configuration.blobstoreconfiguration();
+
+        return GuiceJamesServer.forConfiguration(configuration)
+            .combineWith(MODULES)
+            .combineWith(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration));
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
index 59318aa..06b3849 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
@@ -29,7 +29,6 @@ import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
-import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
@@ -62,13 +61,13 @@ public class CassandraRabbitMQAwsS3JmapTestRule implements TestRule {
     }
 
     public GuiceJamesServer jmapServer(Module... additionals) throws IOException {
-        Configuration configuration = Configuration.builder()
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
             .workingDirectory(temporaryFolder.newFolder())
             .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
             .build();
 
-        return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        return CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
index 24cd328..8c57beb 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
@@ -26,19 +26,22 @@ import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 
 public class CassandraRabbitMQJamesServerFixture {
 
-    private static final JamesServerBuilder.ServerProvider CONFIGURATION_BUILDER =
-        configuration -> GuiceJamesServer
-            .forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+    private static final JamesServerBuilder.ServerProvider<CassandraRabbitMQJamesConfiguration> CONFIGURATION_BUILDER =
+        configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE);
 
-    public static JamesServerBuilder baseExtensionBuilder() {
+    public static JamesServerBuilder<CassandraRabbitMQJamesConfiguration> baseExtensionBuilder() {
         return baseExtensionBuilder(new RabbitMQExtension());
     }
 
-    public static JamesServerBuilder baseExtensionBuilder(RabbitMQExtension rabbitMQExtension) {
-        return new JamesServerBuilder()
+    public static JamesServerBuilder<CassandraRabbitMQJamesConfiguration> baseExtensionBuilder(RabbitMQExtension rabbitMQExtension) {
+        return new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .workingDirectory(tmpDir)
+                .configurationFromClasspath()
+                .blobStore(BlobStoreConfiguration.objectStorage())
+                .build())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(rabbitMQExtension)
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
index 75cde2b..009e6a8 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
@@ -29,7 +29,6 @@ import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
-import org.apache.james.server.core.configuration.Configuration;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
@@ -61,13 +60,13 @@ public class CassandraRabbitMQSwiftJmapTestRule implements TestRule {
     }
 
     public GuiceJamesServer jmapServer(Module... additionals) throws IOException {
-        Configuration configuration = Configuration.builder()
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
             .workingDirectory(temporaryFolder.newFolder())
             .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
             .build();
 
-        return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        return CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
             .overrideWith(new DockerSwiftTestRule().getModule())
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
index dc992fd..945cdb0 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
@@ -27,7 +27,6 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
@@ -56,8 +55,7 @@ class RabbitMQJamesServerReprocessingTest {
     JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture
         .baseExtensionBuilder(rabbitMQExtension)
         .extension(new AwsS3BlobStoreExtension())
-        .server(configuration -> GuiceJamesServer
-            .forConfiguration(configuration)
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION))
             .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
index 0d996be..ca9c115 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
@@ -37,13 +37,16 @@ public class WithCassandraBlobStore implements BeforeAllCallback, AfterAllCallba
     private final JamesServerExtension jamesServerExtension;
 
     WithCassandraBlobStore() {
-        jamesServerExtension = new JamesServerBuilder()
+        jamesServerExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+            CassandraRabbitMQJamesConfiguration.builder()
+                .workingDirectory(tmpDir)
+                .configurationFromClasspath()
+                .blobStore(BlobStoreConfiguration.cassandra())
+                .build())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
-            .server(configuration -> GuiceJamesServer
-                .forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.cassandra()))
+            .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
                 .overrideWith(TestJMAPServerModule.limitToTenMessages())
                 .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
             .build();
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
index df6cc67..15e8766 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
@@ -80,7 +80,7 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     }
 
     JamesServerBuilder baseJamesServerExtensionBuilder(BlobStoreConfiguration blobStoreConfiguration) {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/GuiceJamesServer.java b/server/container/guice/guice-common/src/main/java/org/apache/james/GuiceJamesServer.java
index 84611d7..f149796 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/GuiceJamesServer.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/GuiceJamesServer.java
@@ -19,6 +19,7 @@
 package org.apache.james;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
 
 import javax.annotation.PreDestroy;
@@ -67,7 +68,11 @@ public class GuiceJamesServer {
     }
     
     public GuiceJamesServer combineWith(Module... modules) {
-        return new GuiceJamesServer(isStartedProbe, Modules.combine(Iterables.concat(Arrays.asList(module), Arrays.asList(modules))));
+        return combineWith(Arrays.asList(modules));
+    }
+
+    public GuiceJamesServer combineWith(Collection<Module> modules) {
+        return new GuiceJamesServer(isStartedProbe, Modules.combine(Iterables.concat(Arrays.asList(module), modules)));
     }
 
     public GuiceJamesServer overrideWith(Module... overrides) {
diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java b/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java
index dfed2b0..0a749fd 100644
--- a/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java
+++ b/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java
@@ -20,7 +20,6 @@
 package org.apache.james;
 
 import java.io.File;
-import java.io.UncheckedIOException;
 import java.util.Optional;
 
 import org.apache.james.server.core.configuration.Configuration;
@@ -30,80 +29,75 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 
-public class JamesServerBuilder {
+public class JamesServerBuilder<T extends Configuration> {
     private static final boolean DEFAULT_AUTO_START = true;
 
     @FunctionalInterface
-    public interface ConfigurationProvider {
-        Configuration buildConfiguration(File tempDirectory);
+    public interface ConfigurationProvider<T extends Configuration> {
+        T buildConfiguration(File tempDirectory);
     }
 
     @FunctionalInterface
-    public interface ServerProvider {
-        GuiceJamesServer buildServer(Configuration configuration);
+    public interface ServerProvider<T extends Configuration>  {
+        GuiceJamesServer buildServer(T configuration);
+    }
+
+
+    public static ConfigurationProvider<Configuration.Basic> defaultConfigurationProvider() {
+        return tmpDir ->
+            Configuration.builder()
+                .workingDirectory(tmpDir)
+                .configurationFromClasspath()
+                .build();
     }
 
     private final ImmutableList.Builder<GuiceModuleTestExtension> extensions;
     private final TemporaryFolderRegistrableExtension folderRegistrableExtension;
     private final ImmutableList.Builder<Module> overrideModules;
     private ServerProvider server;
-    private Optional<ConfigurationProvider> configuration;
+    private ConfigurationProvider configuration;
     private Optional<Boolean> autoStart;
 
-    public JamesServerBuilder() {
-        configuration = Optional.empty();
+    public JamesServerBuilder(ConfigurationProvider configurationProvider) {
+        configuration = configurationProvider;
         extensions = ImmutableList.builder();
         folderRegistrableExtension = new TemporaryFolderRegistrableExtension();
         autoStart = Optional.empty();
         overrideModules = ImmutableList.builder();
     }
 
-    public JamesServerBuilder extensions(GuiceModuleTestExtension... extensions) {
+    public JamesServerBuilder<T> extensions(GuiceModuleTestExtension... extensions) {
         this.extensions.add(extensions);
         return this;
     }
 
-    public JamesServerBuilder extension(GuiceModuleTestExtension extension) {
+    public JamesServerBuilder<T> extension(GuiceModuleTestExtension extension) {
         return this.extensions(extension);
     }
 
-    public JamesServerBuilder configuration(ConfigurationProvider configuration) throws UncheckedIOException {
-        this.configuration = Optional.of(configuration);
-        return this;
-    }
-
-    public JamesServerBuilder server(ServerProvider server) {
+    public JamesServerBuilder<T> server(ServerProvider<T> server) {
         this.server = server;
         return this;
     }
 
-    public JamesServerBuilder overrideServerModule(Module module) {
+    public JamesServerBuilder<T> overrideServerModule(Module module) {
         this.overrideModules.add(module);
         return this;
     }
 
-    public JamesServerBuilder disableAutoStart() {
+    public JamesServerBuilder<T> disableAutoStart() {
         this.autoStart = Optional.of(false);
         return this;
     }
 
     public JamesServerExtension build() {
         Preconditions.checkNotNull(server);
-        ConfigurationProvider configuration = this.configuration.orElse(defaultConfigurationProvider());
         JamesServerExtension.AwaitCondition awaitCondition = () -> extensions.build().forEach(GuiceModuleTestExtension::await);
 
         return new JamesServerExtension(buildAggregateJunitExtension(), file -> overrideServerWithExtensionsModules(file, configuration),
             awaitCondition, autoStart.orElse(DEFAULT_AUTO_START));
     }
 
-    private ConfigurationProvider defaultConfigurationProvider() {
-        return tmpDir ->
-            Configuration.builder()
-                .workingDirectory(tmpDir)
-                .configurationFromClasspath()
-                .build();
-    }
-
     private AggregateJunitExtension buildAggregateJunitExtension() {
         ImmutableList<GuiceModuleTestExtension> extensions = this.extensions.build();
         return new AggregateJunitExtension(
diff --git a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
index 985f985..e9f4b65 100644
--- a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
+++ b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerTest.java
@@ -40,7 +40,7 @@ import com.google.common.base.Strings;
 class JPAJamesServerTest implements JamesServerContract {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(JPAJamesServerMain.JPA_MODULE_AGGREGATE)
             .overrideWith(new TestJPAConfigurationModule(), DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest.java b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest.java
index 63e950b..b5ff257 100644
--- a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest.java
+++ b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest.java
@@ -24,7 +24,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class JPAJamesServerWithAuthenticatedDatabaseSqlValidationTest extends JPAJamesServerWithSqlValidationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(JPAJamesServerMain.JPA_MODULE_AGGREGATE)
             .overrideWith(new TestJPAConfigurationModuleWithSqlValidation.WithDatabaseAuthentication(), DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest.java b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest.java
index 2f4a70d..77f01cb 100644
--- a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest.java
+++ b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest.java
@@ -24,7 +24,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class JPAJamesServerWithNoDatabaseAuthenticaticationSqlValidationTest extends JPAJamesServerWithSqlValidationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(JPAJamesServerMain.JPA_MODULE_AGGREGATE)
             .overrideWith(new TestJPAConfigurationModuleWithSqlValidation.NoDatabaseAuthentication(), DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
index 4da401b..741b79c 100644
--- a/server/container/guice/jpa-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
+++ b/server/container/guice/jpa-guice/src/test/java/org/apache/james/JamesCapabilitiesServerTest.java
@@ -40,7 +40,7 @@ class JamesCapabilitiesServerTest {
     }
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(JPAJamesServerMain.JPA_MODULE_AGGREGATE)
             .overrideWith(new TestJPAConfigurationModule())
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
index 4cab899..19f1ef6 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class DefaultMemoryJamesServerTest {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
index 528090e..4dc1247 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java
@@ -112,7 +112,7 @@ class GuiceJamesServerStartUpCheckTest {
     }
 
     private static JamesServerBuilder extensionBuilder() {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
                 .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
                 .overrideWith(new TestJMAPServerModule()))
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
index e629ce5..398a52d 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java
@@ -18,7 +18,7 @@ class GuiceJamesServerTest {
     private static final Logger LOGGER = LoggerFactory.getLogger(GuiceJamesServerTest.class);
 
     private static JamesServerBuilder extensionBuilder() {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
                 .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
                 .overrideWith(new TestJMAPServerModule()))
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java
index 60373d4..fed501c 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java
@@ -47,7 +47,7 @@ import reactor.core.scheduler.Schedulers;
 
 class GuiceLifecycleHeathCheckTest {
     private static JamesServerBuilder extensionBuilder() {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
                 .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
                 .overrideWith(new TestJMAPServerModule())
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/LinshareBlobExportMechanismProvidingTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/LinshareBlobExportMechanismProvidingTest.java
index a6e022b..1974441 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/LinshareBlobExportMechanismProvidingTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/LinshareBlobExportMechanismProvidingTest.java
@@ -29,7 +29,7 @@ class LinshareBlobExportMechanismProvidingTest {
     private static final LinshareGuiceExtension linshareGuiceExtension = new LinshareGuiceExtension();
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(linshareGuiceExtension)
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE))
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJamesServerTest.java
index af54b78..7f01fe1 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJamesServerTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJamesServerTest.java
@@ -26,7 +26,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class MemoryJamesServerTest implements JamesServerContract {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java
index ce86dd0..ffb3128 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryJmapJamesServerTest {
 
     private static JamesServerBuilder extensionBuilder() {
-        return new JamesServerBuilder()
+        return new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
                 .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
                 .overrideWith(new TestJMAPServerModule())
diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/WebAdminRoutesExtensionTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/WebAdminRoutesExtensionTest.java
index 2c21112..76b19cf 100644
--- a/server/container/guice/memory-guice/src/test/java/org/apache/james/WebAdminRoutesExtensionTest.java
+++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/WebAdminRoutesExtensionTest.java
@@ -35,7 +35,7 @@ import io.restassured.RestAssured;
 
 class WebAdminRoutesExtensionTest {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraImapErrorTest.java b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraImapErrorTest.java
index b789c13..d8b849d 100644
--- a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraImapErrorTest.java
+++ b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraImapErrorTest.java
@@ -49,7 +49,7 @@ class CassandraImapErrorTest {
     private final CassandraExtension cassandraExtension = new CassandraExtension();
 
     @RegisterExtension
-    JamesServerExtension serverExtension = new JamesServerBuilder()
+    JamesServerExtension serverExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(cassandraExtension)
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSendMDNMethodTest.java
index 6989142..72a756e 100644
--- a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSendMDNMethodTest.java
@@ -37,7 +37,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 public class CassandraSendMDNMethodTest extends SendMDNMethodTest {
 
     @RegisterExtension
-    JamesServerExtension testExtension = new JamesServerBuilder()
+    JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
diff --git a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSpamAssassinContractTest.java b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSpamAssassinContractTest.java
index 093ac2c..b188a2c 100644
--- a/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSpamAssassinContractTest.java
+++ b/server/protocols/jmap-draft-integration-testing/cassandra-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraSpamAssassinContractTest.java
@@ -37,7 +37,7 @@ class CassandraSpamAssassinContractTest implements SpamAssassinContract {
     private static final SpamAssassinModuleExtension spamAssassinExtension = new SpamAssassinModuleExtension();
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(spamAssassinExtension)
diff --git a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySendMDNMethodTest.java
index 39c2675..e1a7a69 100644
--- a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySendMDNMethodTest.java
@@ -38,7 +38,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 public class MemorySendMDNMethodTest extends SendMDNMethodTest {
 
     @RegisterExtension
-    JamesServerExtension testExtension = new JamesServerBuilder()
+    JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java
index 1e6da62..315ccaf 100644
--- a/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java
+++ b/server/protocols/jmap-draft-integration-testing/memory-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/memory/MemorySpamAssassinContractTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemorySpamAssassinContractTest implements SpamAssassinContract {
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new SpamAssassinModuleExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
index e9e07d9..5928d55 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.jmap.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.jmap.draft.methods.integration.SendMDNMethodTest;
@@ -39,13 +39,17 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 public class RabbitMQAwsS3SendMDNMethodTest extends SendMDNMethodTest {
 
     @RegisterExtension
-    JamesServerExtension testExtension = new JamesServerBuilder()
+    JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new AwsS3BlobStoreExtension())
             .extension(new RabbitMQExtension())
-            .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+            .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
                 .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new TestJMAPServerModule()))
             .build();
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
index 9add76d..1c688de 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
@@ -19,9 +19,9 @@
 package org.apache.james.jmap.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.jmap.draft.methods.integration.SpamAssassinContract;
@@ -38,14 +38,18 @@ class RabbitMQAwsS3SpamAssassinContractTest implements SpamAssassinContract {
 
     private static final SpamAssassinModuleExtension spamAssassinExtension = new SpamAssassinModuleExtension();
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new RabbitMQExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(spamAssassinExtension)
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule()))
         .build();
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
index e26ced9..f9b4911 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
@@ -25,11 +25,11 @@ import javax.inject.Inject;
 
 import org.apache.activemq.store.PersistenceAdapter;
 import org.apache.activemq.store.memory.MemoryPersistenceAdapter;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.CleanupTasksPerformer;
 import org.apache.james.DockerCassandraRule;
 import org.apache.james.DockerElasticSearchRule;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.jmap.draft.methods.integration.cucumber.ImapStepdefs;
 import org.apache.james.jmap.draft.methods.integration.cucumber.MainStepdefs;
 import org.apache.james.mailbox.cassandra.ids.CassandraMessageId;
@@ -42,7 +42,6 @@ import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.CassandraTruncateTableTask;
-import org.apache.james.server.core.configuration.Configuration;
 import org.junit.rules.TemporaryFolder;
 
 import com.github.fge.lambdas.runnable.ThrowingRunnable;
@@ -78,14 +77,14 @@ public class RabbitMQAwsS3Stepdefs {
 
         temporaryFolder.create();
         mainStepdefs.messageIdFactory = new CassandraMessageId.Factory();
-        Configuration configuration = Configuration.builder()
-                .workingDirectory(temporaryFolder.newFolder())
-                .configurationFromClasspath()
-                .build();
-
-        mainStepdefs.jmapServer = GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
-                .overrideWith(new TestJMAPServerModule())
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(temporaryFolder.newFolder())
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build();
+
+        mainStepdefs.jmapServer = CassandraRabbitMQJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule())
                 .overrideWith(new TestDockerESMetricReporterModule(elasticSearch.getDockerEs().getHttpHost()))
                 .overrideWith(new TestRabbitMQModule(rabbitMQServer.dockerRabbitMQ()))
                 .overrideWith(swiftServer.getModule())
diff --git a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEchoMethodTest.java b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEchoMethodTest.java
index 8583337..0785c18 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEchoMethodTest.java
+++ b/server/protocols/jmap-rfc-8621-integration-tests/distributed-jmap-rfc-8621-integration-tests/src/test/java/org/apache/james/jmap/rfc8621/distributed/DistributedEchoMethodTest.java
@@ -20,6 +20,7 @@
 package org.apache.james.jmap.rfc8621.distributed;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -29,18 +30,23 @@ import org.apache.james.jmap.rfc8621.contract.EchoMethodContract;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class DistributedEchoMethodTest implements EchoMethodContract {
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new RabbitMQExtension())
         .extension(new AwsS3BlobStoreExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule()))
         .build();
 }
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
index c7f6bf6..732db78 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
@@ -40,6 +40,7 @@ import java.io.IOException;
 import java.time.Duration;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -122,13 +123,17 @@ class ConsistencyTasksIntegrationTest {
     }
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new WebadminIntegrationTestModule())
             // Enforce a single eventBus retry. Required as Current Quotas are handled by the eventBus.
             .overrideWith(binder -> binder.bind(RetryBackoffConfiguration.class)
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
index 2f4beb1..94f85fd 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
@@ -43,6 +43,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -109,13 +110,17 @@ class FixingGhostMailboxTest {
     private static final Duration THIRTY_SECONDS = new Duration(30, TimeUnit.SECONDS);
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
index db84cb2..3e705ba 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.junit.categories.BasicFeature;
@@ -39,13 +39,17 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class RabbitMQAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new UnauthorizedModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
index 16aeca7..ba29e44 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
@@ -37,6 +37,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -199,14 +200,18 @@ class RabbitMQEventDeadLettersIntegrationTest {
 
     private static RabbitMQExtension RABBIT_MQ_EXTENSION = new RabbitMQExtension();
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(RABBIT_MQ_EXTENSION)
         .extension(new RetryEventsListenerExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new WebadminIntegrationTestModule())
             .overrideWith(binder -> binder.bind(RetryBackoffConfiguration.class)
                 .toInstance(RetryBackoffConfiguration.builder()
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
index 4010e06..f075d89 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
@@ -34,15 +34,18 @@ import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationContract {
-
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
index dfa93ad..21b3475 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
@@ -34,15 +34,18 @@ import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQForwardIntegrationTest extends ForwardIntegrationTest {
-
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
index 57ac262..3854232 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.CleanupTasksPerformer;
 import org.apache.james.DockerCassandraRule;
@@ -35,7 +36,6 @@ import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestRabbitMQModule;
 import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
-import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.util.FunctionalUtils;
 import org.apache.james.util.Runnables;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
@@ -148,13 +148,13 @@ public class RabbitMQJmapExtension implements BeforeAllCallback, AfterAllCallbac
     }
 
     private GuiceJamesServer james() throws IOException {
-        Configuration configuration = Configuration.builder()
-                .workingDirectory(temporaryFolder.newFolder())
-                .configurationFromClasspath()
-                .build();
+        CassandraRabbitMQJamesConfiguration configuration = CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(temporaryFolder.newFolder())
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build();
 
-        return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        return CassandraRabbitMQJamesServerMain.createServer(configuration)
                 .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new TestDockerESMetricReporterModule(elasticSearchRule.getDockerEs().getHttpHost()))
                 .overrideWith(cassandra.getModule())
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
index 62a3267..57d3f34 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.jwt.JwtConfiguration;
@@ -36,15 +36,18 @@ import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQJwtFilterIntegrationTest extends JwtFilterIntegrationTest {
-
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(binder -> binder.bind(AuthenticationFilter.class).to(JwtFilter.class))
             .overrideWith(binder -> binder.bind(JwtConfiguration.class).toInstance(jwtConfiguration()))
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
index 0693461..bac2a47 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
@@ -33,6 +33,7 @@ import static org.awaitility.Duration.ONE_HUNDRED_MILLISECONDS;
 import java.util.List;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -80,20 +81,21 @@ class RabbitMQReindexingWithEventDeadLettersTest {
     private static final DockerElasticSearchExtension dockerElasticSearch =
         new DockerElasticSearchExtension().withRequestTimeout(java.time.Duration.ofSeconds(5));
 
-    private static final JamesServerBuilder.ServerProvider CONFIGURATION_BUILDER = configuration -> GuiceJamesServer
-        .forConfiguration(configuration)
-        .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
-        .overrideWith(new TestJMAPServerModule())
-        .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE)
-        .overrideWith(new WebadminIntegrationTestModule());
-
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(dockerElasticSearch)
         .extension(new CassandraExtension())
         .extension(new RabbitMQExtension())
         .extension(new AwsS3BlobStoreExtension(PayloadCodecFactory.AES256))
-        .server(CONFIGURATION_BUILDER)
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
+            .overrideWith(new TestJMAPServerModule())
+            .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE)
+            .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
     private RequestSpecification webAdminApi;
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
index 69578e6..8e1ba0d 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
@@ -30,9 +30,9 @@ import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.Matchers.is;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManager;
@@ -59,13 +59,17 @@ import io.restassured.http.ContentType;
 class RabbitMQWebAdminServerIntegrationTest extends WebAdminServerIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
index bfbf653f..855ee86 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
@@ -38,6 +38,7 @@ import java.util.stream.Stream;
 import javax.mail.Flags;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
 import org.apache.james.GuiceJamesServer;
@@ -97,13 +98,17 @@ import io.restassured.http.ContentType;
 class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
index e0f3d67..ff6780f 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq.vault;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
@@ -39,14 +39,18 @@ class RabbitMQDeletedMessageVaultIntegrationTest extends DeletedMessageVaultInte
     private static final DockerElasticSearchExtension ES_EXTENSION = new DockerElasticSearchExtension();
 
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(ES_EXTENSION)
         .extension(new CassandraExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .extension(new ClockExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule())
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
index 179d642..36ee9a1 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
@@ -20,9 +20,9 @@
 package org.apache.james.webadmin.integration.rabbitmq.vault;
 
 import org.apache.james.CassandraExtension;
+import org.apache.james.CassandraRabbitMQJamesConfiguration;
 import org.apache.james.CassandraRabbitMQJamesServerMain;
 import org.apache.james.DockerElasticSearchExtension;
-import org.apache.james.GuiceJamesServer;
 import org.apache.james.JamesServerBuilder;
 import org.apache.james.JamesServerExtension;
 import org.apache.james.backends.rabbitmq.DockerRabbitMQSingleton;
@@ -41,14 +41,18 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQLinshareBlobExportMechanismIntegrationTest extends LinshareBlobExportMechanismIntegrationTest {
     @RegisterExtension
-    static JamesServerExtension testExtension = new JamesServerBuilder()
+    static JamesServerExtension testExtension = new JamesServerBuilder<CassandraRabbitMQJamesConfiguration>(tmpDir ->
+        CassandraRabbitMQJamesConfiguration.builder()
+            .workingDirectory(tmpDir)
+            .configurationFromClasspath()
+            .blobStore(BlobStoreConfiguration.objectStorage())
+            .build())
         .extension(new DockerElasticSearchExtension())
         .extension(new CassandraExtension())
         .extension(new RabbitMQExtension())
         .extension(new AwsS3BlobStoreExtension())
         .extension(new LinshareGuiceExtension())
-        .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
+        .server(configuration -> CassandraRabbitMQJamesServerMain.createServer(configuration)
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
index 42eb364..c1aa2f8 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryAuthorizedEndpointsTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new WebadminIntegrationTestModule())
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
index 368dbe7..d575c09 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryFastViewProjectionHealthCheckIntegrationTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class MemoryFastViewProjectionHealthCheckIntegrationTest extends FastViewProjectionHealthCheckIntegrationContract {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryForwardIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryForwardIntegrationTest.java
index 710bb09..6a157c3 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryForwardIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryForwardIntegrationTest.java
@@ -31,7 +31,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryForwardIntegrationTest extends ForwardIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestJMAPServerModule())
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
index f62bd7b..2ee1a30 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryJwtFilterIntegrationTest.java
@@ -33,7 +33,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryJwtFilterIntegrationTest extends JwtFilterIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new WebadminIntegrationTestModule())
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUnauthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUnauthorizedEndpointsTest.java
index 7a8a1ca..83a030a 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUnauthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryUnauthorizedEndpointsTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryUnauthorizedEndpointsTest extends UnauthorizedEndpointsTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule())
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
index 323c77a..05756dd 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/MemoryWebAdminServerIntegrationTest.java
@@ -30,7 +30,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryWebAdminServerIntegrationTest extends WebAdminServerIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
index 0fc9703..1dd785e 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryDeletedMessageVaultIntegrationTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 class MemoryDeletedMessageVaultIntegrationTest extends DeletedMessageVaultIntegrationTest {
 
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new ClockExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)
diff --git a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryLinshareBlobExportMechanismIntegrationTest.java b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryLinshareBlobExportMechanismIntegrationTest.java
index aae0ec5..547ddf0 100644
--- a/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryLinshareBlobExportMechanismIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/memory-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/memory/vault/MemoryLinshareBlobExportMechanismIntegrationTest.java
@@ -32,7 +32,7 @@ import org.junit.jupiter.api.extension.RegisterExtension;
 
 class MemoryLinshareBlobExportMechanismIntegrationTest extends LinshareBlobExportMechanismIntegrationTest {
     @RegisterExtension
-    static JamesServerExtension jamesServerExtension = new JamesServerBuilder()
+    static JamesServerExtension jamesServerExtension = new JamesServerBuilder<>(JamesServerBuilder.defaultConfigurationProvider())
         .extension(new LinshareGuiceExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
             .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE)


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


[james-project] 02/11: JAMES-3140 Choosing blob store should be done via configured modules

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 1be5a9370a96f32f072e0baf12dbe960d0f0ecf9
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Apr 24 12:05:25 2020 +0700

    JAMES-3140 Choosing blob store should be done via configured modules
    
    This makes guice modules composition staticaly defined before starting
    James
---
 .../CassandraRabbitMQAwsS3SmtpTestRuleFactory.java |  26 ++-
 .../mpt/smtp/CassandraSmtpTestRuleFactory.java     |   4 +-
 .../ObjectStorageBlobStoreModule.java              |  39 ----
 .../ObjectStorageDependenciesModule.java           |   8 +-
 .../swift/ObjectStorageBlobStoreModuleTest.java    |  14 +-
 .../org/apache/james/CassandraJamesServerMain.java |  11 +-
 ...onModule.java => CassandraBlobStoreModule.java} |   2 +-
 .../apache/james/CassandraLdapJamesServerMain.java |   7 +-
 .../james/CassandraRabbitMQJamesServerMain.java    |  27 ++-
 .../modules/blobstore/BlobStoreChoosingModule.java |  49 -----
 ...figuration.java => BlobStoreConfiguration.java} |  50 +++--
 .../modules/blobstore/BlobStoreModulesChooser.java | 114 +++++++++++
 .../james/CassandraRabbitMQAwsS3JmapTestRule.java  |   6 +-
 .../james/CassandraRabbitMQJamesServerFixture.java |   3 +-
 .../james/CassandraRabbitMQSwiftJmapTestRule.java  |   7 +-
 .../james/RabbitMQJamesServerReprocessingTest.java |   5 +-
 ...RabbitMQJamesServerWithRetryConnectionTest.java |   2 +
 .../org/apache/james/WithCassandraBlobStore.java   |  15 +-
 .../james/modules/AwsS3BlobStoreExtension.java     |   6 +-
 .../james/modules/SwiftBlobStoreExtension.java     |   6 +-
 .../james/modules/TestAwsS3BlobStoreModule.java    |  47 -----
 .../james/modules/TestSwiftBlobStoreModule.java    |  46 -----
 .../blobstore/BlobStoreChoosingModuleTest.java     | 211 ---------------------
 ...onTest.java => BlobStoreConfigurationTest.java} | 108 +++++++++--
 .../blobstore/BlobStoreModulesChooserTest.java     | 105 ++++++++++
 .../CassandraRabbitMQLdapJamesServerMain.java      |  21 +-
 .../CassandraRabbitMQLdapJmapJamesServerTest.java  |  18 +-
 .../java/org/apache/james/JamesServerMain.java     |   8 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |   7 +-
 .../java/org/apache/james/JPAJamesServerMain.java  |   7 +-
 .../org/apache/james/MemoryJamesServerMain.java    |  10 +-
 .../rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java   |   3 +-
 .../RabbitMQAwsS3SpamAssassinContractTest.java     |   3 +-
 .../cucumber/awss3/RabbitMQAwsS3Stepdefs.java      |   3 +-
 .../rabbitmq/ConsistencyTasksIntegrationTest.java  |   5 +-
 .../rabbitmq/FixingGhostMailboxTest.java           |   3 +-
 .../rabbitmq/RabbitMQAuthorizedEndpointsTest.java  |   3 +-
 .../RabbitMQEventDeadLettersIntegrationTest.java   |   3 +-
 ...stViewProjectionHealthCheckIntegrationTest.java |   3 +-
 .../rabbitmq/RabbitMQForwardIntegrationTest.java   |   3 +-
 .../rabbitmq/RabbitMQJmapExtension.java            |   3 +-
 .../rabbitmq/RabbitMQJwtFilterIntegrationTest.java |   3 +-
 ...RabbitMQReindexingWithEventDeadLettersTest.java |   3 +-
 .../RabbitMQWebAdminServerIntegrationTest.java     |   3 +-
 ...dminServerTaskSerializationIntegrationTest.java |   3 +-
 ...RabbitMQDeletedMessageVaultIntegrationTest.java |   3 +-
 ...LinshareBlobExportMechanismIntegrationTest.java |   3 +-
 47 files changed, 534 insertions(+), 505 deletions(-)

diff --git a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
index 01c82b4..6ccde46 100644
--- a/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra-rabbitmq-object-storage/src/test/java/org/apache/james/mpt/smtp/CassandraRabbitMQAwsS3SmtpTestRuleFactory.java
@@ -25,11 +25,13 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.backends.rabbitmq.DockerRabbitMQSingleton;
+import org.apache.james.blob.api.BlobStore;
+import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.modules.TestAwsS3BlobStoreModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
@@ -40,6 +42,10 @@ import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.util.Host;
 import org.junit.rules.TemporaryFolder;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.name.Names;
+
 public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
     public static SmtpTestRule create(SmtpServerConnectedType smtpServerConnectedType, Host cassandraHost, DockerAwsS3TestRule awsS3TestRule) {
         SmtpTestRule.ServerBuilder createJamesServer = (folder, dnsService) -> createJamesServer(cassandraHost, awsS3TestRule, folder, dnsService);
@@ -47,6 +53,16 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
         return new SmtpTestRule(smtpServerConnectedType, createJamesServer);
     }
 
+    private static Module BLOB_STORE_MODULE = new AbstractModule() {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            bind(BlobStore.class)
+                .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(ObjectStorageBlobStore.class);
+        }
+    };
+
     private static GuiceJamesServer createJamesServer(Host cassandraHost, DockerAwsS3TestRule awsS3TestRule, TemporaryFolder folder, DNSService dnsService) throws Exception {
         Configuration configuration = Configuration.builder()
             .workingDirectory(folder.newFolder())
@@ -59,12 +75,10 @@ public final class CassandraRabbitMQAwsS3SmtpTestRuleFactory {
                 binder -> binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
                     .toInstance(BaseHierarchicalConfiguration::new))
-            .overrideWith(
-                new RabbitMQModule(),
-                new BlobStoreChoosingModule())
+            .overrideWith(new RabbitMQModule(), BLOB_STORE_MODULE)
             .overrideWith(
                 new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON),
-                new TestAwsS3BlobStoreModule(awsS3TestRule),
+                awsS3TestRule.getModule(),
                 binder -> binder.bind(KeyspacesConfiguration.class)
                     .toInstance(KeyspacesConfiguration.builder()
                         .keyspace(DockerCassandra.KEYSPACE)
diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index dfec67e..97b73de 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -24,7 +24,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.dnsservice.api.DNSService;
-import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.server.CamelMailetContainerModule;
@@ -49,7 +49,7 @@ public final class CassandraSmtpTestRuleFactory {
 
         return GuiceJamesServer.forConfiguration(configuration)
             .combineWith(CassandraJamesServerMain.CASSANDRA_SERVER_CORE_MODULE,
-                new CassandraBlobStoreDeclarationModule(),
+                new CassandraBlobStoreModule(),
                 SmtpTestRule.SMTP_PROTOCOL_MODULE,
                 binder -> binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
diff --git a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
deleted file mode 100644
index 5440878..0000000
--- a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageBlobStoreModule.java
+++ /dev/null
@@ -1,39 +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.modules.objectstorage;
-
-import org.apache.james.blob.api.BlobStore;
-import org.apache.james.blob.api.MetricableBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.name.Names;
-
-public class ObjectStorageBlobStoreModule extends AbstractModule {
-
-    @Override
-    protected void configure() {
-        install(new ObjectStorageDependenciesModule());
-        bind(BlobStore.class)
-            .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
-            .to(ObjectStorageBlobStore.class);
-    }
-
-}
diff --git a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
index 7ccbb9a..a56388b 100644
--- a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
+++ b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/ObjectStorageDependenciesModule.java
@@ -28,7 +28,6 @@ import javax.inject.Singleton;
 import org.apache.commons.configuration2.Configuration;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.james.blob.api.BlobId;
-import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.objectstorage.BlobPutter;
 import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.objectstorage.ObjectStorageBlobStoreBuilder;
@@ -40,13 +39,12 @@ import org.apache.james.utils.PropertiesProvider;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
-import com.google.inject.Scopes;
 
 public class ObjectStorageDependenciesModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(BlobId.Factory.class).to(HashBlobId.Factory.class).in(Scopes.SINGLETON);
+
     }
 
     @Provides
@@ -66,7 +64,7 @@ public class ObjectStorageDependenciesModule extends AbstractModule {
         ObjectStorageBlobStore blobStore = selectBlobStoreBuilder(configuration)
             .blobIdFactory(blobIdFactory)
             .payloadCodec(configuration.getPayloadCodec())
-            .blobPutter(putBlob(blobIdFactory, configuration, awsS3ObjectStorageProvider))
+            .blobPutter(putBlob(configuration, awsS3ObjectStorageProvider))
             .namespace(configuration.getNamespace())
             .bucketPrefix(configuration.getBucketPrefix())
             .build();
@@ -83,7 +81,7 @@ public class ObjectStorageDependenciesModule extends AbstractModule {
         throw new IllegalArgumentException("unknown provider " + configuration.getProvider());
     }
 
-    private Optional<BlobPutter> putBlob(BlobId.Factory blobIdFactory, ObjectStorageBlobConfiguration configuration, Provider<AwsS3ObjectStorage> awsS3ObjectStorageProvider) {
+    private Optional<BlobPutter> putBlob(ObjectStorageBlobConfiguration configuration, Provider<AwsS3ObjectStorage> awsS3ObjectStorageProvider) {
         switch (configuration.getProvider()) {
             case SWIFT:
                 return Optional.empty();
diff --git a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
index 05a386a..fbd6d63 100644
--- a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
+++ b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/swift/ObjectStorageBlobStoreModuleTest.java
@@ -26,11 +26,13 @@ import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
 
+import org.apache.james.blob.api.BlobId;
 import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.api.HashBlobId;
 import org.apache.james.blob.objectstorage.DockerSwift;
 import org.apache.james.blob.objectstorage.DockerSwiftExtension;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.objectstorage.swift.Credentials;
 import org.apache.james.blob.objectstorage.swift.DomainName;
 import org.apache.james.blob.objectstorage.swift.IdentityV3;
@@ -44,7 +46,7 @@ import org.apache.james.blob.objectstorage.swift.TenantName;
 import org.apache.james.blob.objectstorage.swift.UserHeaderName;
 import org.apache.james.blob.objectstorage.swift.UserName;
 import org.apache.james.modules.objectstorage.ObjectStorageBlobConfiguration;
-import org.apache.james.modules.objectstorage.ObjectStorageBlobStoreModule;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.modules.objectstorage.ObjectStorageProvider;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.junit.jupiter.api.BeforeAll;
@@ -57,8 +59,6 @@ import org.junit.jupiter.params.provider.ArgumentsSource;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.name.Names;
 import com.google.inject.util.Modules;
 
 @ExtendWith(DockerSwiftExtension.class)
@@ -132,11 +132,11 @@ class ObjectStorageBlobStoreModuleTest {
     @ArgumentsSource(BlobStorageBlobConfigurationProvider.class)
     void shouldSetupBlobStore(ObjectStorageBlobConfiguration configuration) {
         Injector injector = Guice.createInjector(
-            Modules
-                .override(new ObjectStorageBlobStoreModule())
+            Modules.override(binder -> binder.bind(BlobId.Factory.class).to(HashBlobId.Factory.class),
+                    new ObjectStorageDependenciesModule())
                 .with(binder -> binder.bind(ObjectStorageBlobConfiguration.class).toInstance(configuration)));
 
-        BlobStore blobStore = injector.getInstance(Key.get(BlobStore.class, Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)));
+        BlobStore blobStore = injector.getInstance(ObjectStorageBlobStore.class);
 
         assertThatCode(() -> blobStore.save(blobStore.getDefaultBucketName(), new byte[] {0x00}, LOW_COST)).doesNotThrowAnyException();
     }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 440828e..a28abc2 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -35,8 +35,8 @@ import org.apache.james.modules.data.CassandraSieveRepositoryModule;
 import org.apache.james.modules.data.CassandraUsersRepositoryModule;
 import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.BlobStoreAPIModule;
-import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
 import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
@@ -73,6 +73,7 @@ import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
 import org.apache.james.modules.webadmin.CassandraRoutesModule;
 import org.apache.james.modules.webadmin.InconsistencySolvingRoutesModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
@@ -155,14 +156,18 @@ public class CassandraJamesServerMain implements JamesServerMain {
         new DKIMMailetModule());
 
     public static Module ALL_BUT_JMX_CASSANDRA_MODULE = Modules.combine(
-        new CassandraBlobStoreDeclarationModule(),
+        new CassandraBlobStoreModule(),
         REQUIRE_TASK_MANAGER_MODULE,
         new TaskManagerModule(),
         CASSANDRA_EVENT_STORE_JSON_SERIALIZATION_DEFAULT_MODULE
     );
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(ALL_BUT_JMX_CASSANDRA_MODULE, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, ALL_BUT_JMX_CASSANDRA_MODULE, new JMXServerModule());
     }
 
 }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
similarity index 95%
rename from server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
rename to server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
index e885e15..b4b3dca 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
@@ -26,7 +26,7 @@ import org.apache.james.blob.cassandra.CassandraBlobStore;
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
 
-public class CassandraBlobStoreDeclarationModule extends AbstractModule {
+public class CassandraBlobStoreModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(BlobStore.class)
diff --git a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
index cf02e66..345c725 100644
--- a/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
+++ b/server/container/guice/cassandra-ldap-guice/src/main/java/org/apache/james/CassandraLdapJamesServerMain.java
@@ -23,6 +23,7 @@ import static org.apache.james.CassandraJamesServerMain.ALL_BUT_JMX_CASSANDRA_MO
 
 import org.apache.james.data.LdapUsersRepositoryModule;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -33,7 +34,11 @@ public class CassandraLdapJamesServerMain implements JamesServerMain {
         .with(new LdapUsersRepositoryModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, MODULES, new JMXServerModule());
     }
 
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index bd5a425..d78ebaa 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -23,21 +23,40 @@ import static org.apache.james.CassandraJamesServerMain.REQUIRE_TASK_MANAGER_MOD
 
 import org.apache.james.modules.DistributedTaskManagerModule;
 import org.apache.james.modules.TaskSerializationModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.event.RabbitMQEventBusModule;
 import org.apache.james.modules.rabbitmq.RabbitMQModule;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
 public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
-    public static final Module MODULES =
+    protected static final Module MODULES =
         Modules
             .override(Modules.combine(REQUIRE_TASK_MANAGER_MODULE, new DistributedTaskManagerModule()))
-            .with(new RabbitMQModule(), new BlobStoreChoosingModule(), new RabbitMQEventBusModule(), new TaskSerializationModule());
+            .with(new RabbitMQModule(), new RabbitMQEventBusModule(), new TaskSerializationModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        BlobStoreConfiguration blobStoreConfiguration = BlobStoreConfiguration.parse(configuration);
+
+        Module baseModule = modules(blobStoreConfiguration);
+
+        JamesServerMain.main(configuration,
+            baseModule, new JMXServerModule());
+    }
+
+    public static Module modules(BlobStoreConfiguration blobStoreConfiguration) {
+        return Modules.combine(ImmutableList.<Module>builder()
+                .add(MODULES)
+                .addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
+                .build());
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
index 4e79e50..5b30d21 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingModule.java
@@ -21,24 +21,16 @@ package org.apache.james.modules.blobstore;
 
 import java.io.FileNotFoundException;
 
-import javax.inject.Named;
-import javax.inject.Provider;
 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.blob.api.BlobStore;
-import org.apache.james.blob.api.MetricableBlobStore;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
-import org.apache.james.blob.cassandra.CassandraBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
 import org.apache.james.blob.union.HybridBlobStore;
 import org.apache.james.modules.mailbox.ConfigurationComponent;
 import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
 import org.apache.james.utils.PropertiesProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.AbstractModule;
@@ -46,8 +38,6 @@ import com.google.inject.Provides;
 import com.google.inject.multibindings.Multibinder;
 
 public class BlobStoreChoosingModule extends AbstractModule {
-    private static final Logger LOGGER = LoggerFactory.getLogger(BlobStoreChoosingModule.class);
-
     @Override
     protected void configure() {
         install(new ObjectStorageDependenciesModule());
@@ -56,45 +46,6 @@ public class BlobStoreChoosingModule extends AbstractModule {
         cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
 
-    @VisibleForTesting
-    @Provides
-    @Singleton
-    BlobStoreChoosingConfiguration provideChoosingConfiguration(PropertiesProvider propertiesProvider) throws ConfigurationException {
-        try {
-            Configuration configuration = propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
-            return BlobStoreChoosingConfiguration.from(configuration);
-        } catch (FileNotFoundException e) {
-            LOGGER.warn("Could not find " + ConfigurationComponent.NAME + " configuration file, using cassandra blobstore as the default");
-            return BlobStoreChoosingConfiguration.cassandra();
-        }
-    }
-
-    @VisibleForTesting
-    @Provides
-    @Named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)
-    @Singleton
-    BlobStore provideBlobStore(BlobStoreChoosingConfiguration choosingConfiguration,
-                               Provider<CassandraBlobStore> cassandraBlobStoreProvider,
-                               Provider<ObjectStorageBlobStore> objectStorageBlobStoreProvider,
-                               HybridBlobStore.Configuration hybridBlobStoreConfiguration) {
-
-        switch (choosingConfiguration.getImplementation()) {
-            case OBJECTSTORAGE:
-                return objectStorageBlobStoreProvider.get();
-            case CASSANDRA:
-                return cassandraBlobStoreProvider.get();
-            case HYBRID:
-                return HybridBlobStore.builder()
-                    .lowCost(objectStorageBlobStoreProvider.get())
-                    .highPerformance(cassandraBlobStoreProvider.get())
-                    .configuration(hybridBlobStoreConfiguration)
-                    .build();
-            default:
-                throw new RuntimeException(String.format("can not get the right blobstore provider with configuration %s",
-                    choosingConfiguration.toString()));
-        }
-    }
-
     @Provides
     @Singleton
     @VisibleForTesting
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
similarity index 63%
rename from server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
index 84bc7fb..c7f2325 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfiguration.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreConfiguration.java
@@ -19,17 +19,25 @@
 
 package org.apache.james.modules.blobstore;
 
+import java.io.FileNotFoundException;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.apache.james.server.core.filesystem.FileSystemImpl;
+import org.apache.james.utils.PropertiesProvider;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.base.MoreObjects;
 
-public class BlobStoreChoosingConfiguration {
+public class BlobStoreConfiguration {
+    private static final Logger LOGGER = LoggerFactory.getLogger(BlobStoreConfiguration.class);
 
     public enum BlobStoreImplName {
         CASSANDRA("cassandra"),
@@ -63,7 +71,23 @@ public class BlobStoreChoosingConfiguration {
 
     static final String BLOBSTORE_IMPLEMENTATION_PROPERTY = "implementation";
 
-    static BlobStoreChoosingConfiguration from(Configuration configuration) {
+    public static BlobStoreConfiguration parse(org.apache.james.server.core.configuration.Configuration configuration) throws ConfigurationException {
+        PropertiesProvider propertiesProvider = new PropertiesProvider(new FileSystemImpl(configuration.directories()), configuration);
+
+        return parse(propertiesProvider);
+    }
+
+    public static BlobStoreConfiguration parse(PropertiesProvider propertiesProvider) throws ConfigurationException {
+        try {
+            Configuration configuration = propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
+            return BlobStoreConfiguration.from(configuration);
+        } catch (FileNotFoundException e) {
+            LOGGER.warn("Could not find " + ConfigurationComponent.NAME + " configuration file, using cassandra blobstore as the default");
+            return BlobStoreConfiguration.cassandra();
+        }
+    }
+
+    static BlobStoreConfiguration from(Configuration configuration) {
         BlobStoreImplName blobStoreImplName = Optional.ofNullable(configuration.getString(BLOBSTORE_IMPLEMENTATION_PROPERTY))
             .filter(StringUtils::isNotBlank)
             .map(StringUtils::trim)
@@ -71,25 +95,25 @@ public class BlobStoreChoosingConfiguration {
             .orElseThrow(() -> new IllegalStateException(String.format("%s property is missing please use one of " +
                 "supported values in: %s", BLOBSTORE_IMPLEMENTATION_PROPERTY, BlobStoreImplName.supportedImplNames())));
 
-        return new BlobStoreChoosingConfiguration(blobStoreImplName);
+        return new BlobStoreConfiguration(blobStoreImplName);
     }
 
-    public static BlobStoreChoosingConfiguration cassandra() {
-        return new BlobStoreChoosingConfiguration(BlobStoreImplName.CASSANDRA);
+    public static BlobStoreConfiguration cassandra() {
+        return new BlobStoreConfiguration(BlobStoreImplName.CASSANDRA);
     }
 
-    public static BlobStoreChoosingConfiguration objectStorage() {
-        return new BlobStoreChoosingConfiguration(BlobStoreImplName.OBJECTSTORAGE);
+    public static BlobStoreConfiguration objectStorage() {
+        return new BlobStoreConfiguration(BlobStoreImplName.OBJECTSTORAGE);
     }
 
-    public static BlobStoreChoosingConfiguration hybrid() {
-        return new BlobStoreChoosingConfiguration(BlobStoreImplName.HYBRID);
+    public static BlobStoreConfiguration hybrid() {
+        return new BlobStoreConfiguration(BlobStoreImplName.HYBRID);
     }
 
     private final BlobStoreImplName implementation;
 
-    BlobStoreChoosingConfiguration(BlobStoreImplName implementation) {
-        this.implementation = implementation;
+    BlobStoreConfiguration(BlobStoreImplName implementation) {
+       this.implementation = implementation;
     }
 
     BlobStoreImplName getImplementation() {
@@ -98,8 +122,8 @@ public class BlobStoreChoosingConfiguration {
 
     @Override
     public final boolean equals(Object o) {
-        if (o instanceof BlobStoreChoosingConfiguration) {
-            BlobStoreChoosingConfiguration that = (BlobStoreChoosingConfiguration) o;
+        if (o instanceof BlobStoreConfiguration) {
+            BlobStoreConfiguration that = (BlobStoreConfiguration) o;
 
             return Objects.equals(this.implementation, that.implementation);
         }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
new file mode 100644
index 0000000..f1cc709
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/blobstore/BlobStoreModulesChooser.java
@@ -0,0 +1,114 @@
+/****************************************************************
+ * 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.modules.blobstore;
+
+import java.io.FileNotFoundException;
+import java.util.List;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.james.blob.api.BlobStore;
+import org.apache.james.blob.api.MetricableBlobStore;
+import org.apache.james.blob.cassandra.CassandraBlobStore;
+import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
+import org.apache.james.blob.union.HybridBlobStore;
+import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.apache.james.modules.objectstorage.ObjectStorageDependenciesModule;
+import org.apache.james.utils.PropertiesProvider;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.inject.AbstractModule;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import com.google.inject.name.Names;
+
+public class BlobStoreModulesChooser {
+    static class CassandraDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new CassandraBlobStoreDependenciesModule());
+            bind(BlobStore.class)
+                .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(CassandraBlobStore.class);
+        }
+    }
+
+    static class ObjectStorageDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            bind(BlobStore.class)
+                .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
+                .to(ObjectStorageBlobStore.class);
+        }
+    }
+
+    static class HybridDeclarationModule extends AbstractModule {
+        @Override
+        protected void configure() {
+            install(new ObjectStorageDependenciesModule());
+            install(new CassandraBlobStoreDependenciesModule());
+        }
+
+        @Provides
+        @Singleton
+        @VisibleForTesting
+        HybridBlobStore.Configuration providesHybridBlobStoreConfiguration(PropertiesProvider propertiesProvider) {
+            try {
+                Configuration configuration = propertiesProvider.getConfigurations(ConfigurationComponent.NAMES);
+                return HybridBlobStore.Configuration.from(configuration);
+            } catch (FileNotFoundException | ConfigurationException e) {
+                return HybridBlobStore.Configuration.DEFAULT;
+            }
+        }
+
+        @Provides
+        @Named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION)
+        @Singleton
+        BlobStore providesHybridBlobStore(HybridBlobStore.Configuration hybridBlobStoreConfiguration,
+                                          CassandraBlobStore cassandraBlobStore,
+                                          ObjectStorageBlobStore objectStorageBlobStore) {
+            return HybridBlobStore.builder()
+                .lowCost(objectStorageBlobStore)
+                .highPerformance(cassandraBlobStore)
+                .configuration(hybridBlobStoreConfiguration)
+                .build();
+        }
+    }
+
+    @VisibleForTesting
+    public static List<Module> chooseModules(BlobStoreConfiguration choosingConfiguration) {
+        switch (choosingConfiguration.getImplementation()) {
+            case CASSANDRA:
+                return ImmutableList.of(new CassandraDeclarationModule());
+            case OBJECTSTORAGE:
+                return ImmutableList.of(new ObjectStorageDeclarationModule());
+            case HYBRID:
+                return ImmutableList.of(new HybridDeclarationModule());
+            default:
+                throw new RuntimeException("Unsuported blobStore implementation " + choosingConfiguration.getImplementation());
+        }
+    }
+}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
index 249f05b..59318aa 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQAwsS3JmapTestRule.java
@@ -27,7 +27,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.webadmin.WebAdminConfiguration;
@@ -68,11 +68,9 @@ public class CassandraRabbitMQAwsS3JmapTestRule implements TestRule {
             .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
-            .overrideWith(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestDockerESMetricReporterModule(dockerElasticSearchRule.getDockerEs().getHttpHost()))
             .overrideWith(guiceModuleTestRule.getModule())
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
index 4984f55..24cd328 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQJamesServerFixture.java
@@ -22,13 +22,14 @@ package org.apache.james;
 import org.apache.james.jmap.draft.JmapJamesServerContract;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 
 public class CassandraRabbitMQJamesServerFixture {
 
     private static final JamesServerBuilder.ServerProvider CONFIGURATION_BUILDER =
         configuration -> GuiceJamesServer
             .forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE);
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
index 8a0de82..75cde2b 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/CassandraRabbitMQSwiftJmapTestRule.java
@@ -27,7 +27,8 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
-import org.apache.james.modules.TestSwiftBlobStoreModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
@@ -66,10 +67,10 @@ public class CassandraRabbitMQSwiftJmapTestRule implements TestRule {
             .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))
-            .overrideWith(new TestSwiftBlobStoreModule())
+            .overrideWith(new DockerSwiftTestRule().getModule())
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestDockerESMetricReporterModule(dockerElasticSearchRule.getDockerEs().getHttpHost()))
             .overrideWith(guiceModuleTestRule.getModule())
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
index f5aa48f..dc992fd 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
@@ -24,9 +24,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.jmap.draft.JmapJamesServerContract;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
+import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
@@ -54,9 +55,9 @@ class RabbitMQJamesServerReprocessingTest {
     @RegisterExtension
     JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture
         .baseExtensionBuilder(rabbitMQExtension)
+        .extension(new AwsS3BlobStoreExtension())
         .server(configuration -> GuiceJamesServer
             .forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION))
             .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
index e44138e..da1a615 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerWithRetryConnectionTest.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.util.concurrent.NamedThreadFactory;
 import org.junit.jupiter.api.AfterEach;
@@ -43,6 +44,7 @@ class RabbitMQJamesServerWithRetryConnectionTest {
     @RegisterExtension
     JamesServerExtension jamesServerExtension = CassandraRabbitMQJamesServerFixture
         .baseExtensionBuilder(rabbitMQExtension)
+        .extension(new AwsS3BlobStoreExtension())
         .disableAutoStart()
         .build();
 
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
index 808c47e..0d996be 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/WithCassandraBlobStore.java
@@ -19,6 +19,10 @@
 
 package org.apache.james;
 
+import org.apache.james.jmap.draft.JmapJamesServerContract;
+import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
@@ -33,7 +37,16 @@ public class WithCassandraBlobStore implements BeforeAllCallback, AfterAllCallba
     private final JamesServerExtension jamesServerExtension;
 
     WithCassandraBlobStore() {
-        jamesServerExtension = CassandraRabbitMQJamesServerFixture.baseExtensionBuilder().build();
+        jamesServerExtension = new JamesServerBuilder()
+            .extension(new DockerElasticSearchExtension())
+            .extension(new CassandraExtension())
+            .extension(new RabbitMQExtension())
+            .server(configuration -> GuiceJamesServer
+                .forConfiguration(configuration)
+                .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.cassandra()))
+                .overrideWith(TestJMAPServerModule.limitToTenMessages())
+                .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE))
+            .build();
     }
 
     @Override
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
index 6d6ffaf..4b09ce6 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/AwsS3BlobStoreExtension.java
@@ -21,13 +21,11 @@ package org.apache.james.modules;
 
 import org.apache.james.GuiceModuleTestExtension;
 import org.apache.james.blob.objectstorage.DockerAwsS3Singleton;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 public class AwsS3BlobStoreExtension implements GuiceModuleTestExtension {
 
@@ -52,8 +50,6 @@ public class AwsS3BlobStoreExtension implements GuiceModuleTestExtension {
 
     @Override
     public Module getModule() {
-        return Modules.override(awsS3TestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
+        return awsS3TestRule.getModule();
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
index 2aee3f8..3d5fec1 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/SwiftBlobStoreExtension.java
@@ -20,13 +20,11 @@
 package org.apache.james.modules;
 
 import org.apache.james.GuiceModuleTestExtension;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
 import org.junit.jupiter.api.extension.ExtensionContext;
 
 import com.google.inject.Module;
-import com.google.inject.util.Modules;
 
 public class SwiftBlobStoreExtension implements GuiceModuleTestExtension {
 
@@ -52,8 +50,6 @@ public class SwiftBlobStoreExtension implements GuiceModuleTestExtension {
 
     @Override
     public Module getModule() {
-        return Modules.override(swiftRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
+        return swiftRule.getModule();
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
deleted file mode 100644
index ea9ae97..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestAwsS3BlobStoreModule.java
+++ /dev/null
@@ -1,47 +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.modules;
-
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
-import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.util.Modules;
-
-public class TestAwsS3BlobStoreModule extends AbstractModule {
-
-    private final DockerAwsS3TestRule dockerAwsS3TestRule;
-
-    public TestAwsS3BlobStoreModule(DockerAwsS3TestRule awsS3TestRule) {
-        this.dockerAwsS3TestRule = awsS3TestRule;
-    }
-
-    @Override
-    protected void configure() {
-        Module testAwsS3BlobStoreModule = Modules
-            .override(dockerAwsS3TestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                    .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
-
-        install(testAwsS3BlobStoreModule);
-    }
-}
-
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
deleted file mode 100644
index 4638109..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/TestSwiftBlobStoreModule.java
+++ /dev/null
@@ -1,46 +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.modules;
-
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
-import org.apache.james.modules.objectstorage.swift.DockerSwiftTestRule;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Module;
-import com.google.inject.util.Modules;
-
-public class TestSwiftBlobStoreModule extends AbstractModule {
-
-    private final DockerSwiftTestRule dockerSwiftTestRule;
-
-    public TestSwiftBlobStoreModule() {
-        this.dockerSwiftTestRule = new DockerSwiftTestRule();
-    }
-
-    @Override
-    protected void configure() {
-        Module testSwiftBlobStoreModule = Modules
-            .override(dockerSwiftTestRule.getModule())
-            .with(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()));
-
-        install(testSwiftBlobStoreModule);
-    }
-}
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
deleted file mode 100644
index 810cf50..0000000
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingModuleTest.java
+++ /dev/null
@@ -1,211 +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.modules.blobstore;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.mock;
-
-import org.apache.commons.configuration2.PropertiesConfiguration;
-import org.apache.james.FakePropertiesProvider;
-import org.apache.james.blob.cassandra.CassandraBlobStore;
-import org.apache.james.blob.objectstorage.ObjectStorageBlobStore;
-import org.apache.james.blob.union.HybridBlobStore;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration.BlobStoreImplName;
-import org.apache.james.modules.mailbox.ConfigurationComponent;
-import org.junit.jupiter.api.Test;
-
-import com.google.inject.Provider;
-
-class BlobStoreChoosingModuleTest {
-
-    private static CassandraBlobStore CASSANDRA_BLOBSTORE = mock(CassandraBlobStore.class);
-    private static Provider<CassandraBlobStore> CASSANDRA_BLOBSTORE_PROVIDER = () -> CASSANDRA_BLOBSTORE;
-    private static ObjectStorageBlobStore OBJECT_STORAGE_BLOBSTORE = mock(ObjectStorageBlobStore.class);
-    private static Provider<ObjectStorageBlobStore> OBJECT_STORAGE_BLOBSTORE_PROVIDER = () -> OBJECT_STORAGE_BLOBSTORE;
-
-    @Test
-    void provideChoosingConfigurationShouldThrowWhenMissingPropertyField() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "");
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalStateException.class);
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldThrowWhenEmptyPropertyField() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "");
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalStateException.class);
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldThrowWhenPropertyFieldIsNotInSupportedList() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", "gabouzomeuh");
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> module.provideChoosingConfiguration(propertyProvider))
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldReturnCassandraWhenNoFile() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register("other_configuration_file", new PropertiesConfiguration())
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.cassandra());
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldReturnObjectStorageFactoryWhenConfigurationImplIsObjectStorage() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", BlobStoreImplName.OBJECTSTORAGE.getName());
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.objectStorage());
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldReturnHybridConfigurationWhenConfigurationImplIsHybrid() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", BlobStoreImplName.HYBRID.getName());
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.hybrid());
-    }
-
-    @Test
-    void provideChoosingConfigurationShouldReturnCassandraFactoryWhenConfigurationImplIsCassandra() throws Exception {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("implementation", BlobStoreImplName.CASSANDRA.getName());
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.provideChoosingConfiguration(propertyProvider))
-            .isEqualTo(BlobStoreChoosingConfiguration.cassandra());
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldThrowWhenNegative() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", -1);
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThatThrownBy(() -> module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldNotThrowWhenZero() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 0);
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(0));
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldReturnConfiguration() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 36);
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.NAME, configuration)
-            .build();
-
-        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(36));
-    }
-
-    @Test
-    void providesHybridBlobStoreConfigurationShouldReturnConfigurationWhenLegacyFile() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-        PropertiesConfiguration configuration = new PropertiesConfiguration();
-        configuration.addProperty("hybrid.size.threshold", 36);
-        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
-            .register(ConfigurationComponent.LEGACY, configuration)
-            .build();
-
-        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
-            .isEqualTo(new HybridBlobStore.Configuration(36));
-    }
-
-    @Test
-    void provideBlobStoreShouldReturnCassandraBlobStoreWhenCassandraConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.cassandra(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, HybridBlobStore.Configuration.DEFAULT))
-            .isEqualTo(CASSANDRA_BLOBSTORE);
-    }
-
-    @Test
-    void provideBlobStoreShouldReturnObjectStoreBlobStoreWhenObjectStoreConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.cassandra(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, HybridBlobStore.Configuration.DEFAULT))
-            .isEqualTo(CASSANDRA_BLOBSTORE);
-    }
-
-    @Test
-    void provideBlobStoreShouldReturnHybridBlobStoreWhenHybridConfigured() {
-        BlobStoreChoosingModule module = new BlobStoreChoosingModule();
-
-        assertThat(module.provideBlobStore(BlobStoreChoosingConfiguration.hybrid(),
-            CASSANDRA_BLOBSTORE_PROVIDER, OBJECT_STORAGE_BLOBSTORE_PROVIDER, HybridBlobStore.Configuration.DEFAULT))
-            .isInstanceOf(HybridBlobStore.class);
-    }
-}
\ No newline at end of file
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
similarity index 52%
rename from server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java
rename to server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
index 2ef718d..0d65d03 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreChoosingConfigurationTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreConfigurationTest.java
@@ -19,15 +19,18 @@
 
 package org.apache.james.modules.blobstore;
 
+import static org.apache.james.modules.blobstore.BlobStoreConfiguration.parse;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.james.FakePropertiesProvider;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
-class BlobStoreChoosingConfigurationTest {
+class BlobStoreConfigurationTest {
 
     private static final String OBJECT_STORAGE = "objectstorage";
     private static final String CASSANDRA = "cassandra";
@@ -35,15 +38,98 @@ class BlobStoreChoosingConfigurationTest {
 
     @Test
     void shouldMatchBeanContract() {
-        EqualsVerifier.forClass(BlobStoreChoosingConfiguration.class)
+        EqualsVerifier.forClass(BlobStoreConfiguration.class)
             .verify();
     }
 
     @Test
+    void provideChoosingConfigurationShouldThrowWhenMissingPropertyField() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "");
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldThrowWhenEmptyPropertyField() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "");
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalStateException.class);
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldThrowWhenPropertyFieldIsNotInSupportedList() {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", "gabouzomeuh");
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> parse(propertyProvider))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldReturnCassandraWhenNoFile() throws Exception {
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register("other_configuration_file", new PropertiesConfiguration())
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.cassandra());
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldReturnObjectStorageFactoryWhenConfigurationImplIsObjectStorage() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", BlobStoreConfiguration.BlobStoreImplName.OBJECTSTORAGE.getName());
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.objectStorage());
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldReturnHybridConfigurationWhenConfigurationImplIsHybrid() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", BlobStoreConfiguration.BlobStoreImplName.HYBRID.getName());
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.hybrid());
+    }
+
+    @Test
+    void provideChoosingConfigurationShouldReturnCassandraFactoryWhenConfigurationImplIsCassandra() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("implementation", BlobStoreConfiguration.BlobStoreImplName.CASSANDRA.getName());
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(parse(propertyProvider))
+            .isEqualTo(BlobStoreConfiguration.cassandra());
+    }
+
+
+    @Test
     void fromShouldThrowWhenBlobStoreImplIsMissing() {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
 
-        assertThatThrownBy(() -> BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of supported values in: cassandra, objectstorage, hybrid");
     }
@@ -53,7 +139,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", null);
 
-        assertThatThrownBy(() -> BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of supported values in: cassandra, objectstorage, hybrid");
     }
@@ -63,7 +149,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", "");
 
-        assertThatThrownBy(() -> BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalStateException.class)
             .hasMessage("implementation property is missing please use one of supported values in: cassandra, objectstorage, hybrid");
     }
@@ -73,7 +159,7 @@ class BlobStoreChoosingConfigurationTest {
         PropertiesConfiguration configuration = new PropertiesConfiguration();
         configuration.addProperty("implementation", "un_supported");
 
-        assertThatThrownBy(() -> BlobStoreChoosingConfiguration.from(configuration))
+        assertThatThrownBy(() -> BlobStoreConfiguration.from(configuration))
             .isInstanceOf(IllegalArgumentException.class)
             .hasMessage("un_supported is not a valid name of BlobStores, please use one of supported values in: cassandra, objectstorage, hybrid");
     }
@@ -84,7 +170,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", CASSANDRA);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(CASSANDRA);
@@ -96,7 +182,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", HYBRID);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(HYBRID);
@@ -108,7 +194,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", OBJECT_STORAGE);
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(OBJECT_STORAGE);
@@ -120,7 +206,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", "OBjecTStorAGE");
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(OBJECT_STORAGE);
@@ -132,7 +218,7 @@ class BlobStoreChoosingConfigurationTest {
         configuration.addProperty("implementation", " cassandra ");
 
         assertThat(
-            BlobStoreChoosingConfiguration.from(configuration)
+            BlobStoreConfiguration.from(configuration)
                 .getImplementation()
                 .getName())
             .isEqualTo(CASSANDRA);
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java
new file mode 100644
index 0000000..d736aa8
--- /dev/null
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/modules/blobstore/BlobStoreModulesChooserTest.java
@@ -0,0 +1,105 @@
+/****************************************************************
+ * 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.modules.blobstore;
+
+import static org.apache.james.modules.blobstore.BlobStoreModulesChooser.HybridDeclarationModule;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.james.FakePropertiesProvider;
+import org.apache.james.blob.union.HybridBlobStore;
+import org.apache.james.modules.mailbox.ConfigurationComponent;
+import org.junit.jupiter.api.Test;
+
+class BlobStoreModulesChooserTest {
+    @Test
+    void providesHybridBlobStoreConfigurationShouldThrowWhenNegative() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", -1);
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThatThrownBy(() -> module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void providesHybridBlobStoreConfigurationShouldNotThrowWhenZero() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 0);
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(0));
+    }
+
+    @Test
+    void providesHybridBlobStoreConfigurationShouldReturnConfiguration() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 36);
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.NAME, configuration)
+            .build();
+
+        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(36));
+    }
+
+    @Test
+    void providesHybridBlobStoreConfigurationShouldReturnConfigurationWhenLegacyFile() {
+        HybridDeclarationModule module = new HybridDeclarationModule();
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.addProperty("hybrid.size.threshold", 36);
+        FakePropertiesProvider propertyProvider = FakePropertiesProvider.builder()
+            .register(ConfigurationComponent.LEGACY, configuration)
+            .build();
+
+        assertThat(module.providesHybridBlobStoreConfiguration(propertyProvider))
+            .isEqualTo(new HybridBlobStore.Configuration(36));
+    }
+
+    @Test
+    void provideBlobStoreShouldReturnObjectStoreBlobStoreWhenObjectStoreConfigured() {
+        assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.objectStorage()))
+            .first()
+            .isInstanceOf(BlobStoreModulesChooser.ObjectStorageDeclarationModule.class);
+    }
+
+    @Test
+    void provideBlobStoreShouldReturnCassandraBlobStoreWhenCassandraConfigured() {
+        assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.cassandra()))
+            .first()
+            .isInstanceOf(BlobStoreModulesChooser.CassandraDeclarationModule.class);
+    }
+
+    @Test
+    void provideBlobStoreShouldReturnHybridBlobStoreWhenHybridConfigured() {
+        assertThat(BlobStoreModulesChooser.chooseModules(BlobStoreConfiguration.hybrid()))
+            .first()
+            .isInstanceOf(BlobStoreModulesChooser.HybridDeclarationModule.class);
+    }
+}
\ No newline at end of file
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
index 0988842..212d639 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/main/java/org/apache/james/CassandraRabbitMQLdapJamesServerMain.java
@@ -20,8 +20,12 @@
 package org.apache.james;
 
 import org.apache.james.data.LdapUsersRepositoryModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreModulesChooser;
 import org.apache.james.modules.server.JMXServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
+import com.google.common.collect.ImmutableList;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -31,6 +35,21 @@ public class CassandraRabbitMQLdapJamesServerMain implements JamesServerMain {
         .with(new LdapUsersRepositoryModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(MODULES, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        BlobStoreConfiguration blobStoreConfiguration = BlobStoreConfiguration.parse(configuration);
+
+        Module baseModule = baseModule(blobStoreConfiguration);
+        JamesServerMain.main(configuration,
+            baseModule, new JMXServerModule());
+    }
+
+    public static Module baseModule(BlobStoreConfiguration blobStoreConfiguration) {
+        return Modules.combine(ImmutableList.<Module>builder()
+            .add(MODULES)
+            .addAll(BlobStoreModulesChooser.chooseModules(blobStoreConfiguration))
+            .build());
     }
 }
diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
index 307795e..df6cc67 100644
--- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
+++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java
@@ -32,7 +32,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.SwiftBlobStoreExtension;
 import org.apache.james.modules.TestJMAPServerModule;
-import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
@@ -57,10 +57,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithSwift implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
+        JamesServerExtension testExtension = baseJamesServerExtensionBuilder(BlobStoreConfiguration.objectStorage())
             .extension(new SwiftBlobStoreExtension())
-            .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .build();
     }
 
@@ -68,10 +66,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithAwsS3 implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
+        JamesServerExtension testExtension = baseJamesServerExtensionBuilder(BlobStoreConfiguration.objectStorage())
             .extension(new AwsS3BlobStoreExtension())
-            .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.objectStorage()))
             .build();
     }
 
@@ -79,20 +75,18 @@ class CassandraRabbitMQLdapJmapJamesServerTest {
     @TestInstance(TestInstance.Lifecycle.PER_CLASS)
     class WithoutSwiftOrAwsS3 implements ContractSuite {
         @RegisterExtension
-        JamesServerExtension testExtension = baseJamesServerExtensionBuilder()
-            .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class)
-                .toInstance(BlobStoreChoosingConfiguration.cassandra()))
+        JamesServerExtension testExtension = baseJamesServerExtensionBuilder(BlobStoreConfiguration.cassandra())
             .build();
     }
 
-    JamesServerBuilder baseJamesServerExtensionBuilder() {
+    JamesServerBuilder baseJamesServerExtensionBuilder(BlobStoreConfiguration blobStoreConfiguration) {
         return new JamesServerBuilder()
             .extension(new DockerElasticSearchExtension())
             .extension(new CassandraExtension())
             .extension(new RabbitMQExtension())
             .extension(new LdapTestExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQLdapJamesServerMain.MODULES)
+                .combineWith(CassandraRabbitMQLdapJamesServerMain.baseModule(blobStoreConfiguration))
                 .overrideWith(new TestJMAPServerModule())
                 .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE));
     }
diff --git a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
index 357b380..c9d3ffb 100644
--- a/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
+++ b/server/container/guice/guice-common/src/main/java/org/apache/james/JamesServerMain.java
@@ -24,15 +24,11 @@ import org.apache.james.server.core.configuration.Configuration;
 import com.google.inject.Module;
 
 public interface JamesServerMain {
-    static void main(Module... modules) throws Exception {
-        Configuration configuration = Configuration.builder()
-            .useWorkingDirectoryEnvProperty()
-            .build();
-
+    static void main(Configuration configuration, Module... modules) throws Exception {
         GuiceJamesServer server = GuiceJamesServer.forConfiguration(configuration)
             .combineWith(modules);
         server.start();
-        
+
         Runtime.getRuntime().addShutdownHook(new Thread(server::stop));
     }
 }
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
index 19ba467..f497a41 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -49,6 +49,7 @@ import org.apache.james.modules.server.SwaggerRoutesModule;
 import org.apache.james.modules.server.TaskManagerModule;
 import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -94,7 +95,11 @@ public class JPAJamesServerMain implements JamesServerMain {
     public static final Module JPA_MODULE_AGGREGATE = Modules.combine(JPA_SERVER_MODULE, PROTOCOLS);
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(JPA_MODULE_AGGREGATE, new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, JPA_MODULE_AGGREGATE, new JMXServerModule());
     }
 
 }
diff --git a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
index d6b137f..ea629b2 100644
--- a/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
+++ b/server/container/guice/jpa-smtp-common/src/main/java/org/apache/james/JPAJamesServerMain.java
@@ -34,6 +34,7 @@ import org.apache.james.modules.server.NoJwtModule;
 import org.apache.james.modules.server.RawPostDequeueDecoratorModule;
 import org.apache.james.modules.server.TaskManagerModule;
 import org.apache.james.modules.server.WebAdminServerModule;
+import org.apache.james.server.core.configuration.Configuration;
 
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
@@ -59,7 +60,11 @@ public class JPAJamesServerMain implements JamesServerMain {
         new ElasticSearchMetricReporterModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(JPA_SERVER_MODULE,  PROTOCOLS, new DKIMMailetModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration, JPA_SERVER_MODULE,  PROTOCOLS, new DKIMMailetModule());
     }
 
 }
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
index 9a19fae..05c6649 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/MemoryJamesServerMain.java
@@ -56,6 +56,7 @@ import org.apache.james.modules.server.WebAdminServerModule;
 import org.apache.james.modules.spamassassin.SpamAssassinListenerModule;
 import org.apache.james.modules.vault.DeletedMessageVaultModule;
 import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
+import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.webadmin.WebAdminConfiguration;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.NoAuthenticationFilter;
@@ -133,7 +134,14 @@ public class MemoryJamesServerMain implements JamesServerMain {
         new DKIMMailetModule());
 
     public static void main(String[] args) throws Exception {
-        JamesServerMain.main(IN_MEMORY_SERVER_AGGREGATE_MODULE, new FakeSearchMailboxModule(), new JMXServerModule());
+        Configuration configuration = Configuration.builder()
+            .useWorkingDirectoryEnvProperty()
+            .build();
+
+        JamesServerMain.main(configuration,
+                IN_MEMORY_SERVER_AGGREGATE_MODULE,
+                new FakeSearchMailboxModule(),
+                new JMXServerModule());
     }
 
 }
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
index f0a5270..e9e07d9 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SendMDNMethodTest.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 public class RabbitMQAwsS3SendMDNMethodTest extends SendMDNMethodTest {
@@ -44,7 +45,7 @@ public class RabbitMQAwsS3SendMDNMethodTest extends SendMDNMethodTest {
             .extension(new AwsS3BlobStoreExtension())
             .extension(new RabbitMQExtension())
             .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+                .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new TestJMAPServerModule()))
             .build();
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
index dad433b..9add76d 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/RabbitMQAwsS3SpamAssassinContractTest.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 class RabbitMQAwsS3SpamAssassinContractTest implements SpamAssassinContract {
@@ -44,7 +45,7 @@ class RabbitMQAwsS3SpamAssassinContractTest implements SpamAssassinContract {
         .extension(new AwsS3BlobStoreExtension())
         .extension(spamAssassinExtension)
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule()))
         .build();
diff --git a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
index 972dea2..e26ced9 100644
--- a/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
+++ b/server/protocols/jmap-draft-integration-testing/rabbitmq-jmap-draft-integration-testing/src/test/java/org/apache/james/jmap/rabbitmq/cucumber/awss3/RabbitMQAwsS3Stepdefs.java
@@ -39,6 +39,7 @@ import org.apache.james.modules.DockerRabbitMQRule;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.CassandraTruncateTableTask;
 import org.apache.james.server.core.configuration.Configuration;
@@ -83,7 +84,7 @@ public class RabbitMQAwsS3Stepdefs {
                 .build();
 
         mainStepdefs.jmapServer = GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(new TestJMAPServerModule())
                 .overrideWith(new TestDockerESMetricReporterModule(elasticSearch.getDockerEs().getHttpHost()))
                 .overrideWith(new TestRabbitMQModule(rabbitMQServer.dockerRabbitMQ()))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
index e37753b..c7f6bf6 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/ConsistencyTasksIntegrationTest.java
@@ -56,14 +56,15 @@ import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.QuotaProbesImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.protocols.ImapGuiceProbe;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.GuiceProbe;
-import org.apache.james.utils.TestIMAPClient;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;
+import org.apache.james.utils.TestIMAPClient;
 import org.apache.james.utils.WebAdminGuiceProbe;
 import org.apache.james.webadmin.WebAdminUtils;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -127,7 +128,7 @@ class ConsistencyTasksIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule())
             // Enforce a single eventBus retry. Required as Current Quotas are handled by the eventBus.
             .overrideWith(binder -> binder.bind(RetryBackoffConfiguration.class)
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
index 6a81213..2f4beb1 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/FixingGhostMailboxTest.java
@@ -70,6 +70,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.server.CassandraProbe;
 import org.apache.james.task.TaskManager;
 import org.apache.james.util.Port;
@@ -114,7 +115,7 @@ class FixingGhostMailboxTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
index d054d55..db84cb2 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQAuthorizedEndpointsTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.AuthorizedEndpointsTest;
 import org.apache.james.webadmin.integration.UnauthorizedModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
@@ -44,7 +45,7 @@ class RabbitMQAuthorizedEndpointsTest extends AuthorizedEndpointsTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new UnauthorizedModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
index 671be90..16aeca7 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQEventDeadLettersIntegrationTest.java
@@ -57,6 +57,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.james.utils.WebAdminGuiceProbe;
@@ -205,7 +206,7 @@ class RabbitMQEventDeadLettersIntegrationTest {
         .extension(RABBIT_MQ_EXTENSION)
         .extension(new RetryEventsListenerExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule())
             .overrideWith(binder -> binder.bind(RetryBackoffConfiguration.class)
                 .toInstance(RetryBackoffConfiguration.builder()
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
index 918eea9..4010e06 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQFastViewProjectionHealthCheckIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.FastViewProjectionHealthCheckIntegrationContract;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -41,7 +42,7 @@ class RabbitMQFastViewProjectionHealthCheckIntegrationTest extends FastViewProje
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
index 1e1217a..dfa93ad 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQForwardIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.ForwardIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.junit.jupiter.api.extension.RegisterExtension;
@@ -41,7 +42,7 @@ class RabbitMQForwardIntegrationTest extends ForwardIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
index a6d8467..57ac262 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJmapExtension.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.extractor.TextExtractor;
 import org.apache.james.mailbox.store.search.PDFTextExtractor;
 import org.apache.james.modules.TestDockerESMetricReporterModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.aws.s3.DockerAwsS3TestRule;
 import org.apache.james.server.core.configuration.Configuration;
 import org.apache.james.util.FunctionalUtils;
@@ -153,7 +154,7 @@ public class RabbitMQJmapExtension implements BeforeAllCallback, AfterAllCallbac
                 .build();
 
         return GuiceJamesServer.forConfiguration(configuration)
-                .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
                 .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
                 .overrideWith(new TestDockerESMetricReporterModule(elasticSearchRule.getDockerEs().getHttpHost()))
                 .overrideWith(cassandra.getModule())
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
index d59f99b..62a3267 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQJwtFilterIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.jwt.JwtConfiguration;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.authentication.AuthenticationFilter;
 import org.apache.james.webadmin.authentication.JwtFilter;
 import org.apache.james.webadmin.integration.JwtFilterIntegrationTest;
@@ -43,7 +44,7 @@ class RabbitMQJwtFilterIntegrationTest extends JwtFilterIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> binder.bind(AuthenticationFilter.class).to(JwtFilter.class))
             .overrideWith(binder -> binder.bind(JwtConfiguration.class).toInstance(jwtConfiguration()))
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
index 2dbf39a..0693461 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQReindexingWithEventDeadLettersTest.java
@@ -46,6 +46,7 @@ import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.objectstorage.PayloadCodecFactory;
 import org.apache.james.util.Port;
 import org.apache.james.utils.DataProbeImpl;
@@ -81,7 +82,7 @@ class RabbitMQReindexingWithEventDeadLettersTest {
 
     private static final JamesServerBuilder.ServerProvider CONFIGURATION_BUILDER = configuration -> GuiceJamesServer
         .forConfiguration(configuration)
-        .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+        .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
         .overrideWith(new TestJMAPServerModule())
         .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE)
         .overrideWith(new WebadminIntegrationTestModule());
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
index c107aa6..69578e6 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerIntegrationTest.java
@@ -39,6 +39,7 @@ import org.apache.james.backends.cassandra.versions.CassandraSchemaVersionManage
 import org.apache.james.junit.categories.BasicFeature;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.webadmin.integration.WebAdminServerIntegrationTest;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.apache.james.webadmin.routes.AliasRoutes;
@@ -64,7 +65,7 @@ class RabbitMQWebAdminServerIntegrationTest extends WebAdminServerIntegrationTes
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
index 124c4dd..bfbf653f 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
@@ -68,6 +68,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.EventDeadLettersProbe;
 import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.modules.RabbitMQExtension;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.task.TaskManager;
 import org.apache.james.utils.DataProbeImpl;
@@ -102,7 +103,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
         .extension(new AwsS3BlobStoreExtension())
         .extension(new RabbitMQExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new WebadminIntegrationTestModule()))
         .build();
 
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
index 7315009..e0f3d67 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
@@ -28,6 +28,7 @@ import org.apache.james.JamesServerExtension;
 import org.apache.james.modules.AwsS3BlobStoreExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.apache.james.webadmin.integration.vault.DeletedMessageVaultIntegrationTest;
@@ -45,7 +46,7 @@ class RabbitMQDeletedMessageVaultIntegrationTest extends DeletedMessageVaultInte
         .extension(new RabbitMQExtension())
         .extension(new ClockExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestDeleteMessageVaultPreDeletionHookModule())
             .overrideWith(new WebadminIntegrationTestModule()))
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
index 4ef4f8b..179d642 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQLinshareBlobExportMechanismIntegrationTest.java
@@ -33,6 +33,7 @@ import org.apache.james.modules.LinshareGuiceExtension;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
 import org.apache.james.modules.TestRabbitMQModule;
+import org.apache.james.modules.blobstore.BlobStoreConfiguration;
 import org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
 import org.apache.james.webadmin.integration.WebadminIntegrationTestModule;
 import org.apache.james.webadmin.integration.vault.LinshareBlobExportMechanismIntegrationTest;
@@ -47,7 +48,7 @@ class RabbitMQLinshareBlobExportMechanismIntegrationTest extends LinshareBlobExp
         .extension(new AwsS3BlobStoreExtension())
         .extension(new LinshareGuiceExtension())
         .server(configuration -> GuiceJamesServer.forConfiguration(configuration)
-            .combineWith(CassandraRabbitMQJamesServerMain.MODULES)
+            .combineWith(CassandraRabbitMQJamesServerMain.modules(BlobStoreConfiguration.objectStorage()))
             .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))
             .overrideWith(new TestJMAPServerModule())
             .overrideWith(new TestRabbitMQModule(DockerRabbitMQSingleton.SINGLETON))


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


[james-project] 01/11: JAMES-3140 Avoid a module override for CassandraBlobStore

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 38bd8e9d908c73cf754f6fb0b2f6c17b54269536
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Apr 23 15:00:05 2020 +0700

    JAMES-3140 Avoid a module override for CassandraBlobStore
    
    The "conbine" semantic for configuration enabled modules is safer (thus
    should be used) but then we can no longer override repvious declaration.
    A better organisation then need to be setted up.
    
    We need to split Cassandra Blob store dependency module from the actual
    declaration.
---
 .../james/mpt/smtp/CassandraSmtpTestRuleFactory.java |  2 ++
 .../org/apache/james/CassandraJamesServerMain.java   |  6 ++++--
 ...java => CassandraBlobStoreDeclarationModule.java} | 20 +-------------------
 ...ava => CassandraBlobStoreDependenciesModule.java} |  8 +-------
 .../james/RabbitMQJamesServerReprocessingTest.java   |  1 +
 5 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
index 98cb9c4..dfec67e 100644
--- a/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
+++ b/mpt/impl/smtp/cassandra/src/test/java/org/apache/james/mpt/smtp/CassandraSmtpTestRuleFactory.java
@@ -24,6 +24,7 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.backends.cassandra.DockerCassandra;
 import org.apache.james.backends.cassandra.init.configuration.ClusterConfiguration;
 import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
 import org.apache.james.modules.mailbox.KeyspacesConfiguration;
 import org.apache.james.modules.protocols.SmtpGuiceProbe.SmtpServerConnectedType;
 import org.apache.james.modules.server.CamelMailetContainerModule;
@@ -48,6 +49,7 @@ public final class CassandraSmtpTestRuleFactory {
 
         return GuiceJamesServer.forConfiguration(configuration)
             .combineWith(CassandraJamesServerMain.CASSANDRA_SERVER_CORE_MODULE,
+                new CassandraBlobStoreDeclarationModule(),
                 SmtpTestRule.SMTP_PROTOCOL_MODULE,
                 binder -> binder.bind(MailQueueItemDecoratorFactory.class).to(RawMailQueueItemDecoratorFactory.class),
                 binder -> binder.bind(CamelMailetContainerModule.DefaultProcessorsConfigurationSupplier.class)
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
index bc01ba1..440828e 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -35,7 +35,8 @@ import org.apache.james.modules.data.CassandraSieveRepositoryModule;
 import org.apache.james.modules.data.CassandraUsersRepositoryModule;
 import org.apache.james.modules.eventstore.CassandraEventStoreModule;
 import org.apache.james.modules.mailbox.BlobStoreAPIModule;
-import org.apache.james.modules.mailbox.CassandraBlobStoreModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreDeclarationModule;
+import org.apache.james.modules.mailbox.CassandraBlobStoreDependenciesModule;
 import org.apache.james.modules.mailbox.CassandraDeletedMessageVaultModule;
 import org.apache.james.modules.mailbox.CassandraMailboxModule;
 import org.apache.james.modules.mailbox.CassandraQuotaMailingModule;
@@ -123,12 +124,12 @@ public class CassandraJamesServerMain implements JamesServerMain {
 
     public static final Module CASSANDRA_SERVER_CORE_MODULE = Modules.combine(
         new ActiveMQQueueModule(),
+        new CassandraBlobStoreDependenciesModule(),
         new CassandraDomainListModule(),
         new CassandraDLPConfigurationStoreModule(),
         new CassandraEventStoreModule(),
         new CassandraMailRepositoryModule(),
         new CassandraMetricsModule(),
-        new CassandraBlobStoreModule(),
         new CassandraRecipientRewriteTableModule(),
         new CassandraSessionModule(),
         new CassandraSieveRepositoryModule(),
@@ -154,6 +155,7 @@ public class CassandraJamesServerMain implements JamesServerMain {
         new DKIMMailetModule());
 
     public static Module ALL_BUT_JMX_CASSANDRA_MODULE = Modules.combine(
+        new CassandraBlobStoreDeclarationModule(),
         REQUIRE_TASK_MANAGER_MODULE,
         new TaskManagerModule(),
         CASSANDRA_EVENT_STORE_JSON_SERIALIZATION_DEFAULT_MODULE
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
similarity index 62%
copy from server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
copy to server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
index 97f5eb6..e885e15 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDeclarationModule.java
@@ -19,36 +19,18 @@
 
 package org.apache.james.modules.mailbox;
 
-import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.blob.api.BlobStore;
-import org.apache.james.blob.api.BucketName;
 import org.apache.james.blob.api.MetricableBlobStore;
-import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
-import org.apache.james.blob.cassandra.CassandraDefaultBucketDAO;
-import org.apache.james.blob.cassandra.CassandraDumbBlobStore;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
-public class CassandraBlobStoreModule extends AbstractModule {
+public class CassandraBlobStoreDeclarationModule extends AbstractModule {
     @Override
     protected void configure() {
-        bind(CassandraDefaultBucketDAO.class).in(Scopes.SINGLETON);
-        bind(CassandraBlobStore.class).in(Scopes.SINGLETON);
-        bind(CassandraDumbBlobStore.class).in(Scopes.SINGLETON);
-
-        bind(BucketName.class)
-            .annotatedWith(Names.named(CassandraDumbBlobStore.DEFAULT_BUCKET))
-            .toInstance(BucketName.DEFAULT);
-
         bind(BlobStore.class)
             .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
             .to(CassandraBlobStore.class);
-
-        Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
-        cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
 }
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
similarity index 88%
rename from server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
rename to server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
index 97f5eb6..ea5b1a7 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraBlobStoreDependenciesModule.java
@@ -20,9 +20,7 @@
 package org.apache.james.modules.mailbox;
 
 import org.apache.james.backends.cassandra.components.CassandraModule;
-import org.apache.james.blob.api.BlobStore;
 import org.apache.james.blob.api.BucketName;
-import org.apache.james.blob.api.MetricableBlobStore;
 import org.apache.james.blob.cassandra.CassandraBlobModule;
 import org.apache.james.blob.cassandra.CassandraBlobStore;
 import org.apache.james.blob.cassandra.CassandraDefaultBucketDAO;
@@ -33,7 +31,7 @@ import com.google.inject.Scopes;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.name.Names;
 
-public class CassandraBlobStoreModule extends AbstractModule {
+public class CassandraBlobStoreDependenciesModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(CassandraDefaultBucketDAO.class).in(Scopes.SINGLETON);
@@ -44,10 +42,6 @@ public class CassandraBlobStoreModule extends AbstractModule {
             .annotatedWith(Names.named(CassandraDumbBlobStore.DEFAULT_BUCKET))
             .toInstance(BucketName.DEFAULT);
 
-        bind(BlobStore.class)
-            .annotatedWith(Names.named(MetricableBlobStore.BLOB_STORE_IMPLEMENTATION))
-            .to(CassandraBlobStore.class);
-
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
         cassandraDataDefinitions.addBinding().toInstance(CassandraBlobModule.MODULE);
     }
diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
index 59c3ab8..f5aa48f 100644
--- a/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
+++ b/server/container/guice/cassandra-rabbitmq-guice/src/test/java/org/apache/james/RabbitMQJamesServerReprocessingTest.java
@@ -26,6 +26,7 @@ import org.apache.james.jmap.draft.JmapJamesServerContract;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
 import org.apache.james.modules.RabbitMQExtension;
 import org.apache.james.modules.TestJMAPServerModule;
+import org.apache.james.modules.blobstore.BlobStoreChoosingModule;
 import org.apache.james.modules.protocols.SmtpGuiceProbe;
 import org.apache.james.utils.MailRepositoryProbeImpl;
 import org.apache.james.utils.SMTPMessageSender;


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