You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2023/12/14 07:48:18 UTC
(james-project) branch postgresql updated (decec6ffc5 -> 9132406cb6)
This is an automated email from the ASF dual-hosted git repository.
rcordier pushed a change to branch postgresql
in repository https://gitbox.apache.org/repos/asf/james-project.git
from decec6ffc5 JAMES-2586 PostgresDelegationStore (#1851)
new 107465410d JAMES-2586 Remove JPAHealthCheck.java
new 27c5402889 JAMES-2586 Implement PostgresMailRepositoryUrlStore
new 6e6e0d05fe JAMES-2586 Remove JPAMailRepositoryUrlStore.java
new 9132406cb6 JAMES-2586 Implement and bind PostgresHealthCheck
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../postgres/utils/PostgresHealthCheck.java | 24 ++++----
.../james/backends/postgres/PostgresExtension.java | 12 ++++
.../postgres/utils/PostgresHealthCheckTest.java | 44 +++++++++++----
.../src/main/resources/META-INF/persistence.xml | 1 -
.../james/modules/data/PostgresCommonModule.java | 5 ++
.../james/modules/data/PostgresDataModule.java | 2 +-
...dule.java => PostgresMailRepositoryModule.java} | 14 +++--
.../james/jpa/healthcheck/JPAHealthCheck.java | 64 ---------------------
.../james/mailrepository/jpa/model/JPAUrl.java | 65 ----------------------
.../postgres/PostgresMailRepositoryModule.java} | 16 +++---
.../PostgresMailRepositoryUrlStore.java} | 45 +++++++--------
.../james/jpa/healthcheck/JPAHealthCheckTest.java | 62 ---------------------
.../jpa/JPAMailRepositoryUrlStoreExtension.java | 48 ----------------
.../PostgresMailRepositoryUrlStoreExtension.java | 45 +++++----------
.../PostgresMailRepositoryUrlStoreTest.java} | 6 +-
.../src/test/resources/persistence.xml | 1 -
16 files changed, 117 insertions(+), 337 deletions(-)
copy third-party/rspamd/src/main/java/org/apache/james/rspamd/healthcheck/RspamdHealthCheck.java => backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresHealthCheck.java (71%)
copy mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresCurrentQuotaManagerTest.java => backends-common/postgres/src/test/java/org/apache/james/backends/postgres/utils/PostgresHealthCheckTest.java (57%)
rename server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/{JPAMailRepositoryModule.java => PostgresMailRepositoryModule.java} (79%)
delete mode 100644 server/data/data-postgres/src/main/java/org/apache/james/jpa/healthcheck/JPAHealthCheck.java
delete mode 100644 server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/model/JPAUrl.java
copy server/data/data-postgres/src/main/java/org/apache/james/{domainlist/postgres/PostgresDomainModule.java => mailrepository/postgres/PostgresMailRepositoryModule.java} (80%)
rename server/data/data-postgres/src/main/java/org/apache/james/mailrepository/{jpa/JPAMailRepositoryUrlStore.java => postgres/PostgresMailRepositoryUrlStore.java} (53%)
delete mode 100644 server/data/data-postgres/src/test/java/org/apache/james/jpa/healthcheck/JPAHealthCheckTest.java
delete mode 100644 server/data/data-postgres/src/test/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStoreExtension.java
copy mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystemExtension.java => server/data/data-postgres/src/test/java/org/apache/james/mailrepository/postgres/PostgresMailRepositoryUrlStoreExtension.java (68%)
rename server/data/data-postgres/src/test/java/org/apache/james/mailrepository/{jpa/JPAMailRepositoryUrlStoreTest.java => postgres/PostgresMailRepositoryUrlStoreTest.java} (86%)
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org
(james-project) 02/04: JAMES-2586 Implement PostgresMailRepositoryUrlStore
Posted by rc...@apache.org.
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 <bt...@linagora.com>
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: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org
(james-project) 01/04: JAMES-2586 Remove JPAHealthCheck.java
Posted by rc...@apache.org.
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 107465410daf28848b1545fe766b155326178ef6
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Tue Dec 12 11:22:18 2023 +0100
JAMES-2586 Remove JPAHealthCheck.java
---
.../james/jpa/healthcheck/JPAHealthCheck.java | 64 ----------------------
.../james/jpa/healthcheck/JPAHealthCheckTest.java | 62 ---------------------
2 files changed, 126 deletions(-)
diff --git a/server/data/data-postgres/src/main/java/org/apache/james/jpa/healthcheck/JPAHealthCheck.java b/server/data/data-postgres/src/main/java/org/apache/james/jpa/healthcheck/JPAHealthCheck.java
deleted file mode 100644
index 7dbea33e7f..0000000000
--- a/server/data/data-postgres/src/main/java/org/apache/james/jpa/healthcheck/JPAHealthCheck.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************
- * 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.jpa.healthcheck;
-
-import static org.apache.james.core.healthcheck.Result.healthy;
-import static org.apache.james.core.healthcheck.Result.unhealthy;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.james.backends.jpa.EntityManagerUtils;
-import org.apache.james.core.healthcheck.ComponentName;
-import org.apache.james.core.healthcheck.HealthCheck;
-import org.apache.james.core.healthcheck.Result;
-
-import reactor.core.publisher.Mono;
-import reactor.core.scheduler.Schedulers;
-
-public class JPAHealthCheck implements HealthCheck {
-
- private final EntityManagerFactory entityManagerFactory;
-
- @Inject
- public JPAHealthCheck(EntityManagerFactory entityManagerFactory) {
- this.entityManagerFactory = entityManagerFactory;
- }
-
- @Override
- public ComponentName componentName() {
- return new ComponentName("JPA Backend");
- }
-
- @Override
- public Mono<Result> check() {
- return Mono.usingWhen(Mono.fromCallable(entityManagerFactory::createEntityManager).subscribeOn(Schedulers.boundedElastic()),
- entityManager -> {
- if (entityManager.isOpen()) {
- return Mono.just(healthy(componentName()));
- } else {
- return Mono.just(unhealthy(componentName(), "entityManager is not open"));
- }
- },
- entityManager -> Mono.fromRunnable(() -> EntityManagerUtils.safelyClose(entityManager)).subscribeOn(Schedulers.boundedElastic()))
- .onErrorResume(IllegalStateException.class,
- e -> Mono.just(unhealthy(componentName(), "EntityManagerFactory or EntityManager thrown an IllegalStateException, the connection is unhealthy", e)))
- .onErrorResume(e -> Mono.just(unhealthy(componentName(), "Unexpected exception upon checking JPA driver", e)));
- }
-}
diff --git a/server/data/data-postgres/src/test/java/org/apache/james/jpa/healthcheck/JPAHealthCheckTest.java b/server/data/data-postgres/src/test/java/org/apache/james/jpa/healthcheck/JPAHealthCheckTest.java
deleted file mode 100644
index 20ed1bbaa2..0000000000
--- a/server/data/data-postgres/src/test/java/org/apache/james/jpa/healthcheck/JPAHealthCheckTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/****************************************************************
- * 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.jpa.healthcheck;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.fail;
-
-import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.core.healthcheck.Result;
-import org.apache.james.core.healthcheck.ResultStatus;
-import org.apache.james.mailrepository.jpa.model.JPAUrl;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-class JPAHealthCheckTest {
- JPAHealthCheck jpaHealthCheck;
- JpaTestCluster jpaTestCluster;
-
- @BeforeEach
- void setUp() {
- jpaTestCluster = JpaTestCluster.create(JPAUrl.class);
- jpaHealthCheck = new JPAHealthCheck(jpaTestCluster.getEntityManagerFactory());
- }
-
- @Test
- void testWhenActive() {
- Result result = jpaHealthCheck.check().block();
- ResultStatus healthy = ResultStatus.HEALTHY;
- assertThat(result.getStatus()).as("Result %s status should be %s", result.getStatus(), healthy)
- .isEqualTo(healthy);
- }
-
- @Test
- void testWhenInactive() {
- jpaTestCluster.getEntityManagerFactory().close();
- Result result = Result.healthy(jpaHealthCheck.componentName());
- try {
- result = jpaHealthCheck.check().block();
- } catch (IllegalStateException e) {
- fail("The exception of the EMF was not handled property.ยช");
- }
- ResultStatus unhealthy = ResultStatus.UNHEALTHY;
- assertThat(result.getStatus()).as("Result %s status should be %s", result.getStatus(), unhealthy)
- .isEqualTo(unhealthy);
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org
(james-project) 03/04: JAMES-2586 Remove JPAMailRepositoryUrlStore.java
Posted by rc...@apache.org.
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 6e6e0d05fedf4e0cf25152710f4bfd834b327564
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Tue Dec 12 11:22:49 2023 +0100
JAMES-2586 Remove JPAMailRepositoryUrlStore.java
---
.../src/main/resources/META-INF/persistence.xml | 1 -
.../jpa/JPAMailRepositoryUrlStore.java | 65 ----------------------
.../james/mailrepository/jpa/model/JPAUrl.java | 65 ----------------------
.../src/test/resources/persistence.xml | 1 -
4 files changed, 132 deletions(-)
diff --git a/server/apps/postgres-app/src/main/resources/META-INF/persistence.xml b/server/apps/postgres-app/src/main/resources/META-INF/persistence.xml
index 489b1e81d7..a5837560c7 100644
--- a/server/apps/postgres-app/src/main/resources/META-INF/persistence.xml
+++ b/server/apps/postgres-app/src/main/resources/META-INF/persistence.xml
@@ -24,7 +24,6 @@
version="2.0">
<persistence-unit name="Global" transaction-type="RESOURCE_LOCAL">
- <class>org.apache.james.mailrepository.jpa.model.JPAUrl</class>
<class>org.apache.james.mailrepository.jpa.model.JPAMail</class>
<class>org.apache.james.sieve.postgres.model.JPASieveScript</class>
diff --git a/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
deleted file mode 100644
index 1f448a9eca..0000000000
--- a/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/JPAMailRepositoryUrlStore.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * 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.jpa;
-
-import java.util.stream.Stream;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.james.backends.jpa.TransactionRunner;
-import org.apache.james.mailrepository.api.MailRepositoryUrl;
-import org.apache.james.mailrepository.api.MailRepositoryUrlStore;
-import org.apache.james.mailrepository.jpa.model.JPAUrl;
-
-public class JPAMailRepositoryUrlStore implements MailRepositoryUrlStore {
- private final TransactionRunner transactionRunner;
-
- @Inject
- public JPAMailRepositoryUrlStore(EntityManagerFactory entityManagerFactory) {
- this.transactionRunner = new TransactionRunner(entityManagerFactory);
- }
-
- @Override
- public void add(MailRepositoryUrl url) {
- transactionRunner.run(entityManager ->
- entityManager.merge(JPAUrl.from(url)));
- }
-
- @Override
- public Stream<MailRepositoryUrl> listDistinct() {
- return transactionRunner.runAndRetrieveResult(entityManager ->
- entityManager
- .createNamedQuery("listUrls", JPAUrl.class)
- .getResultList()
- .stream()
- .map(JPAUrl::toMailRepositoryUrl));
- }
-
- @Override
- public boolean contains(MailRepositoryUrl url) {
- return transactionRunner.runAndRetrieveResult(entityManager ->
- ! entityManager.createNamedQuery("getUrl", JPAUrl.class)
- .setParameter("value", url.asString())
- .getResultList()
- .isEmpty());
- }
-}
-
diff --git a/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/model/JPAUrl.java b/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/model/JPAUrl.java
deleted file mode 100644
index 9f8e74c69c..0000000000
--- a/server/data/data-postgres/src/main/java/org/apache/james/mailrepository/jpa/model/JPAUrl.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/****************************************************************
- * 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.jpa.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-
-import org.apache.james.mailrepository.api.MailRepositoryUrl;
-
-@Entity(name = "JamesMailRepos")
-@Table(name = "JAMES_MAIL_REPOS")
-@NamedQueries({
- @NamedQuery(name = "listUrls", query = "SELECT url FROM JamesMailRepos url"),
- @NamedQuery(name = "getUrl", query = "SELECT url FROM JamesMailRepos url WHERE url.value=:value")})
-public class JPAUrl {
- public static JPAUrl from(MailRepositoryUrl url) {
- return new JPAUrl(url.asString());
- }
-
- @Id
- @Column(name = "MAIL_REPO_NAME", nullable = false)
- private String value;
-
- /**
- * Default no-args constructor for JPA class enhancement.
- * The constructor need to be public or protected to be used by JPA.
- * See: http://docs.oracle.com/javaee/6/tutorial/doc/bnbqa.html
- * Do not us this constructor, it is for JPA only.
- */
- protected JPAUrl() {
- }
-
- public JPAUrl(String value) {
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
-
- public MailRepositoryUrl toMailRepositoryUrl() {
- return MailRepositoryUrl.from(value);
- }
-}
diff --git a/server/data/data-postgres/src/test/resources/persistence.xml b/server/data/data-postgres/src/test/resources/persistence.xml
index 6ac35df9a4..4ba4447800 100644
--- a/server/data/data-postgres/src/test/resources/persistence.xml
+++ b/server/data/data-postgres/src/test/resources/persistence.xml
@@ -26,7 +26,6 @@
<persistence-unit name="James" transaction-type="JTA">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/james)</jta-data-source>
- <class>org.apache.james.mailrepository.jpa.model.JPAUrl</class>
<class>org.apache.james.mailrepository.jpa.model.JPAMail</class>
<class>org.apache.james.sieve.postgres.model.JPASieveScript</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org
(james-project) 04/04: JAMES-2586 Implement and bind PostgresHealthCheck
Posted by rc...@apache.org.
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 9132406cb6c74501f3e9313b08c6cab0280ce1db
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Tue Dec 12 11:53:37 2023 +0100
JAMES-2586 Implement and bind PostgresHealthCheck
---
.../postgres/utils/PostgresHealthCheck.java | 55 ++++++++++++++++++
.../james/backends/postgres/PostgresExtension.java | 12 ++++
.../postgres/utils/PostgresHealthCheckTest.java | 66 ++++++++++++++++++++++
.../james/modules/data/PostgresCommonModule.java | 5 ++
4 files changed, 138 insertions(+)
diff --git a/backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresHealthCheck.java b/backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresHealthCheck.java
new file mode 100644
index 0000000000..40262bd88e
--- /dev/null
+++ b/backends-common/postgres/src/main/java/org/apache/james/backends/postgres/utils/PostgresHealthCheck.java
@@ -0,0 +1,55 @@
+/****************************************************************
+ * 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.backends.postgres.utils;
+
+import java.time.Duration;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.healthcheck.ComponentName;
+import org.apache.james.core.healthcheck.HealthCheck;
+import org.apache.james.core.healthcheck.Result;
+import org.jooq.impl.DSL;
+import org.reactivestreams.Publisher;
+
+import reactor.core.publisher.Mono;
+
+public class PostgresHealthCheck implements HealthCheck {
+ public static final ComponentName COMPONENT_NAME = new ComponentName("Postgres");
+ private final PostgresExecutor postgresExecutor;
+
+ @Inject
+ public PostgresHealthCheck(PostgresExecutor postgresExecutor) {
+ this.postgresExecutor = postgresExecutor;
+ }
+
+ @Override
+ public ComponentName componentName() {
+ return COMPONENT_NAME;
+ }
+
+ @Override
+ public Publisher<Result> check() {
+ return postgresExecutor.executeRow(context -> Mono.from(context.select(DSL.now())))
+ .timeout(Duration.ofSeconds(5))
+ .map(any -> Result.healthy(COMPONENT_NAME))
+ .onErrorResume(e -> Mono.just(Result.unhealthy(COMPONENT_NAME, "Failed to execute request against postgres", e)));
+ }
+}
diff --git a/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtension.java b/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtension.java
index 126cc722b1..e332b9474d 100644
--- a/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtension.java
+++ b/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/PostgresExtension.java
@@ -35,6 +35,8 @@ import org.apache.james.backends.postgres.utils.SinglePostgresConnectionFactory;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.testcontainers.containers.PostgreSQLContainer;
+import com.github.dockerjava.api.command.PauseContainerCmd;
+import com.github.dockerjava.api.command.UnpauseContainerCmd;
import com.github.fge.lambdas.Throwing;
import com.google.inject.Module;
import com.google.inject.util.Modules;
@@ -69,6 +71,16 @@ public class PostgresExtension implements GuiceModuleTestExtension {
private PostgresqlConnectionFactory connectionFactory;
private PostgresExecutor.Factory executorFactory;
+ public void pause() {
+ PG_CONTAINER.getDockerClient().pauseContainerCmd(PG_CONTAINER.getContainerId())
+ .exec();
+ }
+
+ public void unpause() {
+ PG_CONTAINER.getDockerClient().unpauseContainerCmd(PG_CONTAINER.getContainerId())
+ .exec();
+ }
+
private PostgresExtension(PostgresModule postgresModule, boolean rlsEnabled) {
this.postgresModule = postgresModule;
this.rlsEnabled = rlsEnabled;
diff --git a/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/utils/PostgresHealthCheckTest.java b/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/utils/PostgresHealthCheckTest.java
new file mode 100644
index 0000000000..e380920b5f
--- /dev/null
+++ b/backends-common/postgres/src/test/java/org/apache/james/backends/postgres/utils/PostgresHealthCheckTest.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.backends.postgres.utils;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.backends.postgres.PostgresExtension;
+import org.apache.james.backends.postgres.quota.PostgresQuotaLimitDAO;
+import org.apache.james.backends.postgres.quota.PostgresQuotaModule;
+import org.apache.james.core.healthcheck.Result;
+import org.apache.james.core.healthcheck.ResultStatus;
+import org.apache.james.core.quota.QuotaComponent;
+import org.apache.james.core.quota.QuotaLimit;
+import org.apache.james.core.quota.QuotaScope;
+import org.apache.james.core.quota.QuotaType;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import reactor.core.publisher.Mono;
+
+public class PostgresHealthCheckTest {
+ private PostgresHealthCheck testee;
+
+ @RegisterExtension
+ static PostgresExtension postgresExtension = PostgresExtension.withoutRowLevelSecurity(PostgresQuotaModule.MODULE);
+
+ @BeforeEach
+ void setup() {
+ testee = new PostgresHealthCheck(postgresExtension.getPostgresExecutor());
+ }
+
+ @Test
+ void shouldBeHealthy() {
+ Result result = Mono.from(testee.check()).block();
+ assertThat(result.getStatus()).isEqualTo(ResultStatus.HEALTHY);
+ }
+
+ @Test
+ void shouldBeUnhealthyWhenPaused() {
+ try {
+ postgresExtension.pause();
+ Result result = Mono.from(testee.check()).block();
+ assertThat(result.getStatus()).isEqualTo(ResultStatus.UNHEALTHY);
+ } finally {
+ postgresExtension.unpause();
+ }
+ }
+}
\ No newline at end of file
diff --git a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresCommonModule.java b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresCommonModule.java
index 82366095ae..53e98144d1 100644
--- a/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresCommonModule.java
+++ b/server/container/guice/postgres-common/src/main/java/org/apache/james/modules/data/PostgresCommonModule.java
@@ -30,7 +30,9 @@ import org.apache.james.backends.postgres.PostgresTableManager;
import org.apache.james.backends.postgres.utils.DomainImplPostgresConnectionFactory;
import org.apache.james.backends.postgres.utils.JamesPostgresConnectionFactory;
import org.apache.james.backends.postgres.utils.PostgresExecutor;
+import org.apache.james.backends.postgres.utils.PostgresHealthCheck;
import org.apache.james.backends.postgres.utils.SinglePostgresConnectionFactory;
+import org.apache.james.core.healthcheck.HealthCheck;
import org.apache.james.utils.PropertiesProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -56,6 +58,9 @@ public class PostgresCommonModule extends AbstractModule {
bind(PostgresExecutor.Factory.class).in(Scopes.SINGLETON);
bind(PostgresExecutor.class).toProvider(PostgresTableManager.class);
+
+ Multibinder.newSetBinder(binder(), HealthCheck.class)
+ .addBinding().to(PostgresHealthCheck.class);
}
@Provides
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org