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]

Reply via email to