This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch postgresql in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 27c5402889eb7636d70d4e047397b914a255b2c8 Author: Benoit TELLIER <[email protected]> AuthorDate: Tue Dec 12 11:22:37 2023 +0100 JAMES-2586 Implement PostgresMailRepositoryUrlStore --- .../james/modules/data/PostgresDataModule.java | 2 +- ...dule.java => PostgresMailRepositoryModule.java} | 14 +++-- .../postgres/PostgresMailRepositoryModule.java} | 32 +++++++---- .../postgres/PostgresMailRepositoryUrlStore.java | 66 ++++++++++++++++++++++ .../PostgresMailRepositoryUrlStoreExtension.java} | 36 +++++++++--- .../PostgresMailRepositoryUrlStoreTest.java} | 6 +- 6 files changed, 129 insertions(+), 27 deletions(-) diff --git a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java index 905f346249..e6860792b6 100644 --- a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java +++ b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java @@ -29,6 +29,6 @@ public class PostgresDataModule extends AbstractModule { install(new CoreDataModule()); install(new PostgresDomainListModule()); install(new PostgresRecipientRewriteTableModule()); - install(new JPAMailRepositoryModule()); + install(new PostgresMailRepositoryModule()); } } diff --git a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresMailRepositoryModule.java similarity index 79% rename from server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java rename to server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresMailRepositoryModule.java index bb6a0ffedb..b0c3369815 100644 --- a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/JPAMailRepositoryModule.java +++ b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresMailRepositoryModule.java @@ -20,26 +20,26 @@ package org.apache.james.modules.data; import org.apache.commons.configuration2.BaseHierarchicalConfiguration; +import org.apache.james.backends.postgres.PostgresModule; 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 org.apache.james.mailrepository.postgres.PostgresMailRepositoryUrlStore; 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 { - +public class PostgresMailRepositoryModule extends AbstractModule { @Override protected void configure() { - bind(JPAMailRepositoryUrlStore.class).in(Scopes.SINGLETON); + bind(PostgresMailRepositoryUrlStore.class).in(Scopes.SINGLETON); - bind(MailRepositoryUrlStore.class).to(JPAMailRepositoryUrlStore.class); + bind(MailRepositoryUrlStore.class).to(PostgresMailRepositoryUrlStore.class); bind(MailRepositoryStoreConfiguration.Item.class) .toProvider(() -> new MailRepositoryStoreConfiguration.Item( @@ -48,6 +48,8 @@ public class JPAMailRepositoryModule extends AbstractModule { new BaseHierarchicalConfiguration())); Multibinder.newSetBinder(binder(), MailRepositoryFactory.class) - .addBinding().to(JPAMailRepositoryFactory.class); + .addBinding().to(JPAMailRepositoryFactory.class); + Multibinder.newSetBinder(binder(), PostgresModule.class) + .addBinding().toInstance(org.apache.james.mailrepository.postgres.PostgresMailRepositoryModule.MODULE); } } diff --git a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryModule.java similarity index 56% copy from server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java copy to server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryModule.java index 905f346249..2bfafd5284 100644 --- a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresDataModule.java +++ b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryModule.java @@ -17,18 +17,30 @@ * under the License. * ****************************************************************/ -package org.apache.james.modules.data; +package org.apache.james.mailrepository.postgres; -import org.apache.james.CoreDataModule; +import org.apache.james.backends.postgres.PostgresModule; +import org.apache.james.backends.postgres.PostgresTable; +import org.jooq.Field; +import org.jooq.Record; +import org.jooq.Table; +import org.jooq.impl.DSL; +import org.jooq.impl.SQLDataType; -import com.google.inject.AbstractModule; +public interface PostgresMailRepositoryModule { + interface PostgresMailRepositoryUrlTable { + Table<Record> TABLE_NAME = DSL.table("mail_repository_url"); -public class PostgresDataModule extends AbstractModule { - @Override - protected void configure() { - install(new CoreDataModule()); - install(new PostgresDomainListModule()); - install(new PostgresRecipientRewriteTableModule()); - install(new JPAMailRepositoryModule()); + Field<String> URL = DSL.field("url", SQLDataType.VARCHAR(255).notNull()); + + PostgresTable TABLE = PostgresTable.name(TABLE_NAME.getName()) + .createTableStep(((dsl, tableName) -> dsl.createTableIfNotExists(tableName) + .column(URL) + .primaryKey(URL))) + .disableRowLevelSecurity(); } + + PostgresModule MODULE = PostgresModule.builder() + .addTable(PostgresMailRepositoryUrlTable.TABLE) + .build(); } diff --git a/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStore.java b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStore.java new file mode 100644 index 0000000000..c032db14a1 --- /dev/null +++ b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStore.java @@ -0,0 +1,66 @@ +/**************************************************************** + * 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.mailrepository.postgres; + +import static org.apache.james.backends.postgres.utils.PostgresExecutor.DEFAULT_INJECT; +import static org.apache.james.mailrepository.postgres.PostgresMailRepositoryModule.PostgresMailRepositoryUrlTable.TABLE_NAME; +import static org.apache.james.mailrepository.postgres.PostgresMailRepositoryModule.PostgresMailRepositoryUrlTable.URL; + +import java.util.stream.Stream; + +import javax.inject.Inject; +import javax.inject.Named; + +import org.apache.james.backends.postgres.utils.PostgresExecutor; +import org.apache.james.backends.postgres.utils.PostgresUtils; +import org.apache.james.mailrepository.api.MailRepositoryUrl; +import org.apache.james.mailrepository.api.MailRepositoryUrlStore; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class PostgresMailRepositoryUrlStore implements MailRepositoryUrlStore { + private final PostgresExecutor postgresExecutor; + + @Inject + public PostgresMailRepositoryUrlStore(@Named(DEFAULT_INJECT) PostgresExecutor postgresExecutor) { + this.postgresExecutor = postgresExecutor; + } + + @Override + public void add(MailRepositoryUrl url) { + postgresExecutor.executeVoid(context -> Mono.from(context.insertInto(TABLE_NAME, URL) + .values(url.asString()))) + .onErrorResume(PostgresUtils.UNIQUE_CONSTRAINT_VIOLATION_PREDICATE, e -> Mono.empty()) + .block(); + } + + @Override + public Stream<MailRepositoryUrl> listDistinct() { + return postgresExecutor.executeRows(context -> Flux.from(context.selectFrom(TABLE_NAME))) + .map(record -> MailRepositoryUrl.from(record.get(URL))) + .toStream(); + } + + @Override + public boolean contains(MailRepositoryUrl url) { + return listDistinct().anyMatch(url::equals); + } +} diff --git a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreExtension.java b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreExtension.java similarity index 60% rename from server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreExtension.java rename to server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreExtension.java index c8af2008d1..5f56caf099 100644 --- a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreExtension.java +++ b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreExtension.java @@ -17,23 +17,45 @@ * under the License. * ****************************************************************/ -package org.apache.james.mailrepository.jpa; +package org.apache.james.mailrepository.postgres; -import org.apache.james.backends.jpa.JpaTestCluster; +import org.apache.james.backends.postgres.PostgresExtension; +import org.apache.james.backends.postgres.PostgresModule; import org.apache.james.mailrepository.api.MailRepositoryUrlStore; -import org.apache.james.mailrepository.jpa.model.JPAUrl; +import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; import org.junit.jupiter.api.extension.ParameterResolver; -public class JPAMailRepositoryUrlStoreExtension implements ParameterResolver, AfterEachCallback { - private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAUrl.class); +public class PostgresMailRepositoryUrlStoreExtension implements ParameterResolver, AfterEachCallback, AfterAllCallback, BeforeEachCallback, BeforeAllCallback { + private final PostgresExtension postgresExtension; + + public PostgresMailRepositoryUrlStoreExtension() { + postgresExtension = PostgresExtension.withoutRowLevelSecurity(PostgresModule.aggregateModules(PostgresMailRepositoryModule.MODULE)); + } @Override public void afterEach(ExtensionContext context) { - JPA_TEST_CLUSTER.clear("JAMES_MAIL_REPOS"); + postgresExtension.afterEach(context); + } + + @Override + public void afterAll(ExtensionContext extensionContext) throws Exception { + postgresExtension.afterAll(extensionContext); + } + + @Override + public void beforeAll(ExtensionContext extensionContext) throws Exception { + postgresExtension.beforeAll(extensionContext); + } + + @Override + public void beforeEach(ExtensionContext extensionContext) throws Exception { + postgresExtension.beforeEach(extensionContext); } @Override @@ -43,6 +65,6 @@ public class JPAMailRepositoryUrlStoreExtension implements ParameterResolver, Af @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - return new JPAMailRepositoryUrlStore(JPA_TEST_CLUSTER.getEntityManagerFactory()); + return new PostgresMailRepositoryUrlStore(postgresExtension.getPostgresExecutor()); } } diff --git a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreTest.java b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreTest.java similarity index 86% rename from server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreTest.java rename to server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreTest.java index ed8b69316a..ea4f034aa1 100644 --- a/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreTest.java +++ b/server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreTest.java @@ -17,12 +17,12 @@ * under the License. * ****************************************************************/ -package org.apache.james.mailrepository.jpa; +package org.apache.james.mailrepository.postgres; import org.apache.james.mailrepository.MailRepositoryUrlStoreContract; import org.junit.jupiter.api.extension.ExtendWith; -@ExtendWith(JPAMailRepositoryUrlStoreExtension.class) -public class JPAMailRepositoryUrlStoreTest implements MailRepositoryUrlStoreContract { +@ExtendWith(PostgresMailRepositoryUrlStoreExtension.class) +public class PostgresMailRepositoryUrlStoreTest implements MailRepositoryUrlStoreContract { } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
