You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by jh...@apache.org on 2022/10/16 10:59:09 UTC
[james-project] 04/06: [JAMES-3836] Extracts both mail repository loaders to their own module
This is an automated email from the ASF dual-hosted git repository.
jhelou pushed a commit to branch james-3836-improved-mailrepository-loading
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit f31f40e8bdc2225de42831042ccc660ea77c35e8
Author: Jean Helou <jh...@codamens.fr>
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 | 67 ++++++++++++++++++++++
.../guice}/GuiceMailRepositoryLoader.java | 2 +-
.../guice/MultiBoundGuiceRepositoryLoader.java} | 40 ++++++-------
server/container/guice/pom.xml | 6 ++
6 files changed, 97 insertions(+), 23 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..0f542905d1
--- /dev/null
+++ b/server/container/guice/mailrepository-loaders/pom.xml
@@ -0,0 +1,67 @@
+<?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-core</artifactId>-->
+<!-- </dependency>-->
+ <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..81188d1815 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.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;
+import org.apache.james.mailrepository.api.MailRepositoryLoader;
+import org.apache.james.mailrepository.api.MailRepositoryFactory;
-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.fqdn().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: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org