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/06 04:16:45 UTC
(james-project) branch postgresql updated: JAMES-2586 Implement PostgresPerUserMaxQuotaManager (#1839)
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
The following commit(s) were added to refs/heads/postgresql by this push:
new c5bd9ab41f JAMES-2586 Implement PostgresPerUserMaxQuotaManager (#1839)
c5bd9ab41f is described below
commit c5bd9ab41f9e521af78bf82b25ad35a7c24f710f
Author: hungphan227 <45...@users.noreply.github.com>
AuthorDate: Wed Dec 6 11:16:38 2023 +0700
JAMES-2586 Implement PostgresPerUserMaxQuotaManager (#1839)
---
.../org/apache/james/mailbox}/quota/Limits.java | 2 +-
.../apache/james/mailbox}/quota/QuotaCodec.java | 8 +-
.../quota/CassandraGlobalMaxQuotaDao.java | 2 +
.../quota/CassandraPerDomainMaxQuotaDao.java | 2 +
.../quota/CassandraPerUserMaxQuotaDao.java | 2 +
.../quota/CassandraPerUserMaxQuotaManagerV1.java | 1 +
.../quota/CassandraPerUserMaxQuotaManagerV2.java | 2 +
mailbox/postgres/pom.xml | 21 --
.../postgres/quota/JPAPerUserMaxQuotaDAO.java | 238 -----------------
.../postgres/quota/JPAPerUserMaxQuotaManager.java | 292 ---------------------
.../quota/PostgresPerUserMaxQuotaManager.java} | 141 +++++-----
.../quota/model/MaxDomainMessageCount.java | 54 ----
.../postgres/quota/model/MaxDomainStorage.java | 55 ----
.../quota/model/MaxGlobalMessageCount.java | 54 ----
.../postgres/quota/model/MaxGlobalStorage.java | 54 ----
.../postgres/quota/model/MaxUserMessageCount.java | 52 ----
.../postgres/quota/model/MaxUserStorage.java | 53 ----
.../james/mailbox/postgres/JPAMailboxFixture.java | 51 ----
...ava => PostgresPerUserMaxQuotaManagerTest.java} | 22 +-
.../postgres/src/test/resources/persistence.xml | 42 ---
.../postgres/host/PostgresHostSystem.java | 26 +-
.../src/main/resources/META-INF/persistence.xml | 9 -
.../james/modules/mailbox/PostgresQuotaModule.java | 10 +-
23 files changed, 104 insertions(+), 1089 deletions(-)
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/Limits.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/Limits.java
similarity index 97%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/Limits.java
rename to mailbox/api/src/main/java/org/apache/james/mailbox/quota/Limits.java
index 3ef7aec097..f278d03ed7 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/Limits.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/Limits.java
@@ -17,7 +17,7 @@
* under the License. *
****************************************************************/
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.mailbox.quota;
import java.util.Optional;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCodec.java
similarity index 90%
rename from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
rename to mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCodec.java
index 87b6cdcef7..d3d9b5cd67 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/QuotaCodec.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCodec.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations *
* under the License. *
****************************************************************/
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.mailbox.quota;
import java.util.Optional;
import java.util.function.Function;
@@ -30,18 +30,18 @@ public class QuotaCodec {
private static final long INFINITE = -1;
private static final long NO_RIGHT = 0L;
- static Long quotaValueToLong(QuotaLimitValue<?> value) {
+ public static Long quotaValueToLong(QuotaLimitValue<?> value) {
if (value.isUnlimited()) {
return INFINITE;
}
return value.asLong();
}
- static Optional<QuotaSizeLimit> longToQuotaSize(Long value) {
+ public static Optional<QuotaSizeLimit> longToQuotaSize(Long value) {
return longToQuotaValue(value, QuotaSizeLimit.unlimited(), QuotaSizeLimit::size);
}
- static Optional<QuotaCountLimit> longToQuotaCount(Long value) {
+ public static Optional<QuotaCountLimit> longToQuotaCount(Long value) {
return longToQuotaValue(value, QuotaCountLimit.unlimited(), QuotaCountLimit::count);
}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
index 426f069e88..35c9e15822 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraGlobalMaxQuotaDao.java
@@ -39,6 +39,8 @@ import javax.inject.Inject;
import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
import org.apache.james.core.quota.QuotaCountLimit;
import org.apache.james.core.quota.QuotaSizeLimit;
+import org.apache.james.mailbox.quota.Limits;
+import org.apache.james.mailbox.quota.QuotaCodec;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
index 1efe48219e..3c882978f6 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerDomainMaxQuotaDao.java
@@ -35,6 +35,8 @@ import org.apache.james.core.Domain;
import org.apache.james.core.quota.QuotaCountLimit;
import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.mailbox.cassandra.table.CassandraDomainMaxQuota;
+import org.apache.james.mailbox.quota.Limits;
+import org.apache.james.mailbox.quota.QuotaCodec;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
index e66328fceb..19ed0d5f12 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
@@ -35,6 +35,8 @@ import org.apache.james.core.quota.QuotaCountLimit;
import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.Limits;
+import org.apache.james.mailbox.quota.QuotaCodec;
import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1.java
index 28ad30a4b8..778b2e2c72 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV1.java
@@ -32,6 +32,7 @@ import org.apache.james.core.quota.QuotaCountLimit;
import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.Limits;
import org.apache.james.mailbox.quota.MaxQuotaManager;
import com.google.common.collect.ImmutableMap;
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java
index 6697a9843a..a1d3347a7e 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java
@@ -40,7 +40,9 @@ import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.core.quota.QuotaType;
import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.Limits;
import org.apache.james.mailbox.quota.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaCodec;
import com.google.common.collect.ImmutableMap;
diff --git a/mailbox/postgres/pom.xml b/mailbox/postgres/pom.xml
index edc6bfac4b..e2f2d9bcd7 100644
--- a/mailbox/postgres/pom.xml
+++ b/mailbox/postgres/pom.xml
@@ -195,27 +195,6 @@
-Xms512m -Xmx1024m -Dopenjpa.Multithreaded=true</argLine>
</configuration>
</plugin>
- <plugin>
- <groupId>org.apache.openjpa</groupId>
- <artifactId>openjpa-maven-plugin</artifactId>
- <version>${apache.openjpa.version}</version>
- <configuration>
- <includes>org/apache/james/mailbox/jpa/*/model/**/*.class</includes>
- <excludes>org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.class</excludes>
- <addDefaultConstructor>true</addDefaultConstructor>
- <enforcePropertyRestrictions>true</enforcePropertyRestrictions>
- <persistenceXmlFile>${basedir}/src/test/resources/persistence.xml</persistenceXmlFile>
- </configuration>
- <executions>
- <execution>
- <id>enhancer</id>
- <goals>
- <goal>enhance</goal>
- </goals>
- <phase>process-classes</phase>
- </execution>
- </executions>
- </plugin>
</plugins>
</build>
</project>
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaDAO.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaDAO.java
deleted file mode 100644
index 31630798d3..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaDAO.java
+++ /dev/null
@@ -1,238 +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.mailbox.postgres.quota;
-
-import java.util.Optional;
-import java.util.function.Function;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.james.backends.jpa.TransactionRunner;
-import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCountLimit;
-import org.apache.james.core.quota.QuotaLimitValue;
-import org.apache.james.core.quota.QuotaSizeLimit;
-import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.postgres.quota.model.MaxDomainMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxDomainStorage;
-import org.apache.james.mailbox.postgres.quota.model.MaxGlobalMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxGlobalStorage;
-import org.apache.james.mailbox.postgres.quota.model.MaxUserMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxUserStorage;
-
-public class JPAPerUserMaxQuotaDAO {
-
- private static final long INFINITE = -1;
- private final TransactionRunner transactionRunner;
-
- @Inject
- public JPAPerUserMaxQuotaDAO(EntityManagerFactory entityManagerFactory) {
- this.transactionRunner = new TransactionRunner(entityManagerFactory);
- }
-
- public void setMaxStorage(QuotaRoot quotaRoot, Optional<QuotaSizeLimit> maxStorageQuota) {
- transactionRunner.run(
- entityManager -> {
- MaxUserStorage storedValue = getMaxUserStorageEntity(entityManager, quotaRoot, maxStorageQuota);
- entityManager.persist(storedValue);
- });
- }
-
- private MaxUserStorage getMaxUserStorageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaSizeLimit> maxStorageQuota) {
- MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class, quotaRoot.getValue());
- Long value = quotaValueToLong(maxStorageQuota);
- if (storedValue == null) {
- return new MaxUserStorage(quotaRoot.getValue(), value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
- public void setMaxMessage(QuotaRoot quotaRoot, Optional<QuotaCountLimit> maxMessageCount) {
- transactionRunner.run(
- entityManager -> {
- MaxUserMessageCount storedValue = getMaxUserMessageEntity(entityManager, quotaRoot, maxMessageCount);
- entityManager.persist(storedValue);
- });
- }
-
- private MaxUserMessageCount getMaxUserMessageEntity(EntityManager entityManager, QuotaRoot quotaRoot, Optional<QuotaCountLimit> maxMessageQuota) {
- MaxUserMessageCount storedValue = entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
- Long value = quotaValueToLong(maxMessageQuota);
- if (storedValue == null) {
- return new MaxUserMessageCount(quotaRoot.getValue(), value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
- public void setDomainMaxMessage(Domain domain, Optional<QuotaCountLimit> count) {
- transactionRunner.run(
- entityManager -> {
- MaxDomainMessageCount storedValue = getMaxDomainMessageEntity(entityManager, domain, count);
- entityManager.persist(storedValue);
- });
- }
-
-
- public void setDomainMaxStorage(Domain domain, Optional<QuotaSizeLimit> size) {
- transactionRunner.run(
- entityManager -> {
- MaxDomainStorage storedValue = getMaxDomainStorageEntity(entityManager, domain, size);
- entityManager.persist(storedValue);
- });
- }
-
- private MaxDomainMessageCount getMaxDomainMessageEntity(EntityManager entityManager, Domain domain, Optional<QuotaCountLimit> maxMessageQuota) {
- MaxDomainMessageCount storedValue = entityManager.find(MaxDomainMessageCount.class, domain.asString());
- Long value = quotaValueToLong(maxMessageQuota);
- if (storedValue == null) {
- return new MaxDomainMessageCount(domain, value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
- private MaxDomainStorage getMaxDomainStorageEntity(EntityManager entityManager, Domain domain, Optional<QuotaSizeLimit> maxStorageQuota) {
- MaxDomainStorage storedValue = entityManager.find(MaxDomainStorage.class, domain.asString());
- Long value = quotaValueToLong(maxStorageQuota);
- if (storedValue == null) {
- return new MaxDomainStorage(domain, value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
-
- public void setGlobalMaxStorage(Optional<QuotaSizeLimit> globalMaxStorage) {
- transactionRunner.run(
- entityManager -> {
- MaxGlobalStorage globalMaxStorageEntity = getGlobalMaxStorageEntity(entityManager, globalMaxStorage);
- entityManager.persist(globalMaxStorageEntity);
- });
- }
-
- private MaxGlobalStorage getGlobalMaxStorageEntity(EntityManager entityManager, Optional<QuotaSizeLimit> maxSizeQuota) {
- MaxGlobalStorage storedValue = entityManager.find(MaxGlobalStorage.class, MaxGlobalStorage.DEFAULT_KEY);
- Long value = quotaValueToLong(maxSizeQuota);
- if (storedValue == null) {
- return new MaxGlobalStorage(value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
- public void setGlobalMaxMessage(Optional<QuotaCountLimit> globalMaxMessageCount) {
- transactionRunner.run(
- entityManager -> {
- MaxGlobalMessageCount globalMaxMessageEntity = getGlobalMaxMessageEntity(entityManager, globalMaxMessageCount);
- entityManager.persist(globalMaxMessageEntity);
- });
- }
-
- private MaxGlobalMessageCount getGlobalMaxMessageEntity(EntityManager entityManager, Optional<QuotaCountLimit> maxMessageQuota) {
- MaxGlobalMessageCount storedValue = entityManager.find(MaxGlobalMessageCount.class, MaxGlobalMessageCount.DEFAULT_KEY);
- Long value = quotaValueToLong(maxMessageQuota);
- if (storedValue == null) {
- return new MaxGlobalMessageCount(value);
- }
- storedValue.setValue(value);
- return storedValue;
- }
-
- public Optional<QuotaSizeLimit> getGlobalMaxStorage(EntityManager entityManager) {
- MaxGlobalStorage storedValue = entityManager.find(MaxGlobalStorage.class, MaxGlobalStorage.DEFAULT_KEY);
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaSize(storedValue.getValue());
- }
-
- public Optional<QuotaCountLimit> getGlobalMaxMessage(EntityManager entityManager) {
- MaxGlobalMessageCount storedValue = entityManager.find(MaxGlobalMessageCount.class, MaxGlobalMessageCount.DEFAULT_KEY);
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaCount(storedValue.getValue());
- }
-
- public Optional<QuotaSizeLimit> getMaxStorage(EntityManager entityManager, QuotaRoot quotaRoot) {
- MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class, quotaRoot.getValue());
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaSize(storedValue.getValue());
- }
-
- public Optional<QuotaCountLimit> getMaxMessage(EntityManager entityManager, QuotaRoot quotaRoot) {
- MaxUserMessageCount storedValue = entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaCount(storedValue.getValue());
- }
-
- public Optional<QuotaCountLimit> getDomainMaxMessage(EntityManager entityManager, Domain domain) {
- MaxDomainMessageCount storedValue = entityManager.find(MaxDomainMessageCount.class, domain.asString());
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaCount(storedValue.getValue());
- }
-
- public Optional<QuotaSizeLimit> getDomainMaxStorage(EntityManager entityManager, Domain domain) {
- MaxDomainStorage storedValue = entityManager.find(MaxDomainStorage.class, domain.asString());
- if (storedValue == null) {
- return Optional.empty();
- }
- return longToQuotaSize(storedValue.getValue());
- }
-
-
- private Long quotaValueToLong(Optional<? extends QuotaLimitValue<?>> maxStorageQuota) {
- return maxStorageQuota.map(value -> {
- if (value.isUnlimited()) {
- return INFINITE;
- }
- return value.asLong();
- }).orElse(null);
- }
-
- private Optional<QuotaSizeLimit> longToQuotaSize(Long value) {
- return longToQuotaValue(value, QuotaSizeLimit.unlimited(), QuotaSizeLimit::size);
- }
-
- private Optional<QuotaCountLimit> longToQuotaCount(Long value) {
- return longToQuotaValue(value, QuotaCountLimit.unlimited(), QuotaCountLimit::count);
- }
-
- private <T extends QuotaLimitValue<T>> Optional<T> longToQuotaValue(Long value, T infiniteValue, Function<Long, T> quotaFactory) {
- if (value == null) {
- return Optional.empty();
- }
- if (value == INFINITE) {
- return Optional.of(infiniteValue);
- }
- return Optional.of(quotaFactory.apply(value));
- }
-
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaManager.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaManager.java
deleted file mode 100644
index 6572b71ea5..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaManager.java
+++ /dev/null
@@ -1,292 +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.mailbox.postgres.quota;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Stream;
-
-import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.jpa.EntityManagerUtils;
-import org.apache.james.core.Domain;
-import org.apache.james.core.quota.QuotaCountLimit;
-import org.apache.james.core.quota.QuotaSizeLimit;
-import org.apache.james.mailbox.model.Quota;
-import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.reactivestreams.Publisher;
-
-import com.github.fge.lambdas.Throwing;
-import com.google.common.collect.ImmutableMap;
-
-import reactor.core.publisher.Mono;
-import reactor.core.scheduler.Schedulers;
-
-public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
- private final EntityManagerFactory entityManagerFactory;
- private final JPAPerUserMaxQuotaDAO dao;
-
- @Inject
- public JPAPerUserMaxQuotaManager(EntityManagerFactory entityManagerFactory, JPAPerUserMaxQuotaDAO dao) {
- this.entityManagerFactory = entityManagerFactory;
- this.dao = dao;
- }
-
- @Override
- public void setMaxStorage(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
- dao.setMaxStorage(quotaRoot, Optional.of(maxStorageQuota));
- }
-
- @Override
- public Publisher<Void> setMaxStorageReactive(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
- return Mono.fromRunnable(() -> setMaxStorage(quotaRoot, maxStorageQuota));
- }
-
- @Override
- public void setMaxMessage(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
- dao.setMaxMessage(quotaRoot, Optional.of(maxMessageCount));
- }
-
- @Override
- public Publisher<Void> setMaxMessageReactive(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
- return Mono.fromRunnable(() -> setMaxMessage(quotaRoot, maxMessageCount));
- }
-
- @Override
- public void setDomainMaxMessage(Domain domain, QuotaCountLimit count) {
- dao.setDomainMaxMessage(domain, Optional.of(count));
- }
-
- @Override
- public Publisher<Void> setDomainMaxMessageReactive(Domain domain, QuotaCountLimit count) {
- return Mono.fromRunnable(() -> setDomainMaxMessage(domain, count));
- }
-
- @Override
- public void setDomainMaxStorage(Domain domain, QuotaSizeLimit size) {
- dao.setDomainMaxStorage(domain, Optional.of(size));
- }
-
- @Override
- public Publisher<Void> setDomainMaxStorageReactive(Domain domain, QuotaSizeLimit size) {
- return Mono.fromRunnable(() -> setDomainMaxStorage(domain, size));
- }
-
- @Override
- public void removeDomainMaxMessage(Domain domain) {
- dao.setDomainMaxMessage(domain, Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeDomainMaxMessageReactive(Domain domain) {
- return Mono.fromRunnable(() -> removeDomainMaxMessage(domain));
- }
-
- @Override
- public void removeDomainMaxStorage(Domain domain) {
- dao.setDomainMaxStorage(domain, Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeDomainMaxStorageReactive(Domain domain) {
- return Mono.fromRunnable(() -> removeDomainMaxStorage(domain));
- }
-
- @Override
- public Optional<QuotaCountLimit> getDomainMaxMessage(Domain domain) {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return dao.getDomainMaxMessage(entityManager, domain);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- @Override
- public Publisher<QuotaCountLimit> getDomainMaxMessageReactive(Domain domain) {
- return Mono.fromSupplier(() -> getDomainMaxMessage(domain))
- .flatMap(Mono::justOrEmpty);
- }
-
- @Override
- public Optional<QuotaSizeLimit> getDomainMaxStorage(Domain domain) {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return dao.getDomainMaxStorage(entityManager, domain);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- @Override
- public Publisher<QuotaSizeLimit> getDomainMaxStorageReactive(Domain domain) {
- return Mono.fromSupplier(() -> getDomainMaxStorage(domain))
- .flatMap(Mono::justOrEmpty);
- }
-
- @Override
- public void removeMaxMessage(QuotaRoot quotaRoot) {
- dao.setMaxMessage(quotaRoot, Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeMaxMessageReactive(QuotaRoot quotaRoot) {
- return Mono.fromRunnable(() -> removeMaxMessage(quotaRoot));
- }
-
- @Override
- public void setGlobalMaxStorage(QuotaSizeLimit globalMaxStorage) {
- dao.setGlobalMaxStorage(Optional.of(globalMaxStorage));
- }
-
- @Override
- public Publisher<Void> setGlobalMaxStorageReactive(QuotaSizeLimit globalMaxStorage) {
- return Mono.fromRunnable(() -> setGlobalMaxStorage(globalMaxStorage));
- }
-
- @Override
- public void removeGlobalMaxMessage() {
- dao.setGlobalMaxMessage(Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeGlobalMaxMessageReactive() {
- return Mono.fromRunnable(this::removeGlobalMaxMessage);
- }
-
- @Override
- public void setGlobalMaxMessage(QuotaCountLimit globalMaxMessageCount) {
- dao.setGlobalMaxMessage(Optional.of(globalMaxMessageCount));
- }
-
- @Override
- public Publisher<Void> setGlobalMaxMessageReactive(QuotaCountLimit globalMaxMessageCount) {
- return Mono.fromRunnable(() -> setGlobalMaxMessage(globalMaxMessageCount));
- }
-
- @Override
- public Optional<QuotaSizeLimit> getGlobalMaxStorage() {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return dao.getGlobalMaxStorage(entityManager);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- @Override
- public Publisher<QuotaSizeLimit> getGlobalMaxStorageReactive() {
- return Mono.fromSupplier(this::getGlobalMaxStorage)
- .flatMap(Mono::justOrEmpty);
- }
-
- @Override
- public Optional<QuotaCountLimit> getGlobalMaxMessage() {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return dao.getGlobalMaxMessage(entityManager);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- @Override
- public Publisher<QuotaCountLimit> getGlobalMaxMessageReactive() {
- return Mono.fromSupplier(this::getGlobalMaxMessage)
- .flatMap(Mono::justOrEmpty);
- }
-
- @Override
- public Publisher<QuotaDetails> quotaDetailsReactive(QuotaRoot quotaRoot) {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- return Mono.zip(
- Mono.fromCallable(() -> listMaxMessagesDetails(quotaRoot, entityManager)),
- Mono.fromCallable(() -> listMaxStorageDetails(quotaRoot, entityManager)))
- .map(tuple -> new QuotaDetails(tuple.getT1(), tuple.getT2()))
- .subscribeOn(Schedulers.boundedElastic())
- .doFinally(any -> EntityManagerUtils.safelyClose(entityManager));
- }
-
- @Override
- public Map<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot) {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return listMaxMessagesDetails(quotaRoot, entityManager);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- private ImmutableMap<Quota.Scope, QuotaCountLimit> listMaxMessagesDetails(QuotaRoot quotaRoot, EntityManager entityManager) {
- Function<Domain, Optional<QuotaCountLimit>> domainQuotaFunction = Throwing.function(domain -> dao.getDomainMaxMessage(entityManager, domain));
- return Stream.of(
- Pair.of(Quota.Scope.User, dao.getMaxMessage(entityManager, quotaRoot)),
- Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
- Pair.of(Quota.Scope.Global, dao.getGlobalMaxMessage(entityManager)))
- .filter(pair -> pair.getValue().isPresent())
- .collect(ImmutableMap.toImmutableMap(Pair::getKey, value -> value.getValue().get()));
- }
-
- @Override
- public Map<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot) {
- EntityManager entityManager = entityManagerFactory.createEntityManager();
- try {
- return listMaxStorageDetails(quotaRoot, entityManager);
- } finally {
- EntityManagerUtils.safelyClose(entityManager);
- }
- }
-
- private ImmutableMap<Quota.Scope, QuotaSizeLimit> listMaxStorageDetails(QuotaRoot quotaRoot, EntityManager entityManager) {
- Function<Domain, Optional<QuotaSizeLimit>> domainQuotaFunction = Throwing.function(domain -> dao.getDomainMaxStorage(entityManager, domain));
- return Stream.of(
- Pair.of(Quota.Scope.User, dao.getMaxStorage(entityManager, quotaRoot)),
- Pair.of(Quota.Scope.Domain, quotaRoot.getDomain().flatMap(domainQuotaFunction)),
- Pair.of(Quota.Scope.Global, dao.getGlobalMaxStorage(entityManager)))
- .filter(pair -> pair.getValue().isPresent())
- .collect(ImmutableMap.toImmutableMap(Pair::getKey, value -> value.getValue().get()));
- }
-
- @Override
- public void removeMaxStorage(QuotaRoot quotaRoot) {
- dao.setMaxStorage(quotaRoot, Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeMaxStorageReactive(QuotaRoot quotaRoot) {
- return Mono.fromRunnable(() -> removeMaxStorage(quotaRoot));
- }
-
- @Override
- public void removeGlobalMaxStorage() {
- dao.setGlobalMaxStorage(Optional.empty());
- }
-
- @Override
- public Publisher<Void> removeGlobalMaxStorageReactive() {
- return Mono.fromRunnable(this::removeGlobalMaxStorage);
- }
-
-}
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManager.java
similarity index 67%
copy from mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java
copy to mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManager.java
index 6697a9843a..e39ff808e1 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManagerV2.java
+++ b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManager.java
@@ -17,7 +17,7 @@
* under the License. *
****************************************************************/
-package org.apache.james.mailbox.cassandra.quota;
+package org.apache.james.mailbox.postgres.quota;
import static org.apache.james.util.ReactorUtils.publishIfPresent;
@@ -30,7 +30,7 @@ import java.util.stream.Stream;
import javax.inject.Inject;
import org.apache.commons.lang3.tuple.Pair;
-import org.apache.james.backends.cassandra.components.CassandraQuotaLimitDao;
+import org.apache.james.backends.postgres.quota.PostgresQuotaLimitDAO;
import org.apache.james.core.Domain;
import org.apache.james.core.quota.QuotaComponent;
import org.apache.james.core.quota.QuotaCountLimit;
@@ -40,22 +40,23 @@ import org.apache.james.core.quota.QuotaSizeLimit;
import org.apache.james.core.quota.QuotaType;
import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.Limits;
import org.apache.james.mailbox.quota.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaCodec;
import com.google.common.collect.ImmutableMap;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
-public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
-
+public class PostgresPerUserMaxQuotaManager implements MaxQuotaManager {
private static final String GLOBAL_IDENTIFIER = "global";
- private final CassandraQuotaLimitDao cassandraQuotaLimitDao;
+ private final PostgresQuotaLimitDAO postgresQuotaLimitDAO;
@Inject
- public CassandraPerUserMaxQuotaManagerV2(CassandraQuotaLimitDao cassandraQuotaLimitDao) {
- this.cassandraQuotaLimitDao = cassandraQuotaLimitDao;
+ public PostgresPerUserMaxQuotaManager(PostgresQuotaLimitDAO postgresQuotaLimitDAO) {
+ this.postgresQuotaLimitDAO = postgresQuotaLimitDAO;
}
@Override
@@ -65,13 +66,13 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setMaxStorageReactive(QuotaRoot quotaRoot, QuotaSizeLimit maxStorageQuota) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.USER)
- .identifier(quotaRoot.getValue())
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.SIZE)
- .quotaLimit(QuotaCodec.quotaValueToLong(maxStorageQuota))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.USER)
+ .identifier(quotaRoot.getValue())
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.SIZE)
+ .quotaLimit(QuotaCodec.quotaValueToLong(maxStorageQuota))
+ .build());
}
@Override
@@ -81,13 +82,13 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setMaxMessageReactive(QuotaRoot quotaRoot, QuotaCountLimit maxMessageCount) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.USER)
- .identifier(quotaRoot.getValue())
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.COUNT)
- .quotaLimit(QuotaCodec.quotaValueToLong(maxMessageCount))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.USER)
+ .identifier(quotaRoot.getValue())
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.COUNT)
+ .quotaLimit(QuotaCodec.quotaValueToLong(maxMessageCount))
+ .build());
}
@Override
@@ -97,13 +98,13 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setDomainMaxMessageReactive(Domain domain, QuotaCountLimit count) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.DOMAIN)
- .identifier(domain.asString())
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.COUNT)
- .quotaLimit(QuotaCodec.quotaValueToLong(count))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.DOMAIN)
+ .identifier(domain.asString())
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.COUNT)
+ .quotaLimit(QuotaCodec.quotaValueToLong(count))
+ .build());
}
@Override
@@ -113,13 +114,13 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setDomainMaxStorageReactive(Domain domain, QuotaSizeLimit size) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.DOMAIN)
- .identifier(domain.asString())
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.SIZE)
- .quotaLimit(QuotaCodec.quotaValueToLong(size))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.DOMAIN)
+ .identifier(domain.asString())
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.SIZE)
+ .quotaLimit(QuotaCodec.quotaValueToLong(size))
+ .build());
}
@Override
@@ -129,7 +130,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeDomainMaxMessageReactive(Domain domain) {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, domain.asString(), QuotaType.COUNT));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, domain.asString(), QuotaType.COUNT));
}
@Override
@@ -139,7 +140,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeDomainMaxStorageReactive(Domain domain) {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, domain.asString(), QuotaType.SIZE));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.DOMAIN, domain.asString(), QuotaType.SIZE));
}
@Override
@@ -169,7 +170,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeMaxMessageReactive(QuotaRoot quotaRoot) {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.USER, quotaRoot.getValue(), QuotaType.COUNT));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.USER, quotaRoot.getValue(), QuotaType.COUNT));
}
@Override
@@ -179,7 +180,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeMaxStorageReactive(QuotaRoot quotaRoot) {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.USER, quotaRoot.getValue(), QuotaType.SIZE));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.USER, quotaRoot.getValue(), QuotaType.SIZE));
}
@Override
@@ -189,12 +190,12 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setGlobalMaxStorageReactive(QuotaSizeLimit globalMaxStorage) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.GLOBAL).identifier(GLOBAL_IDENTIFIER)
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.SIZE)
- .quotaLimit(QuotaCodec.quotaValueToLong(globalMaxStorage))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.GLOBAL).identifier(GLOBAL_IDENTIFIER)
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.SIZE)
+ .quotaLimit(QuotaCodec.quotaValueToLong(globalMaxStorage))
+ .build());
}
@Override
@@ -204,7 +205,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeGlobalMaxStorageReactive() {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.GLOBAL, GLOBAL_IDENTIFIER, QuotaType.SIZE));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.GLOBAL, GLOBAL_IDENTIFIER, QuotaType.SIZE));
}
@Override
@@ -214,12 +215,12 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> setGlobalMaxMessageReactive(QuotaCountLimit globalMaxMessageCount) {
- return cassandraQuotaLimitDao.setQuotaLimit(QuotaLimit.builder()
- .quotaScope(QuotaScope.GLOBAL).identifier(GLOBAL_IDENTIFIER)
- .quotaComponent(QuotaComponent.MAILBOX)
- .quotaType(QuotaType.COUNT)
- .quotaLimit(QuotaCodec.quotaValueToLong(globalMaxMessageCount))
- .build());
+ return postgresQuotaLimitDAO.setQuotaLimit(QuotaLimit.builder()
+ .quotaScope(QuotaScope.GLOBAL).identifier(GLOBAL_IDENTIFIER)
+ .quotaComponent(QuotaComponent.MAILBOX)
+ .quotaType(QuotaType.COUNT)
+ .quotaLimit(QuotaCodec.quotaValueToLong(globalMaxMessageCount))
+ .build());
}
@Override
@@ -229,7 +230,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
@Override
public Mono<Void> removeGlobalMaxMessageReactive() {
- return cassandraQuotaLimitDao.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.GLOBAL, GLOBAL_IDENTIFIER, QuotaType.COUNT));
+ return postgresQuotaLimitDAO.deleteQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, QuotaScope.GLOBAL, GLOBAL_IDENTIFIER, QuotaType.COUNT));
}
@Override
@@ -262,11 +263,11 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
return Flux.merge(
getMaxMessageReactive(QuotaScope.USER, quotaRoot.getValue())
.map(limit -> Pair.of(Quota.Scope.User, limit)),
- Mono.justOrEmpty(quotaRoot.getDomain())
- .flatMap(domain -> getMaxMessageReactive(QuotaScope.DOMAIN, domain.asString()))
- .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
- getGlobalMaxMessageReactive()
- .map(limit -> Pair.of(Quota.Scope.Global, limit)))
+ Mono.justOrEmpty(quotaRoot.getDomain())
+ .flatMap(domain -> getMaxMessageReactive(QuotaScope.DOMAIN, domain.asString()))
+ .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
+ getGlobalMaxMessageReactive()
+ .map(limit -> Pair.of(Quota.Scope.Global, limit)))
.collect(ImmutableMap.toImmutableMap(
Pair::getKey,
Pair::getValue));
@@ -282,11 +283,11 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
return Flux.merge(
getMaxStorageReactive(QuotaScope.USER, quotaRoot.getValue())
.map(limit -> Pair.of(Quota.Scope.User, limit)),
- Mono.justOrEmpty(quotaRoot.getDomain())
- .flatMap(domain -> getMaxStorageReactive(QuotaScope.DOMAIN, domain.asString()))
- .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
- getGlobalMaxStorageReactive()
- .map(limit -> Pair.of(Quota.Scope.Global, limit)))
+ Mono.justOrEmpty(quotaRoot.getDomain())
+ .flatMap(domain -> getMaxStorageReactive(QuotaScope.DOMAIN, domain.asString()))
+ .map(limit -> Pair.of(Quota.Scope.Domain, limit)),
+ getGlobalMaxStorageReactive()
+ .map(limit -> Pair.of(Quota.Scope.Global, limit)))
.collect(ImmutableMap.toImmutableMap(
Pair::getKey,
Pair::getValue));
@@ -302,15 +303,15 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
public Mono<QuotaDetails> quotaDetailsReactive(QuotaRoot quotaRoot) {
return Mono.zip(
getLimits(QuotaScope.USER, quotaRoot.getValue()),
- Mono.justOrEmpty(quotaRoot.getDomain()).flatMap(domain -> getLimits(QuotaScope.DOMAIN, domain.asString())).switchIfEmpty(Mono.just(Limits.empty())),
- getLimits(QuotaScope.GLOBAL, GLOBAL_IDENTIFIER))
+ Mono.justOrEmpty(quotaRoot.getDomain()).flatMap(domain -> getLimits(QuotaScope.DOMAIN, domain.asString())).switchIfEmpty(Mono.just(Limits.empty())),
+ getLimits(QuotaScope.GLOBAL, GLOBAL_IDENTIFIER))
.map(tuple -> new QuotaDetails(
countDetails(tuple.getT1(), tuple.getT2(), tuple.getT3().getCountLimit()),
sizeDetails(tuple.getT1(), tuple.getT2(), tuple.getT3().getSizeLimit())));
}
private Mono<Limits> getLimits(QuotaScope quotaScope, String identifier) {
- return cassandraQuotaLimitDao.getQuotaLimits(QuotaComponent.MAILBOX, quotaScope, identifier)
+ return postgresQuotaLimitDAO.getQuotaLimits(QuotaComponent.MAILBOX, quotaScope, identifier)
.collectList()
.map(list -> {
Map<QuotaType, Optional<Long>> map = list.stream().collect(Collectors.toMap(QuotaLimit::getQuotaType, QuotaLimit::getQuotaLimit));
@@ -321,7 +322,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
}
private Mono<QuotaCountLimit> getMaxMessageReactive(QuotaScope quotaScope, String identifier) {
- return cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, quotaScope, identifier, QuotaType.COUNT))
+ return postgresQuotaLimitDAO.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, quotaScope, identifier, QuotaType.COUNT))
.map(QuotaLimit::getQuotaLimit)
.handle(publishIfPresent())
.map(QuotaCodec::longToQuotaCount)
@@ -329,7 +330,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
}
public Mono<QuotaSizeLimit> getMaxStorageReactive(QuotaScope quotaScope, String identifier) {
- return cassandraQuotaLimitDao.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, quotaScope, identifier, QuotaType.SIZE))
+ return postgresQuotaLimitDAO.getQuotaLimit(QuotaLimit.QuotaLimitKey.of(QuotaComponent.MAILBOX, quotaScope, identifier, QuotaType.SIZE))
.map(QuotaLimit::getQuotaLimit)
.handle(publishIfPresent())
.map(QuotaCodec::longToQuotaSize)
@@ -338,7 +339,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
private Map<Quota.Scope, QuotaSizeLimit> sizeDetails(Limits userLimits, Limits domainLimits, Optional<QuotaSizeLimit> globalLimits) {
return Stream.of(
- userLimits.getSizeLimit().stream().map(limit -> Pair.of(Quota.Scope.User, limit)),
+ userLimits.getSizeLimit().stream().map(limit -> Pair.of(Quota.Scope.User, limit)),
domainLimits.getSizeLimit().stream().map(limit -> Pair.of(Quota.Scope.Domain, limit)),
globalLimits.stream().map(limit -> Pair.of(Quota.Scope.Global, limit)))
.flatMap(Function.identity())
@@ -349,7 +350,7 @@ public class CassandraPerUserMaxQuotaManagerV2 implements MaxQuotaManager {
private Map<Quota.Scope, QuotaCountLimit> countDetails(Limits userLimits, Limits domainLimits, Optional<QuotaCountLimit> globalLimits) {
return Stream.of(
- userLimits.getCountLimit().stream().map(limit -> Pair.of(Quota.Scope.User, limit)),
+ userLimits.getCountLimit().stream().map(limit -> Pair.of(Quota.Scope.User, limit)),
domainLimits.getCountLimit().stream().map(limit -> Pair.of(Quota.Scope.Domain, limit)),
globalLimits.stream().map(limit -> Pair.of(Quota.Scope.Global, limit)))
.flatMap(Function.identity())
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainMessageCount.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainMessageCount.java
deleted file mode 100644
index be4cf2a30a..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainMessageCount.java
+++ /dev/null
@@ -1,54 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-import org.apache.james.core.Domain;
-
-@Entity(name = "MaxDomainMessageCount")
-@Table(name = "JAMES_MAX_DOMAIN_MESSAGE_COUNT")
-public class MaxDomainMessageCount {
- @Id
- @Column(name = "DOMAIN")
- private String domain;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxDomainMessageCount(Domain domain, Long value) {
- this.domain = domain.asString();
- this.value = value;
- }
-
- public MaxDomainMessageCount() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainStorage.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainStorage.java
deleted file mode 100644
index ec668421dc..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxDomainStorage.java
+++ /dev/null
@@ -1,55 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-import org.apache.james.core.Domain;
-
-@Entity(name = "MaxDomainStorage")
-@Table(name = "JAMES_MAX_DOMAIN_STORAGE")
-public class MaxDomainStorage {
-
- @Id
- @Column(name = "DOMAIN")
- private String domain;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxDomainStorage(Domain domain, Long value) {
- this.domain = domain.asString();
- this.value = value;
- }
-
- public MaxDomainStorage() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalMessageCount.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalMessageCount.java
deleted file mode 100644
index 1041e75533..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalMessageCount.java
+++ /dev/null
@@ -1,54 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity(name = "MaxGlobalMessageCount")
-@Table(name = "JAMES_MAX_GLOBAL_MESSAGE_COUNT")
-public class MaxGlobalMessageCount {
- public static final String DEFAULT_KEY = "default_key";
-
- @Id
- @Column(name = "QUOTAROOT_ID")
- private String quotaRoot = DEFAULT_KEY;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxGlobalMessageCount(Long value) {
- this.quotaRoot = DEFAULT_KEY;
- this.value = value;
- }
-
- public MaxGlobalMessageCount() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalStorage.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalStorage.java
deleted file mode 100644
index 59b9a1601c..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxGlobalStorage.java
+++ /dev/null
@@ -1,54 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity(name = "MaxGlobalStorage")
-@Table(name = "JAMES_MAX_Global_STORAGE")
-public class MaxGlobalStorage {
- public static final String DEFAULT_KEY = "default_key";
-
- @Id
- @Column(name = "QUOTAROOT_ID")
- private String quotaRoot = DEFAULT_KEY;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxGlobalStorage(Long value) {
- this.quotaRoot = DEFAULT_KEY;
- this.value = value;
- }
-
- public MaxGlobalStorage() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserMessageCount.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserMessageCount.java
deleted file mode 100644
index 9f31a8ef5e..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserMessageCount.java
+++ /dev/null
@@ -1,52 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity(name = "MaxUserMessageCount")
-@Table(name = "JAMES_MAX_USER_MESSAGE_COUNT")
-public class MaxUserMessageCount {
- @Id
- @Column(name = "QUOTAROOT_ID")
- private String quotaRoot;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxUserMessageCount(String quotaRoot, Long value) {
- this.quotaRoot = quotaRoot;
- this.value = value;
- }
-
- public MaxUserMessageCount() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserStorage.java b/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserStorage.java
deleted file mode 100644
index a4633380d0..0000000000
--- a/mailbox/postgres/src/main/java/org/apache/james/mailbox/postgres/quota/model/MaxUserStorage.java
+++ /dev/null
@@ -1,53 +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.mailbox.postgres.quota.model;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-@Entity(name = "MaxUserStorage")
-@Table(name = "JAMES_MAX_USER_STORAGE")
-public class MaxUserStorage {
-
- @Id
- @Column(name = "QUOTAROOT_ID")
- private String quotaRoot;
-
- @Column(name = "VALUE", nullable = true)
- private Long value;
-
- public MaxUserStorage(String quotaRoot, Long value) {
- this.quotaRoot = quotaRoot;
- this.value = value;
- }
-
- public MaxUserStorage() {
- }
-
- public Long getValue() {
- return value;
- }
-
- public void setValue(Long value) {
- this.value = value;
- }
-}
diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/JPAMailboxFixture.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/JPAMailboxFixture.java
deleted file mode 100644
index 6c34d837d7..0000000000
--- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/JPAMailboxFixture.java
+++ /dev/null
@@ -1,51 +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.mailbox.postgres;
-
-import java.util.List;
-
-import org.apache.james.mailbox.postgres.quota.model.MaxDomainMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxDomainStorage;
-import org.apache.james.mailbox.postgres.quota.model.MaxGlobalMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxGlobalStorage;
-import org.apache.james.mailbox.postgres.quota.model.MaxUserMessageCount;
-import org.apache.james.mailbox.postgres.quota.model.MaxUserStorage;
-
-import com.google.common.collect.ImmutableList;
-
-public interface JPAMailboxFixture {
-
- List<Class<?>> QUOTA_PERSISTANCE_CLASSES = ImmutableList.of(
- MaxGlobalMessageCount.class,
- MaxGlobalStorage.class,
- MaxDomainStorage.class,
- MaxDomainMessageCount.class,
- MaxUserMessageCount.class,
- MaxUserStorage.class);
-
- List<String> QUOTA_TABLES_NAMES = ImmutableList.of(
- "JAMES_MAX_GLOBAL_MESSAGE_COUNT",
- "JAMES_MAX_GLOBAL_STORAGE",
- "JAMES_MAX_USER_MESSAGE_COUNT",
- "JAMES_MAX_USER_STORAGE",
- "JAMES_MAX_DOMAIN_MESSAGE_COUNT",
- "JAMES_MAX_DOMAIN_STORAGE"
- );
-}
diff --git a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaTest.java b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManagerTest.java
similarity index 65%
rename from mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaTest.java
rename to mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManagerTest.java
index 6b14d6f83c..56da9f2378 100644
--- a/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/JPAPerUserMaxQuotaTest.java
+++ b/mailbox/postgres/src/test/java/org/apache/james/mailbox/postgres/quota/PostgresPerUserMaxQuotaManagerTest.java
@@ -19,25 +19,19 @@
package org.apache.james.mailbox.postgres.quota;
-import org.apache.james.backends.jpa.JpaTestCluster;
-import org.apache.james.mailbox.postgres.JPAMailboxFixture;
-import org.apache.james.mailbox.postgres.quota.JPAPerUserMaxQuotaDAO;
-import org.apache.james.mailbox.postgres.quota.JPAPerUserMaxQuotaManager;
+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.mailbox.quota.MaxQuotaManager;
import org.apache.james.mailbox.store.quota.GenericMaxQuotaManagerTest;
-import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.extension.RegisterExtension;
-class JPAPerUserMaxQuotaTest extends GenericMaxQuotaManagerTest {
-
- static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES);
+public class PostgresPerUserMaxQuotaManagerTest extends GenericMaxQuotaManagerTest {
+ @RegisterExtension
+ static PostgresExtension postgresExtension = PostgresExtension.withoutRowLevelSecurity(PostgresQuotaModule.MODULE);
@Override
protected MaxQuotaManager provideMaxQuotaManager() {
- return new JPAPerUserMaxQuotaManager(JPA_TEST_CLUSTER.getEntityManagerFactory(), new JPAPerUserMaxQuotaDAO(JPA_TEST_CLUSTER.getEntityManagerFactory()));
- }
-
- @AfterEach
- void cleanUp() {
- JPA_TEST_CLUSTER.clear(JPAMailboxFixture.QUOTA_TABLES_NAMES);
+ return new PostgresPerUserMaxQuotaManager(new PostgresQuotaLimitDAO(postgresExtension.getPostgresExecutor()));
}
}
diff --git a/mailbox/postgres/src/test/resources/persistence.xml b/mailbox/postgres/src/test/resources/persistence.xml
deleted file mode 100644
index 21199cfdd4..0000000000
--- a/mailbox/postgres/src/test/resources/persistence.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?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.
--->
-
-<persistence xmlns="http://java.sun.com/xml/ns/persistence"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
- version="2.0">
-
- <persistence-unit name="James" transaction-type="RESOURCE_LOCAL">
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxGlobalMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxGlobalStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxUserMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxUserStorage</class>
- <properties>
- <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
- <property name="openjpa.jdbc.MappingDefaults" value="ForeignKeyDeleteAction=cascade, JoinForeignKeyDeleteAction=cascade"/>
- <property name="openjpa.jdbc.SchemaFactory" value="native(ForeignKeys=true)"/>
- <property name="openjpa.jdbc.QuerySQLCache" value="false"/>
- </properties>
-
- </persistence-unit>
-
-</persistence>
diff --git a/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java b/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java
index 5c5ab7e688..0e2a041730 100644
--- a/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java
+++ b/mpt/impl/imap-mailbox/postgres/src/test/java/org/apache/james/mpt/imapmailbox/postgres/host/PostgresHostSystem.java
@@ -22,11 +22,9 @@ package org.apache.james.mpt.imapmailbox.postgres.host;
import java.time.Clock;
import java.time.Instant;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.james.backends.jpa.JpaTestCluster;
import org.apache.james.backends.postgres.PostgresExtension;
import org.apache.james.backends.postgres.quota.PostgresQuotaCurrentValueDAO;
+import org.apache.james.backends.postgres.quota.PostgresQuotaLimitDAO;
import org.apache.james.blob.api.BlobId;
import org.apache.james.blob.api.BucketName;
import org.apache.james.blob.api.HashBlobId;
@@ -46,13 +44,11 @@ import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.SubscriptionManager;
import org.apache.james.mailbox.acl.MailboxACLResolver;
import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
-import org.apache.james.mailbox.postgres.JPAMailboxFixture;
import org.apache.james.mailbox.postgres.PostgresMailboxSessionMapperFactory;
import org.apache.james.mailbox.postgres.PostgresMessageId;
import org.apache.james.mailbox.postgres.mail.PostgresMailboxManager;
-import org.apache.james.mailbox.postgres.quota.JPAPerUserMaxQuotaDAO;
-import org.apache.james.mailbox.postgres.quota.JPAPerUserMaxQuotaManager;
import org.apache.james.mailbox.postgres.quota.PostgresCurrentQuotaManager;
+import org.apache.james.mailbox.postgres.quota.PostgresPerUserMaxQuotaManager;
import org.apache.james.mailbox.quota.CurrentQuotaManager;
import org.apache.james.mailbox.store.SessionProviderImpl;
import org.apache.james.mailbox.store.StoreMailboxAnnotationManager;
@@ -77,15 +73,9 @@ import org.apache.james.server.blob.deduplication.DeDuplicationBlobStore;
import org.apache.james.utils.UpdatableTickingClock;
import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
public class PostgresHostSystem extends JamesImapHostSystem {
- private static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(
- ImmutableList.<Class<?>>builder()
- .addAll(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES)
- .build());
-
private static final ImapFeatures SUPPORTED_FEATURES = ImapFeatures.of(Feature.NAMESPACE_SUPPORT,
Feature.USER_FLAGS_SUPPORT,
Feature.ANNOTATION_SUPPORT,
@@ -98,7 +88,7 @@ public class PostgresHostSystem extends JamesImapHostSystem {
return new PostgresHostSystem(postgresExtension);
}
- private JPAPerUserMaxQuotaManager maxQuotaManager;
+ private PostgresPerUserMaxQuotaManager maxQuotaManager;
private PostgresMailboxManager mailboxManager;
private final PostgresExtension postgresExtension;
@@ -113,7 +103,6 @@ public class PostgresHostSystem extends JamesImapHostSystem {
@Override
public void beforeTest() throws Exception {
super.beforeTest();
- EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
BlobId.Factory blobIdFactory = new HashBlobId.Factory();
DeDuplicationBlobStore blobStore = new DeDuplicationBlobStore(new MemoryBlobStoreDAO(), BucketName.DEFAULT, blobIdFactory);
@@ -130,7 +119,7 @@ public class PostgresHostSystem extends JamesImapHostSystem {
SessionProviderImpl sessionProvider = new SessionProviderImpl(authenticator, authorizator);
DefaultUserQuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mapperFactory);
CurrentQuotaManager currentQuotaManager = new PostgresCurrentQuotaManager(new PostgresQuotaCurrentValueDAO(postgresExtension.getPostgresExecutor()));
- maxQuotaManager = new JPAPerUserMaxQuotaManager(entityManagerFactory, new JPAPerUserMaxQuotaDAO(entityManagerFactory));
+ maxQuotaManager = new PostgresPerUserMaxQuotaManager(new PostgresQuotaLimitDAO(postgresExtension.getPostgresExecutor()));
StoreQuotaManager storeQuotaManager = new StoreQuotaManager(currentQuotaManager, maxQuotaManager);
ListeningCurrentQuotaUpdater quotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, storeQuotaManager);
QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, storeQuotaManager, quotaRootResolver);
@@ -160,13 +149,6 @@ public class PostgresHostSystem extends JamesImapHostSystem {
defaultImapProcessorFactory);
}
- @Override
- public void afterTest() {
- JPA_TEST_CLUSTER.clear(ImmutableList.<String>builder()
- .addAll(JPAMailboxFixture.QUOTA_TABLES_NAMES)
- .build());
- }
-
@Override
protected MailboxManager getMailboxManager() {
return mailboxManager;
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 e223792513..d074a13385 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
@@ -29,15 +29,6 @@
<class>org.apache.james.rrt.jpa.model.JPARecipientRewrite</class>
<class>org.apache.james.sieve.postgres.model.JPASieveScript</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxGlobalMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxGlobalStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxUserMessageCount</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxUserStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainStorage</class>
- <class>org.apache.james.mailbox.postgres.quota.model.MaxDomainMessageCount</class>
-
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
<property name="openjpa.jdbc.MappingDefaults" value="ForeignKeyDeleteAction=cascade, JoinForeignKeyDeleteAction=cascade"/>
diff --git a/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresQuotaModule.java b/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresQuotaModule.java
index 8815b27812..19894e74af 100644
--- a/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresQuotaModule.java
+++ b/server/container/guice/mailbox-postgres/src/main/java/org/apache/james/modules/mailbox/PostgresQuotaModule.java
@@ -19,9 +19,10 @@
package org.apache.james.modules.mailbox;
+import org.apache.james.backends.postgres.PostgresModule;
import org.apache.james.events.EventListener;
-import org.apache.james.mailbox.postgres.quota.JPAPerUserMaxQuotaManager;
import org.apache.james.mailbox.postgres.quota.PostgresCurrentQuotaManager;
+import org.apache.james.mailbox.postgres.quota.PostgresPerUserMaxQuotaManager;
import org.apache.james.mailbox.quota.CurrentQuotaManager;
import org.apache.james.mailbox.quota.MaxQuotaManager;
import org.apache.james.mailbox.quota.QuotaManager;
@@ -41,15 +42,18 @@ public class PostgresQuotaModule extends AbstractModule {
@Override
protected void configure() {
+ Multibinder<PostgresModule> postgresDataDefinitions = Multibinder.newSetBinder(binder(), PostgresModule.class);
+ postgresDataDefinitions.addBinding().toInstance(org.apache.james.backends.postgres.quota.PostgresQuotaModule.MODULE);
+
bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
- bind(JPAPerUserMaxQuotaManager.class).in(Scopes.SINGLETON);
+ bind(PostgresPerUserMaxQuotaManager.class).in(Scopes.SINGLETON);
bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
bind(PostgresCurrentQuotaManager.class).in(Scopes.SINGLETON);
bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
bind(QuotaRootDeserializer.class).to(DefaultUserQuotaRootResolver.class);
- bind(MaxQuotaManager.class).to(JPAPerUserMaxQuotaManager.class);
+ bind(MaxQuotaManager.class).to(PostgresPerUserMaxQuotaManager.class);
bind(QuotaManager.class).to(StoreQuotaManager.class);
bind(CurrentQuotaManager.class).to(PostgresCurrentQuotaManager.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org