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 bae65fd98246206a6c1c116b28f8c0c605bf4320 Author: Jean Helou <[email protected]> AuthorDate: Sun Oct 16 12:35:27 2022 +0200 [JAMES-3836] implements guice bindings for JPAMailRepository --- .../modules/data/JPAMailRepositoryModule.java | 6 +++ .../mailrepository/jpa/JPAMailRepository.java | 9 +++++ .../jpa/JPAMailRepositoryFactory.java} | 45 ++++++++++++---------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java b/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java index 99ac66dce7..bb6a0ffedb 100644 --- a/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java +++ b/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java @@ -20,15 +20,18 @@ package org.apache.james.modules.data; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; +import org.apache.james.mailrepository.api.MailRepositoryFactory; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; import org.apache.james.mailrepository.api.Protocol; import org.apache.james.mailrepository.jpa.JPAMailRepository; +import org.apache.james.mailrepository.jpa.JPAMailRepositoryFactory; import org.apache.james.mailrepository.jpa.JPAMailRepositoryUrlStore; import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; import com.google.common.collect.ImmutableList; import com.google.inject.AbstractModule; import com.google.inject.Scopes; +import com.google.inject.multibindings.Multibinder; public class JPAMailRepositoryModule extends AbstractModule { @@ -43,5 +46,8 @@ public class JPAMailRepositoryModule extends AbstractModule { ImmutableList.of(new Protocol("jpa")), JPAMailRepository.class.getName(), new BaseHierarchicalConfiguration())); + + Multibinder.newSetBinder(binder(), MailRepositoryFactory.class) + .addBinding().to(JPAMailRepositoryFactory.class); } } diff --git a/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepository.java b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepository.java index 702b661e6f..575592e441 100644 --- a/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepository.java +++ b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepository.java @@ -87,6 +87,15 @@ public class JPAMailRepository implements MailRepository, Configurable, Initiali this.entityManagerFactory = entityManagerFactory; } + public JPAMailRepository(EntityManagerFactory entityManagerFactory, MailRepositoryUrl url) throws ConfigurationException { + this.entityManagerFactory = entityManagerFactory; + this.repositoryName = url.getPath().asString(); + if (repositoryName.isEmpty()) { + throw new ConfigurationException( + "Malformed destinationURL - Must be of the format 'jpa://<repositoryName>'. Was passed " + url); + } + } + public String getRepositoryName() { return repositoryName; } diff --git a/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryFactory.java similarity index 50% copy from server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java copy to server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryFactory.java index 99ac66dce7..09bb004ef8 100644 --- a/server/container/guice/jpa-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java +++ b/server/data/data-jpa/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryFactory.java @@ -17,31 +17,36 @@ * under the License. * ****************************************************************/ -package org.apache.james.modules.data; +package org.apache.james.mailrepository.jpa; -import org.apache.commons.configuration2.BaseHierarchicalConfiguration; -import org.apache.james.mailrepository.api.MailRepositoryUrlStore; -import org.apache.james.mailrepository.api.Protocol; -import org.apache.james.mailrepository.jpa.JPAMailRepository; -import org.apache.james.mailrepository.jpa.JPAMailRepositoryUrlStore; -import org.apache.james.mailrepository.memory.MailRepositoryStoreConfiguration; +import javax.inject.Inject; +import javax.persistence.EntityManagerFactory; -import com.google.common.collect.ImmutableList; -import com.google.inject.AbstractModule; -import com.google.inject.Scopes; +import org.apache.james.mailrepository.api.MailRepository; +import org.apache.james.mailrepository.api.MailRepositoryFactory; +import org.apache.james.mailrepository.api.MailRepositoryUrl; -public class JPAMailRepositoryModule extends AbstractModule { +import com.github.fge.lambdas.Throwing; - @Override - protected void configure() { - bind(JPAMailRepositoryUrlStore.class).in(Scopes.SINGLETON); +public class JPAMailRepositoryFactory implements MailRepositoryFactory { + private final EntityManagerFactory entityManagerFactory; + + @Inject + public JPAMailRepositoryFactory(EntityManagerFactory entityManagerFactory) { + this.entityManagerFactory = entityManagerFactory; + } - bind(MailRepositoryUrlStore.class).to(JPAMailRepositoryUrlStore.class); + @Override + public Class<? extends MailRepository> mailRepositoryClass() { + return JPAMailRepository.class; + } - bind(MailRepositoryStoreConfiguration.Item.class) - .toProvider(() -> new MailRepositoryStoreConfiguration.Item( - ImmutableList.of(new Protocol("jpa")), - JPAMailRepository.class.getName(), - new BaseHierarchicalConfiguration())); + @Override + public MailRepository create(MailRepositoryUrl url) { + // Injecting the url here is redundant since the class is also a + // Configurable and the mail repository store will call #configure() + // with the same effect. However, this paves the way to drop the + // Configurable aspect in the future. + return Throwing.supplier(() -> new JPAMailRepository(entityManagerFactory, url)).sneakyThrow().get(); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
