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]
