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

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

commit 074179edc11dddc5dcec29887c40c6a35c532a11
Author: Jean Helou <[email protected]>
AuthorDate: Wed Oct 5 22:22:17 2022 +0200

    [JAMES-3836] Extracts both mail repository loaders to their own module
    
    GuiceMailRepositoryLoader is the original implementation which creates a 
loader with a fake module to inject the url before requesting the instanciation 
of the MailRepository
    MultiBoundGuiceRepositoryLoader retrieves a multi binder (aka a Set) of 
MailRepositoryFactories, maps them into a dictionnary of factories indexed by 
the instanciated type and delegates the actual instance creation to the 
factories. This way there is no need to bind a method parameter in a subcontext 
only to make the container do the injection :)
---
 server/container/guice/common/pom.xml              |  4 ++
 .../modules/server/MailStoreRepositoryModule.java  |  1 +
 .../container/guice/mailrepository-loaders/pom.xml | 63 ++++++++++++++++++++++
 .../guice}/GuiceMailRepositoryLoader.java          |  2 +-
 .../guice/MultiBoundGuiceRepositoryLoader.java}    | 38 ++++++-------
 server/container/guice/pom.xml                     |  6 +++
 6 files changed, 92 insertions(+), 22 deletions(-)

diff --git a/server/container/guice/common/pom.xml 
b/server/container/guice/common/pom.xml
index 4fdc239c7e..5ff507c48b 100644
--- a/server/container/guice/common/pom.xml
+++ b/server/container/guice/common/pom.xml
@@ -128,6 +128,10 @@
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>mailrepository-loaders</artifactId>
+        </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
             <artifactId>metrics-api</artifactId>
diff --git 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java
 
b/server/container/guice/common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java
index cd9fbf9eed..edaded632b 100644
--- 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java
+++ 
b/server/container/guice/common/src/main/java/org/apache/james/modules/server/MailStoreRepositoryModule.java
@@ -28,6 +28,7 @@ import 
org.apache.james.mailrepository.api.MailRepositoryLoader;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration;
 import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore;
+import org.apache.james.modules.mailrepository.guice.GuiceMailRepositoryLoader;
 import org.apache.james.server.core.configuration.ConfigurationProvider;
 import org.apache.james.utils.GuiceProbe;
 import org.apache.james.utils.InitializationOperation;
diff --git a/server/container/guice/mailrepository-loaders/pom.xml 
b/server/container/guice/mailrepository-loaders/pom.xml
new file mode 100644
index 0000000000..7cb1d30506
--- /dev/null
+++ b/server/container/guice/mailrepository-loaders/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.james</groupId>
+        <artifactId>james-server-guice</artifactId>
+        <version>3.8.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>mailrepository-loaders</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Apache James :: Server :: MailRepository :: Blobstore / Guice 
Loaders</name>
+    <description>Guice module to load Blobstore implementations of 
'mailrepository' interfaces</description>
+
+    <properties>
+        <cassandra.includes>empty</cassandra.includes>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-guice-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-mailrepository-api</artifactId>
+        </dependency>
+        <dependency>
+            <!-- Added because of 
https://issues.apache.org/jira/browse/SUREFIRE-1266 -->
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-testing</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.inject</groupId>
+            <artifactId>guice</artifactId>
+        </dependency>
+    </dependencies>
+
+
+</project>
diff --git 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
 
b/server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/GuiceMailRepositoryLoader.java
similarity index 97%
copy from 
server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
copy to 
server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/GuiceMailRepositoryLoader.java
index e2feffb5f1..cb97452191 100644
--- 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
+++ 
b/server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/GuiceMailRepositoryLoader.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.modules.server;
+package org.apache.james.modules.mailrepository.guice;
 
 import org.apache.james.mailrepository.api.MailRepository;
 import org.apache.james.mailrepository.api.MailRepositoryLoader;
diff --git 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
 
b/server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/MultiBoundGuiceRepositoryLoader.java
similarity index 59%
rename from 
server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
rename to 
server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/MultiBoundGuiceRepositoryLoader.java
index e2feffb5f1..b3bb08b619 100644
--- 
a/server/container/guice/common/src/main/java/org/apache/james/modules/server/GuiceMailRepositoryLoader.java
+++ 
b/server/container/guice/mailrepository-loaders/src/main/java/org/apache/james/modules/mailrepository/guice/MultiBoundGuiceRepositoryLoader.java
@@ -17,37 +17,33 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.modules.server;
+package org.apache.james.modules.mailrepository.guice;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import javax.inject.Inject;
 
 import org.apache.james.mailrepository.api.MailRepository;
+import org.apache.james.mailrepository.api.MailRepositoryFactory;
 import org.apache.james.mailrepository.api.MailRepositoryLoader;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.mailrepository.api.MailRepositoryUrl;
-import org.apache.james.utils.ClassName;
-import org.apache.james.utils.GuiceGenericLoader;
 
-import com.google.inject.Inject;
-import com.google.inject.Module;
-
-public class GuiceMailRepositoryLoader implements MailRepositoryLoader {
-    private final GuiceGenericLoader genericLoader;
+public class MultiBoundGuiceRepositoryLoader implements MailRepositoryLoader {
+    private final Map<String, Function<MailRepositoryUrl, MailRepository>> 
factoriesByType;
 
     @Inject
-    public GuiceMailRepositoryLoader(GuiceGenericLoader genericLoader) {
-        this.genericLoader = genericLoader;
+    private MultiBoundGuiceRepositoryLoader(Set<MailRepositoryFactory> 
factories) {
+        factoriesByType = factories.stream().collect(Collectors.toMap(factory 
-> factory.mailRepositoryClass().getName(), it -> it::create));
     }
 
-    @Override
     public MailRepository load(String fullyQualifiedClassName, 
MailRepositoryUrl url) throws MailRepositoryStore.MailRepositoryStoreException {
-        try {
-            Module urlModule = binder -> 
binder.bind(MailRepositoryUrl.class).toInstance(url);
-
-            return genericLoader.<MailRepository>withChildModule(urlModule)
-                .instantiate(new ClassName(fullyQualifiedClassName));
-        } catch (ClassNotFoundException e) {
-            throw new 
MailRepositoryStore.UnsupportedRepositoryStoreException("No Mail Repository 
found with class name " + fullyQualifiedClassName);
-        } catch (ClassCastException e) {
-            throw new 
MailRepositoryStore.MailRepositoryStoreException(fullyQualifiedClassName + " is 
not a MailRepository");
-        }
+        return 
Optional.ofNullable(factoriesByType.get(fullyQualifiedClassName))
+                .map(factory -> factory.apply(url))
+                .orElseThrow(() -> new 
MailRepositoryStore.MailRepositoryStoreException("no factory for " + 
fullyQualifiedClassName));
     }
 }
diff --git a/server/container/guice/pom.xml b/server/container/guice/pom.xml
index 64261ba2d5..885f086ad6 100644
--- a/server/container/guice/pom.xml
+++ b/server/container/guice/pom.xml
@@ -51,6 +51,7 @@
         <module>mailbox-plugin-deleted-messages-vault</module>
         <module>mailet</module>
         <module>mailrepository-cassandra</module>
+        <module>mailrepository-loaders</module>
         <module>memory</module>
         <module>onami</module>
         <module>opensearch</module>
@@ -254,6 +255,11 @@
                 <artifactId>mailrepository-cassandra</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
+                <artifactId>mailrepository-loaders</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>${james.groupId}</groupId>
                 <artifactId>queue-activemq-guice</artifactId>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to