You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/04/22 07:24:32 UTC

[james-project] branch master updated (8f0c332 -> 79cb3d1)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git.


    from 8f0c332  JAMES-3151 HasMimeType matchers fails on empty charset
     new da779b5  JAMES-3138 Move CurrentQuotas to mailbox-api
     new 4a7dfcb  JAMES-3138 Add getCurrentQuotas in CurrentQuotaManager
     new 273129e  JAMES-3138 Allow resetting current quotas
     new d254050  JAMES-3138 Add resetting current quotas service
     new f4312b6  JAMES-3138 Move increase and decrease to CurrentQuotaManager to have a allow a neutral RecomputeCurrentQuotasServiceContract
     new 9850fab  JAMES-3138 Move resetQuotas to CurrentQuotaManager to allow StoreCurrentQuotaManager removal
     new 98c0630  JAMES-3138 Move RecomputeQuotaService to a mailbox-tools-quota-recompute module
     new dfbfcad  JAMES-3138 Rename resetCurrentQuotas to setCurrentQuotas
     new 14bba3e  JAMES-3138 Change CurrentQuotaManagerTest into CurrentQuotaManagerContract
     new 79cb3d1  JAMES-3138 InMemoryCurrentQuotaManagerTest should implement CurrentQuotaManagerContract

The 10 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:
 .../{QuotaOperation.java => CurrentQuotas.java}    |  52 ++++--
 .../apache/james/mailbox/model/QuotaOperation.java |   8 +-
 .../james/mailbox/quota/CurrentQuotaManager.java   |  10 +
 .../james/mailbox/model/CurrentQuotasTest.java     |   6 +-
 .../james/mailbox/model/QuotaOperationTest.java    |  13 +-
 mailbox/cassandra/pom.xml                          |  16 ++
 .../quota/CassandraCurrentQuotaManager.java        |  62 +++++--
 .../CassandraMessageIdManagerTestSystem.java       |   3 +-
 .../cassandra/CassandraTestSystemFixture.java      |   8 +-
 ...CassandraRecomputeCurrentQuotasServiceTest.java | 160 ++++++++++++++++
 .../quota/CassandraCurrentQuotaManagerTest.java    |   8 +-
 mailbox/jpa/pom.xml                                |  16 ++
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  |  26 ++-
 .../task/JPARecomputeCurrentQuotasServiceTest.java | 132 +++++++++++++
 .../jpa/quota/JPACurrentQuotaManagerTest.java      |   8 +-
 mailbox/memory/pom.xml                             |  16 ++
 .../quota/InMemoryCurrentQuotaManager.java         |  24 ++-
 .../MemoryRecomputeCurrentQuotasServiceTest.java   |  83 +++++++++
 .../manager/InMemoryIntegrationResources.java      |  13 +-
 ...ava => InMemoryCurrentQuotaCalculatorTest.java} |  24 ++-
 .../quota/InMemoryCurrentQuotaManagerTest.java     |  59 +-----
 mailbox/pom.xml                                    |   1 +
 .../store/quota/CurrentQuotaCalculator.java        |  32 +---
 .../store/quota/ListeningCurrentQuotaUpdater.java  |  13 +-
 .../store/quota/StoreCurrentQuotaManager.java      |  33 ----
 .../store/quota/CurrentQuotaManagerContract.java   | 135 ++++++++++++++
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |   5 +-
 .../store/quota/StoreCurrentQuotaManagerTest.java  |  77 --------
 .../{maildir-utils => quota-recompute}/pom.xml     |  11 +-
 .../quota/task/RecomputeCurrentQuotasService.java  | 170 +++++++++++++++++
 .../RecomputeCurrentQuotasServiceContract.java     | 205 +++++++++++++++++++++
 pom.xml                                            |  11 ++
 .../modules/mailbox/CassandraQuotaModule.java      |   2 -
 .../james/modules/mailbox/JpaQuotaModule.java      |   2 -
 .../james/modules/mailbox/MemoryQuotaModule.java   |   2 -
 35 files changed, 1165 insertions(+), 281 deletions(-)
 copy mailbox/api/src/main/java/org/apache/james/mailbox/model/{QuotaOperation.java => CurrentQuotas.java} (55%)
 copy server/protocols/jmap/src/test/java/org/apache/james/jmap/VersionTest.java => mailbox/api/src/test/java/org/apache/james/mailbox/model/CurrentQuotasTest.java (91%)
 create mode 100644 mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
 create mode 100644 mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
 create mode 100644 mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
 copy mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/{InMemoryCurrentQuotaManagerTest.java => InMemoryCurrentQuotaCalculatorTest.java} (78%)
 delete mode 100644 mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
 create mode 100644 mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
 delete mode 100644 mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
 copy mailbox/tools/{maildir-utils => quota-recompute}/pom.xml (82%)
 create mode 100644 mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
 create mode 100644 mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasServiceContract.java


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 06/10: JAMES-3138 Move resetQuotas to CurrentQuotaManager to allow StoreCurrentQuotaManager removal

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 9850fabd0036838ac9d75691b9cd7ca9fbfdd58e
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Mon Apr 20 11:56:15 2020 +0700

    JAMES-3138 Move resetQuotas to CurrentQuotaManager to allow StoreCurrentQuotaManager removal
---
 .../james/mailbox/quota/CurrentQuotaManager.java   |  3 ++
 .../quota/CassandraCurrentQuotaManager.java        | 16 +++++++--
 .../CassandraMessageIdManagerQuotaTest.java        |  5 ++-
 .../CassandraMessageIdManagerTestSystem.java       |  3 +-
 .../cassandra/CassandraTestSystemFixture.java      |  4 +--
 ...CassandraRecomputeCurrentQuotasServiceTest.java |  3 +-
 .../quota/CassandraCurrentQuotaManagerTest.java    |  8 ++---
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  |  4 +--
 .../task/JPARecomputeCurrentQuotasServiceTest.java | 11 +++---
 .../jpa/quota/JPACurrentQuotaManagerTest.java      |  8 ++---
 .../quota/InMemoryCurrentQuotaManager.java         | 16 +++++++--
 .../mail/task/RecomputeCurrentQuotasService.java   |  8 ++---
 .../store/quota/ListeningCurrentQuotaUpdater.java  |  5 +--
 .../store/quota/StoreCurrentQuotaManager.java      | 39 ----------------------
 .../store/AbstractMessageIdManagerQuotaTest.java   |  7 ++--
 ...nagerTest.java => CurrentQuotaManagerTest.java} | 17 +++++-----
 .../quota/ListeningCurrentQuotaUpdaterTest.java    |  5 +--
 .../modules/mailbox/CassandraQuotaModule.java      |  2 --
 .../james/modules/mailbox/JpaQuotaModule.java      |  2 --
 .../james/modules/mailbox/MemoryQuotaModule.java   |  2 --
 20 files changed, 76 insertions(+), 92 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index f99df4b..8b0164e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -40,4 +40,7 @@ public interface CurrentQuotaManager {
     Publisher<Void> increase(QuotaOperation quotaOperation);
 
     Publisher<Void> decrease(QuotaOperation quotaOperation);
+
+    Publisher<Void> resetCurrentQuotas(QuotaOperation quotaOperation);
+
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index 624d003..fdb0e85 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -39,14 +39,14 @@ import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
 import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 
 import reactor.core.publisher.Mono;
 
-public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
+public class CassandraCurrentQuotaManager implements CurrentQuotaManager {
 
     private final CassandraAsyncExecutor cassandraAsyncExecutor;
     private final PreparedStatement increaseStatement;
@@ -113,4 +113,16 @@ public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
                 QuotaSizeUsage.size(row.getLong(STORAGE))))
             .defaultIfEmpty(CurrentQuotas.emptyQuotas());
     }
+
+    @Override
+    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+        return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
+            .flatMap(storedQuotas -> {
+                if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
+                    return Mono.from(decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size())))
+                        .then(Mono.from(increase(quotaOperation)));
+                }
+                return Mono.empty();
+            });
+    }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
index 675232f..2293ade 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
@@ -26,7 +26,6 @@ import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerQuotaTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -46,12 +45,12 @@ class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManagerQuotaTe
     }
 
     @Override
-    protected QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, StoreCurrentQuotaManager currentQuotaManager) {
+    protected QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, CurrentQuotaManager currentQuotaManager) {
         return new StoreQuotaManager(currentQuotaManager, maxQuotaManager);
     }
 
     @Override
-    protected StoreCurrentQuotaManager createCurrentQuotaManager() {
+    protected CurrentQuotaManager createCurrentQuotaManager() {
         return CassandraTestSystemFixture.createCurrentQuotaManager(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
index 0ea0093..ee64a24 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerTestSystem.java
@@ -30,7 +30,6 @@ import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.PreDeletionHooks;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 
 class CassandraMessageIdManagerTestSystem {
@@ -51,7 +50,7 @@ class CassandraMessageIdManagerTestSystem {
 
         CassandraMailboxManager mailboxManager = CassandraTestSystemFixture.createMailboxManager(mapperFactory);
         ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = new ListeningCurrentQuotaUpdater(
-            (StoreCurrentQuotaManager) currentQuotaManager,
+            currentQuotaManager,
             mailboxManager.getQuotaComponents().getQuotaRootResolver(), mailboxManager.getEventBus(), quotaManager);
         mailboxManager.getEventBus().register(listeningCurrentQuotaUpdater);
         return new MessageIdManagerTestSystem(CassandraTestSystemFixture.createMessageIdManager(mapperFactory, quotaManager, mailboxManager.getEventBus(),
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 346d6cb..d87463f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.events.EventBusTestFixture;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.MemoryEventDeadLetters;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.Authenticator;
@@ -52,7 +53,6 @@ import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.QuotaComponents;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
@@ -104,7 +104,7 @@ public class CassandraTestSystemFixture {
             new CassandraGlobalMaxQuotaDao(cassandra.getConf()));
     }
 
-    public static StoreCurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
+    public static CurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
         return new CassandraCurrentQuotaManager(cassandra.getConf());
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
index 93d019c..865a651 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
@@ -41,7 +41,6 @@ import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
 import org.apache.james.task.Task;
 import org.apache.james.user.api.UsersRepository;
@@ -67,7 +66,7 @@ public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurr
     UsersRepositoryImpl usersRepository;
     StoreMailboxManager mailboxManager;
     SessionProvider sessionProvider;
-    StoreCurrentQuotaManager currentQuotaManager;
+    CurrentQuotaManager currentQuotaManager;
     UserQuotaRootResolver userQuotaRootResolver;
     RecomputeCurrentQuotasService testee;
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
index 540b428..60e3db3 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
@@ -21,17 +21,17 @@ package org.apache.james.mailbox.cassandra.quota;
 
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManagerTest;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerTest;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
+class CassandraCurrentQuotaManagerTest extends CurrentQuotaManagerTest {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
 
     @Override
-    protected StoreCurrentQuotaManager provideTestee() {
+    protected CurrentQuotaManager provideTestee() {
         return new CassandraCurrentQuotaManager(cassandraCluster.getCassandraCluster().getConf());
     }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index d2f57ec..f297078 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -32,11 +32,11 @@ import org.apache.james.mailbox.jpa.quota.model.JpaCurrentQuota;
 import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 
 import reactor.core.publisher.Mono;
 
-public class JpaCurrentQuotaManager implements StoreCurrentQuotaManager {
+public class JpaCurrentQuotaManager implements CurrentQuotaManager {
 
     public static final long NO_MESSAGES = 0L;
     public static final long NO_STORED_BYTES = 0L;
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
index 722848c..549341e 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
@@ -24,6 +24,7 @@ import javax.persistence.EntityManagerFactory;
 import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
 import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.domainlist.jpa.model.JPADomain;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
@@ -39,16 +40,14 @@ import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.jpa.JPAUsersRepository;
+import org.apache.james.user.jpa.model.JPAUser;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Disabled;
 
 import com.google.common.collect.ImmutableList;
 
-@Disabled("JAMES-3138 Broken...")
 class JPARecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServiceContract {
 
     static final DomainList NO_DOMAIN_LIST = null;
@@ -56,12 +55,14 @@ class JPARecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServ
     static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(ImmutableList.<Class<?>>builder()
         .addAll(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES)
         .addAll(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES)
+        .add(JPAUser.class)
+        .add(JPADomain.class)
         .build());
 
     JPAUsersRepository usersRepository;
     StoreMailboxManager mailboxManager;
     SessionProvider sessionProvider;
-    StoreCurrentQuotaManager currentQuotaManager;
+    CurrentQuotaManager currentQuotaManager;
     UserQuotaRootResolver userQuotaRootResolver;
     RecomputeCurrentQuotasService testee;
 
@@ -94,6 +95,8 @@ class JPARecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServ
         JPA_TEST_CLUSTER.clear(ImmutableList.<String>builder()
             .addAll(JPAMailboxFixture.MAILBOX_TABLE_NAMES)
             .addAll(JPAMailboxFixture.QUOTA_TABLES_NAMES)
+            .add("JAMES_USER")
+            .add("JAMES_DOMAIN")
             .build());
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
index dbcebc1..c347113 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
@@ -21,16 +21,16 @@ package org.apache.james.mailbox.jpa.quota;
 
 import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManagerTest;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerTest;
 import org.junit.jupiter.api.AfterEach;
 
-class JPACurrentQuotaManagerTest extends StoreCurrentQuotaManagerTest {
+class JPACurrentQuotaManagerTest extends CurrentQuotaManagerTest {
 
     static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES);
 
     @Override
-    protected StoreCurrentQuotaManager provideTestee() {
+    protected CurrentQuotaManager provideTestee() {
         return new JpaCurrentQuotaManager(JPA_TEST_CLUSTER.getEntityManagerFactory());
     }
 
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 32b55cc..45c14cb 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -32,8 +32,8 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
@@ -41,7 +41,7 @@ import com.google.common.cache.LoadingCache;
 
 import reactor.core.publisher.Mono;
 
-public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
+public class InMemoryCurrentQuotaManager implements CurrentQuotaManager {
 
     private final LoadingCache<QuotaRoot, AtomicReference<CurrentQuotas>> quotaCache;
 
@@ -83,6 +83,18 @@ public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
             .onErrorMap(this::wrapAsMailboxException);
     }
 
+    @Override
+    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+        return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
+            .flatMap(storedQuotas -> {
+                if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
+                    return Mono.from(decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size())))
+                        .then(Mono.from(increase(quotaOperation)));
+                }
+                return Mono.empty();
+            });
+    }
+
     private Mono<Void> updateQuota(QuotaRoot quotaRoot, UnaryOperator<CurrentQuotas> quotaFunction) {
         return Mono.fromCallable(() -> quotaCache.get(quotaRoot).updateAndGet(quotaFunction))
             .onErrorMap(this::wrapAsMailboxException)
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
index e6ae74e..06931c9 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
@@ -31,9 +31,9 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.task.Task;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
@@ -120,14 +120,14 @@ public class RecomputeCurrentQuotasService {
     }
 
     private final UsersRepository usersRepository;
-    private final StoreCurrentQuotaManager storeCurrentQuotaManager;
+    private final CurrentQuotaManager storeCurrentQuotaManager;
     private final CurrentQuotaCalculator currentQuotaCalculator;
     private final UserQuotaRootResolver userQuotaRootResolver;
     private final SessionProvider sessionProvider;
 
     @Inject
     public RecomputeCurrentQuotasService(UsersRepository usersRepository,
-                                         StoreCurrentQuotaManager storeCurrentQuotaManager,
+                                         CurrentQuotaManager storeCurrentQuotaManager,
                                          CurrentQuotaCalculator currentQuotaCalculator,
                                          UserQuotaRootResolver userQuotaRootResolver,
                                          SessionProvider sessionProvider) {
@@ -155,7 +155,7 @@ public class RecomputeCurrentQuotasService {
 
         return Mono.fromCallable(() -> currentQuotaCalculator.recalculateCurrentQuotas(quotaRoot, session))
             .map(recalculatedQuotas -> QuotaOperation.from(quotaRoot, recalculatedQuotas))
-            .flatMap(storeCurrentQuotaManager::resetCurrentQuotas)
+            .flatMap(quotaOperation -> Mono.from(storeCurrentQuotaManager.resetCurrentQuotas(quotaOperation)))
             .then(Mono.just(Task.Result.COMPLETED))
             .doOnNext(any -> {
                 LOGGER.info("Current quotas recomputed for {}", quotaRoot);
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index 6223e0d..ac76eb6 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.events.RegistrationKey;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.event.EventFactory;
@@ -50,13 +51,13 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
     public static final Group GROUP = new ListeningCurrentQuotaUpdaterGroup();
     private static final ImmutableSet<RegistrationKey> NO_REGISTRATION_KEYS = ImmutableSet.of();
 
-    private final StoreCurrentQuotaManager currentQuotaManager;
+    private final CurrentQuotaManager currentQuotaManager;
     private final QuotaRootResolver quotaRootResolver;
     private final EventBus eventBus;
     private final QuotaManager quotaManager;
 
     @Inject
-    public ListeningCurrentQuotaUpdater(StoreCurrentQuotaManager currentQuotaManager, QuotaRootResolver quotaRootResolver, EventBus eventBus, QuotaManager quotaManager) {
+    public ListeningCurrentQuotaUpdater(CurrentQuotaManager currentQuotaManager, QuotaRootResolver quotaRootResolver, EventBus eventBus, QuotaManager quotaManager) {
         this.currentQuotaManager = currentQuotaManager;
         this.quotaRootResolver = quotaRootResolver;
         this.eventBus = eventBus;
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
deleted file mode 100644
index a60c729..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
+++ /dev/null
@@ -1,39 +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.store.quota;
-
-import org.apache.james.mailbox.model.CurrentQuotas;
-import org.apache.james.mailbox.model.QuotaOperation;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
-
-import reactor.core.publisher.Mono;
-
-public interface StoreCurrentQuotaManager extends CurrentQuotaManager {
-    default Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
-        return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
-            .flatMap(storedQuotas -> {
-                if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
-                    return Mono.from(decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size())))
-                        .then(Mono.from(increase(quotaOperation)));
-                }
-                return Mono.empty();
-            });
-    }
-}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
index 34c4efb..8624426 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
@@ -37,7 +37,6 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -60,14 +59,14 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     protected abstract MaxQuotaManager createMaxQuotaManager();
     
-    protected abstract StoreCurrentQuotaManager createCurrentQuotaManager();
+    protected abstract CurrentQuotaManager createCurrentQuotaManager();
     
-    protected abstract QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, StoreCurrentQuotaManager currentQuotaManager);
+    protected abstract QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, CurrentQuotaManager currentQuotaManager);
 
     @BeforeEach
     void setUp() throws Exception {
         maxQuotaManager = createMaxQuotaManager();
-        StoreCurrentQuotaManager currentQuotaManager = createCurrentQuotaManager();
+        CurrentQuotaManager currentQuotaManager = createCurrentQuotaManager();
         QuotaManager quotaManager = createQuotaManager(maxQuotaManager, currentQuotaManager);
 
         session = MailboxSessionUtil.create(ALICE);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
similarity index 91%
rename from mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
rename to mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
index 0a673a2..b4dcf62 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
@@ -28,6 +28,7 @@ import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -36,14 +37,14 @@ import com.github.fge.lambdas.Throwing;
 
 import reactor.core.publisher.Mono;
 
-public abstract class StoreCurrentQuotaManagerTest {
+public abstract class CurrentQuotaManagerTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
     private static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     private static final QuotaOperation RESET_QUOTA_OPERATION = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     
-    protected abstract StoreCurrentQuotaManager provideTestee();
+    protected abstract CurrentQuotaManager provideTestee();
     
-    private StoreCurrentQuotaManager testee;
+    private CurrentQuotaManager testee;
 
     @BeforeEach
     void setUp() {
@@ -105,7 +106,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     void resetCurrentQuotasShouldNoopWhenZeroAndNoData() {
         QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(0));
 
-        testee.resetCurrentQuotas(quotaOperation).block();
+        Mono.from(testee.resetCurrentQuotas(quotaOperation)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CurrentQuotas.emptyQuotas());
@@ -113,7 +114,7 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void resetCurrentQuotasShouldReInitQuotasWhenNothing() {
-        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
@@ -123,7 +124,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     void resetCurrentQuotasShouldReInitQuotasWhenData() {
         Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
-        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
@@ -133,8 +134,8 @@ public abstract class StoreCurrentQuotaManagerTest {
     void resetCurrentQuotasShouldBeIdempotent() {
         Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
-        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
-        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
index a43ad52..d775052 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.model.MessageMetaData;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.model.TestId;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -67,14 +68,14 @@ class ListeningCurrentQuotaUpdaterTest {
     static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot(BENWA, Optional.empty());
     static final QuotaOperation QUOTA = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(2), QuotaSizeUsage.size(2 * SIZE));
 
-    StoreCurrentQuotaManager mockedCurrentQuotaManager;
+    CurrentQuotaManager mockedCurrentQuotaManager;
     QuotaRootResolver mockedQuotaRootResolver;
     ListeningCurrentQuotaUpdater testee;
 
     @BeforeEach
     void setUp() {
         mockedQuotaRootResolver = mock(QuotaRootResolver.class);
-        mockedCurrentQuotaManager = mock(StoreCurrentQuotaManager.class);
+        mockedCurrentQuotaManager = mock(CurrentQuotaManager.class);
         EventBus eventBus = mock(EventBus.class);
         when(eventBus.dispatch(any(Event.class), anySet())).thenReturn(Mono.empty());
         testee = new ListeningCurrentQuotaUpdater(mockedCurrentQuotaManager, mockedQuotaRootResolver,
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
index f0101d3..61e7f8f 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
@@ -35,7 +35,6 @@ import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.QuotaUpdater;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
 import com.google.inject.AbstractModule;
@@ -59,7 +58,6 @@ public class CassandraQuotaModule extends AbstractModule {
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
         bind(QuotaRootDeserializer.class).to(DefaultUserQuotaRootResolver.class);
-        bind(StoreCurrentQuotaManager.class).to(CassandraCurrentQuotaManager.class);
         bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
 
         Multibinder<CassandraModule> cassandraDataDefinitions = Multibinder.newSetBinder(binder(), CassandraModule.class);
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java
index d008c3d..c8a4c31 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java
@@ -31,7 +31,6 @@ import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.QuotaUpdater;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
 import com.google.inject.AbstractModule;
@@ -53,7 +52,6 @@ public class JpaQuotaModule extends AbstractModule {
         bind(MaxQuotaManager.class).to(JPAPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(CurrentQuotaManager.class).to(JpaCurrentQuotaManager.class);
-        bind(StoreCurrentQuotaManager.class).to(JpaCurrentQuotaManager.class);
 
         bind(ListeningCurrentQuotaUpdater.class).in(Scopes.SINGLETON);
         bind(QuotaUpdater.class).to(ListeningCurrentQuotaUpdater.class);
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java
index d16becb..f4e3b33 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java
@@ -31,7 +31,6 @@ import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.QuotaUpdater;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
 import com.google.inject.AbstractModule;
@@ -53,7 +52,6 @@ public class MemoryQuotaModule extends AbstractModule {
         bind(MaxQuotaManager.class).to(InMemoryPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(CurrentQuotaManager.class).to(InMemoryCurrentQuotaManager.class);
-        bind(StoreCurrentQuotaManager.class).to(InMemoryCurrentQuotaManager.class);
 
         bind(ListeningCurrentQuotaUpdater.class).in(Scopes.SINGLETON);
         bind(QuotaUpdater.class).to(ListeningCurrentQuotaUpdater.class);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 10/10: JAMES-3138 InMemoryCurrentQuotaManagerTest should implement CurrentQuotaManagerContract

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 79cb3d1783c92a79451e51426019762caf2cecf1
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Apr 21 18:08:58 2020 +0700

    JAMES-3138 InMemoryCurrentQuotaManagerTest should implement CurrentQuotaManagerContract
---
 ...ava => InMemoryCurrentQuotaCalculatorTest.java} |  5 +-
 .../quota/InMemoryCurrentQuotaManagerTest.java     | 78 +++-------------------
 .../store/quota/CurrentQuotaManagerContract.java   |  2 +-
 3 files changed, 13 insertions(+), 72 deletions(-)

diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaCalculatorTest.java
similarity index 96%
copy from mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
copy to mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaCalculatorTest.java
index 99d1191..e4f5b79 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaCalculatorTest.java
@@ -35,8 +35,7 @@ import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-class InMemoryCurrentQuotaManagerTest {
-
+class InMemoryCurrentQuotaCalculatorTest {
     static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
     static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(
         QuotaCountUsage.count(18),
@@ -80,7 +79,7 @@ class InMemoryCurrentQuotaManagerTest {
     }
 
     @Test
-    void getCurrentQuotasShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
+    void getCurrentQuotasShouldReturnRecalculateQuotasWhenEntryIsNotInitialized() throws Exception {
         when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
             .thenReturn(CURRENT_QUOTAS);
 
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
index 99d1191..dcaa37d 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
@@ -19,82 +19,24 @@
 
 package org.apache.james.mailbox.inmemory.quota;
 
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.Optional;
-
-import org.apache.james.core.quota.QuotaCountUsage;
-import org.apache.james.core.quota.QuotaSizeUsage;
-import org.apache.james.mailbox.SessionProvider;
-import org.apache.james.mailbox.model.CurrentQuotas;
-import org.apache.james.mailbox.model.QuotaOperation;
-import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-class InMemoryCurrentQuotaManagerTest {
 
-    static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
-    static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(
-        QuotaCountUsage.count(18),
-        QuotaSizeUsage.size(512));
+class InMemoryCurrentQuotaManagerTest implements CurrentQuotaManagerContract {
 
-    InMemoryCurrentQuotaManager testee;
-    CurrentQuotaCalculator mockedCurrentQuotaCalculator;
+    CurrentQuotaManager testee;
 
     @BeforeEach
     void setUp() {
-        mockedCurrentQuotaCalculator = mock(CurrentQuotaCalculator.class);
-        testee = new InMemoryCurrentQuotaManager(mockedCurrentQuotaCalculator, mock(SessionProvider.class));
-    }
-
-    @Test
-    void getCurrentMessageCountShouldReturnRecalculateMessageCountWhenEntryIsNotInitialized() throws Exception {
-        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
-            .thenReturn(CURRENT_QUOTAS);
+        InMemoryIntegrationResources resources = InMemoryIntegrationResources.defaultResources();
 
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT).block()).isEqualTo(QuotaCountUsage.count(18));
+        testee = resources.getCurrentQuotaManager();
     }
 
-    @Test
-    void getCurrentStorageShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
-        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
-            .thenReturn(CURRENT_QUOTAS);
-
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT).block()).isEqualTo(QuotaSizeUsage.size(512));
-    }
-
-    @Test
-    void getCurrentStorageShouldReRetrieveStoredQuotasWhenCalculateOnUnknownQuotaIsTrue() throws Exception {
-        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
-            .thenReturn(CURRENT_QUOTAS);
-
-        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
-        testee.increase(quotaOperation).block();
-
-        assertThat(testee.getCurrentMessageCount(QUOTA_ROOT).block()).isEqualTo(QuotaCountUsage.count(28));
-        assertThat(testee.getCurrentStorage(QUOTA_ROOT).block()).isEqualTo(QuotaSizeUsage.size(612));
-    }
-
-    @Test
-    void getCurrentQuotasShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
-        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
-            .thenReturn(CURRENT_QUOTAS);
-
-        assertThat(testee.getCurrentQuotas(QUOTA_ROOT).block()).isEqualTo(CURRENT_QUOTAS);
-    }
-
-    @Test
-    void getCurrentQuotasShouldReRetrieveStoredQuotasWhenCalculateOnUnknownQuotaIsTrue() throws Exception {
-        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
-            .thenReturn(CURRENT_QUOTAS);
-
-        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
-        testee.increase(quotaOperation).block();
-
-        assertThat(testee.getCurrentQuotas(QUOTA_ROOT).block()).isEqualTo(new CurrentQuotas(QuotaCountUsage.count(28), QuotaSizeUsage.size(612)));
+    @Override
+    public CurrentQuotaManager testee() {
+        return testee;
     }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
index e79173c..7ed9004 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
@@ -37,7 +37,7 @@ import com.github.fge.lambdas.Throwing;
 import reactor.core.publisher.Mono;
 
 public interface CurrentQuotaManagerContract {
-    QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
+    QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&benwa", Optional.empty());
     CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     QuotaOperation RESET_QUOTA_OPERATION = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 02/10: JAMES-3138 Add getCurrentQuotas in CurrentQuotaManager

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 4a7dfcbf03bc4dbfb3662f08af44496f4b847b37
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Apr 10 15:05:40 2020 +0700

    JAMES-3138 Add getCurrentQuotas in CurrentQuotaManager
---
 .../apache/james/mailbox/model/CurrentQuotas.java  |  4 +++
 .../james/mailbox/quota/CurrentQuotaManager.java   |  2 ++
 .../quota/CassandraCurrentQuotaManager.java        | 37 ++++++++++++++++------
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  |  8 +++++
 .../quota/InMemoryCurrentQuotaManager.java         |  6 ++++
 .../quota/InMemoryCurrentQuotaManagerTest.java     | 19 +++++++++++
 .../store/quota/StoreCurrentQuotaManagerTest.java  | 37 ++++++++++++++++++----
 7 files changed, 97 insertions(+), 16 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
index e155841..3b82866 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
@@ -28,6 +28,10 @@ public class CurrentQuotas {
     private final QuotaCountUsage count;
     private final QuotaSizeUsage size;
 
+    public static CurrentQuotas emptyQuotas() {
+        return new CurrentQuotas(QuotaCountUsage.count(0L), QuotaSizeUsage.size(0L));
+    }
+
     public CurrentQuotas(QuotaCountUsage count, QuotaSizeUsage size) {
         this.count = count;
         this.size = size;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index f1f3d41..1e84e09 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -21,6 +21,7 @@ package org.apache.james.mailbox.quota;
 
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.reactivestreams.Publisher;
 
@@ -33,4 +34,5 @@ public interface CurrentQuotaManager {
 
     Publisher<QuotaSizeUsage> getCurrentStorage(QuotaRoot quotaRoot);
 
+    Publisher<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot);
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index a4ba974..fcda0ca 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -25,6 +25,9 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.incr;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
+import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.MESSAGE_COUNT;
+import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.STORAGE;
+import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.TABLE_NAME;
 
 import javax.inject.Inject;
 
@@ -32,6 +35,7 @@ import org.apache.james.backends.cassandra.utils.CassandraAsyncExecutor;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
@@ -48,23 +52,27 @@ public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
     private final PreparedStatement decreaseStatement;
     private final PreparedStatement getCurrentMessageCountStatement;
     private final PreparedStatement getCurrentStorageStatement;
+    private final PreparedStatement getCurrentQuotasStatement;
 
     @Inject
     public CassandraCurrentQuotaManager(Session session) {
         this.cassandraAsyncExecutor = new CassandraAsyncExecutor(session);
-        this.increaseStatement = session.prepare(update(CassandraCurrentQuota.TABLE_NAME)
-            .with(incr(CassandraCurrentQuota.MESSAGE_COUNT, bindMarker()))
-            .and(incr(CassandraCurrentQuota.STORAGE, bindMarker()))
+        this.increaseStatement = session.prepare(update(TABLE_NAME)
+            .with(incr(MESSAGE_COUNT, bindMarker()))
+            .and(incr(STORAGE, bindMarker()))
             .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
-        this.decreaseStatement = session.prepare(update(CassandraCurrentQuota.TABLE_NAME)
-            .with(decr(CassandraCurrentQuota.MESSAGE_COUNT, bindMarker()))
-            .and(decr(CassandraCurrentQuota.STORAGE, bindMarker()))
+        this.decreaseStatement = session.prepare(update(TABLE_NAME)
+            .with(decr(MESSAGE_COUNT, bindMarker()))
+            .and(decr(STORAGE, bindMarker()))
             .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
-        this.getCurrentMessageCountStatement = session.prepare(select(CassandraCurrentQuota.MESSAGE_COUNT)
-            .from(CassandraCurrentQuota.TABLE_NAME)
+        this.getCurrentMessageCountStatement = session.prepare(select(MESSAGE_COUNT)
+            .from(TABLE_NAME)
             .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
-        this.getCurrentStorageStatement = session.prepare(select(CassandraCurrentQuota.STORAGE)
-            .from(CassandraCurrentQuota.TABLE_NAME)
+        this.getCurrentStorageStatement = session.prepare(select(STORAGE)
+            .from(TABLE_NAME)
+            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+        this.getCurrentQuotasStatement = session.prepare(select(MESSAGE_COUNT, STORAGE)
+            .from(TABLE_NAME)
             .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
     }
 
@@ -95,4 +103,13 @@ public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
             .map(row -> QuotaSizeUsage.size(row.getLong(CassandraCurrentQuota.STORAGE)))
             .defaultIfEmpty(QuotaSizeUsage.size(0L));
     }
+
+    @Override
+    public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
+        return cassandraAsyncExecutor.executeSingleRow(getCurrentQuotasStatement.bind(quotaRoot.getValue()))
+            .map(row -> new CurrentQuotas(
+                QuotaCountUsage.count(row.getLong(MESSAGE_COUNT)),
+                QuotaSizeUsage.size(row.getLong(STORAGE))))
+            .defaultIfEmpty(CurrentQuotas.emptyQuotas());
+    }
 }
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index f56bab0..f79f4a1 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -29,6 +29,7 @@ import org.apache.james.backends.jpa.TransactionRunner;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.jpa.quota.model.JpaCurrentQuota;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
@@ -67,6 +68,13 @@ public class JpaCurrentQuotaManager implements StoreCurrentQuotaManager {
             .orElse(QuotaSizeUsage.size(NO_STORED_BYTES)));
     }
 
+    public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
+        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        return Mono.fromCallable(() ->  Optional.ofNullable(retrieveUserQuota(entityManager, quotaRoot))
+            .map(jpaCurrentQuota -> new CurrentQuotas(jpaCurrentQuota.getMessageCount(), jpaCurrentQuota.getSize()))
+            .orElse(CurrentQuotas.emptyQuotas()));
+    }
+
     @Override
     public Mono<Void> increase(QuotaOperation quotaOperation) {
         return Mono.fromRunnable(() ->
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 326640c..32b55cc 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -77,6 +77,12 @@ public class InMemoryCurrentQuotaManager implements StoreCurrentQuotaManager {
             .onErrorMap(this::wrapAsMailboxException);
     }
 
+    @Override
+    public Mono<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot) {
+        return Mono.fromCallable(() -> quotaCache.get(quotaRoot).get())
+            .onErrorMap(this::wrapAsMailboxException);
+    }
+
     private Mono<Void> updateQuota(QuotaRoot quotaRoot, UnaryOperator<CurrentQuotas> quotaFunction) {
         return Mono.fromCallable(() -> quotaCache.get(quotaRoot).updateAndGet(quotaFunction))
             .onErrorMap(this::wrapAsMailboxException)
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
index 9320964..99d1191 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
@@ -78,4 +78,23 @@ class InMemoryCurrentQuotaManagerTest {
         assertThat(testee.getCurrentMessageCount(QUOTA_ROOT).block()).isEqualTo(QuotaCountUsage.count(28));
         assertThat(testee.getCurrentStorage(QUOTA_ROOT).block()).isEqualTo(QuotaSizeUsage.size(612));
     }
+
+    @Test
+    void getCurrentQuotasShouldReturnRecalculateSizeWhenEntryIsNotInitialized() throws Exception {
+        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
+            .thenReturn(CURRENT_QUOTAS);
+
+        assertThat(testee.getCurrentQuotas(QUOTA_ROOT).block()).isEqualTo(CURRENT_QUOTAS);
+    }
+
+    @Test
+    void getCurrentQuotasShouldReRetrieveStoredQuotasWhenCalculateOnUnknownQuotaIsTrue() throws Exception {
+        when(mockedCurrentQuotaCalculator.recalculateCurrentQuotas(QUOTA_ROOT, null))
+            .thenReturn(CURRENT_QUOTAS);
+
+        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
+        testee.increase(quotaOperation).block();
+
+        assertThat(testee.getCurrentQuotas(QUOTA_ROOT).block()).isEqualTo(new CurrentQuotas(QuotaCountUsage.count(28), QuotaSizeUsage.size(612)));
+    }
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
index 02701fb..74ca11c 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
@@ -25,15 +25,20 @@ import java.util.Optional;
 
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.assertj.core.api.SoftAssertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import com.github.fge.lambdas.Throwing;
+
 import reactor.core.publisher.Mono;
 
 public abstract class StoreCurrentQuotaManagerTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
+    private static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     
     protected abstract StoreCurrentQuotaManager provideTestee();
     
@@ -50,11 +55,24 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
+    void getCurrentMessageCountShouldReturnZeroByDefault() throws Exception {
+        assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(0));
+    }
+
+    @Test
+    void getCurrentQuotasShouldReturnZeroByDefault() {
+        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CurrentQuotas.emptyQuotas());
+    }
+
+    @Test
     void increaseShouldWork() throws Exception {
         testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
 
-        assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
-        assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
+            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
+            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        }));
     }
 
     @Test
@@ -63,15 +81,22 @@ public abstract class StoreCurrentQuotaManagerTest {
 
         testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
 
-        assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
-        assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
+            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
+            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        }));
     }
 
     @Test
     void decreaseShouldNotFailWhenItLeadsToNegativeValues() throws Exception {
         testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
 
-        assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(-10));
-        assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(-100));
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
+                .isEqualTo(new CurrentQuotas(QuotaCountUsage.count(-10), QuotaSizeUsage.size(-100)));
+            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(-10));
+            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(-100));
+        }));
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 05/10: JAMES-3138 Move increase and decrease to CurrentQuotaManager to have a allow a neutral RecomputeCurrentQuotasServiceContract

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit f4312b6ce2bc69052c827d4134fd84d37cb68879
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Apr 17 17:42:38 2020 +0700

    JAMES-3138 Move increase and decrease to CurrentQuotaManager to have a allow a neutral RecomputeCurrentQuotasServiceContract
---
 .../org/apache/james/mailbox/quota/CurrentQuotaManager.java  |  5 +++++
 .../task/CassandraRecomputeCurrentQuotasServiceTest.java     |  3 ++-
 .../jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java  |  3 ++-
 .../mail/task/MemoryRecomputeCurrentQuotasServiceTest.java   |  4 ++--
 .../mailbox/store/quota/ListeningCurrentQuotaUpdater.java    |  8 ++++----
 .../james/mailbox/store/quota/StoreCurrentQuotaManager.java  | 10 ++--------
 .../mail/task/RecomputeCurrentQuotasServiceContract.java     |  8 ++++----
 .../mailbox/store/quota/StoreCurrentQuotaManagerTest.java    | 12 ++++++------
 8 files changed, 27 insertions(+), 26 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index 1e84e09..f99df4b 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.quota;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.reactivestreams.Publisher;
 
@@ -35,4 +36,8 @@ public interface CurrentQuotaManager {
     Publisher<QuotaSizeUsage> getCurrentStorage(QuotaRoot quotaRoot);
 
     Publisher<CurrentQuotas> getCurrentQuotas(QuotaRoot quotaRoot);
+
+    Publisher<Void> increase(QuotaOperation quotaOperation);
+
+    Publisher<Void> decrease(QuotaOperation quotaOperation);
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
index fc53f32..93d019c 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
 import org.apache.james.mailbox.cassandra.CassandraTestSystemFixture;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
@@ -104,7 +105,7 @@ public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurr
     }
 
     @Override
-    public StoreCurrentQuotaManager currentQuotaManager() {
+    public CurrentQuotaManager currentQuotaManager() {
         return currentQuotaManager;
     }
 
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
index 95ba065..722848c 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
@@ -32,6 +32,7 @@ import org.apache.james.mailbox.jpa.JpaMailboxManagerProvider;
 import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
@@ -112,7 +113,7 @@ class JPARecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServ
     }
 
     @Override
-    public StoreCurrentQuotaManager currentQuotaManager() {
+    public CurrentQuotaManager currentQuotaManager() {
         return currentQuotaManager;
     }
 
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
index f9a550d..85c3b1c 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
@@ -26,10 +26,10 @@ import org.apache.james.domainlist.memory.MemoryDomainList;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.junit.jupiter.api.BeforeEach;
@@ -72,7 +72,7 @@ class MemoryRecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasS
     }
 
     @Override
-    public StoreCurrentQuotaManager currentQuotaManager() {
+    public CurrentQuotaManager currentQuotaManager() {
         return resources.getCurrentQuotaManager();
     }
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
index c8bc83a..6223e0d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdater.java
@@ -91,7 +91,7 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
 
     private void handleExpungedEvent(Expunged expunged, QuotaRoot quotaRoot) {
         computeQuotaOperation(expunged, quotaRoot).ifPresent(Throwing.<QuotaOperation>consumer(quotaOperation -> {
-            currentQuotaManager.decrease(quotaOperation)
+            Mono.from(currentQuotaManager.decrease(quotaOperation))
                 .then(Mono.defer(Throwing.supplier(() -> eventBus.dispatch(
                     EventFactory.quotaUpdated()
                         .randomEventId()
@@ -108,7 +108,7 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
 
     private void handleAddedEvent(Added added, QuotaRoot quotaRoot) {
         computeQuotaOperation(added, quotaRoot).ifPresent(Throwing.<QuotaOperation>consumer(quotaOperation -> {
-            currentQuotaManager.increase(quotaOperation)
+            Mono.from(currentQuotaManager.increase(quotaOperation))
                 .then(Mono.defer(Throwing.supplier(() -> eventBus.dispatch(
                     EventFactory.quotaUpdated()
                         .randomEventId()
@@ -143,9 +143,9 @@ public class ListeningCurrentQuotaUpdater implements MailboxListener.GroupMailbo
     private void handleMailboxDeletionEvent(MailboxDeletion mailboxDeletionEvent) throws MailboxException {
         boolean mailboxContainedMessages = mailboxDeletionEvent.getDeletedMessageCount().asLong() > 0;
         if (mailboxContainedMessages) {
-            currentQuotaManager.decrease(new QuotaOperation(mailboxDeletionEvent.getQuotaRoot(),
+            Mono.from(currentQuotaManager.decrease(new QuotaOperation(mailboxDeletionEvent.getQuotaRoot(),
                     mailboxDeletionEvent.getDeletedMessageCount(),
-                    mailboxDeletionEvent.getTotalDeletedSize()))
+                    mailboxDeletionEvent.getTotalDeletedSize())))
                 .block();
         }
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
index 3891326..a60c729 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
@@ -26,20 +26,14 @@ import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import reactor.core.publisher.Mono;
 
 public interface StoreCurrentQuotaManager extends CurrentQuotaManager {
-
-    Mono<Void> increase(QuotaOperation quotaOperation);
-
-    Mono<Void> decrease(QuotaOperation quotaOperation);
-
     default Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
         return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
             .flatMap(storedQuotas -> {
                 if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
-                    return decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size()))
-                        .then(increase(quotaOperation));
+                    return Mono.from(decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size())))
+                        .then(Mono.from(increase(quotaOperation)));
                 }
                 return Mono.empty();
             });
     }
-
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
index d4bb3b0..f9a8f45 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
@@ -34,9 +34,9 @@ import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService.Context;
-import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.task.Task;
 import org.apache.james.user.api.UsersRepository;
@@ -55,7 +55,7 @@ public interface RecomputeCurrentQuotasServiceContract {
     UsersRepository usersRepository();
     SessionProvider sessionProvider();
     MailboxManager mailboxManager();
-    StoreCurrentQuotaManager currentQuotaManager();
+    CurrentQuotaManager currentQuotaManager();
     UserQuotaRootResolver userQuotaRootResolver();
     RecomputeCurrentQuotasService testee();
 
@@ -126,7 +126,7 @@ public interface RecomputeCurrentQuotasServiceContract {
         QuotaRoot quotaRoot = userQuotaRootResolver().forUser(USER_1);
 
         QuotaOperation operation = new QuotaOperation(quotaRoot, QuotaCountUsage.count(3L), QuotaSizeUsage.size(390L));
-        currentQuotaManager().increase(operation).block();
+        Mono.from(currentQuotaManager().increase(operation)).block();
 
         testee().recomputeCurrentQuotas(new Context()).block();
 
@@ -184,7 +184,7 @@ public interface RecomputeCurrentQuotasServiceContract {
         QuotaRoot quotaRoot = userQuotaRootResolver().forUser(USER_1);
 
         QuotaOperation operation = new QuotaOperation(quotaRoot, QuotaCountUsage.count(3L), QuotaSizeUsage.size(390L));
-        currentQuotaManager().increase(operation).block();
+        Mono.from(currentQuotaManager().increase(operation)).block();
 
         Context context = new Context();
         testee().recomputeCurrentQuotas(context).block();
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
index 4ba155c..0a673a2 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
@@ -67,7 +67,7 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void increaseShouldWork() {
-        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
+        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
             softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
@@ -78,9 +78,9 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void decreaseShouldWork() {
-        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
+        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
-        testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
+        Mono.from(testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
             softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
@@ -91,7 +91,7 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void decreaseShouldNotFailWhenItLeadsToNegativeValues() {
-        testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
+        Mono.from(testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
             softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
@@ -121,7 +121,7 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void resetCurrentQuotasShouldReInitQuotasWhenData() {
-        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
+        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
         testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
 
@@ -131,7 +131,7 @@ public abstract class StoreCurrentQuotaManagerTest {
 
     @Test
     void resetCurrentQuotasShouldBeIdempotent() {
-        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
+        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
         testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
         testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 08/10: JAMES-3138 Rename resetCurrentQuotas to setCurrentQuotas

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit dfbfcad422e78d5a74f1b789dacafdf8384b9477
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Apr 21 11:37:08 2020 +0700

    JAMES-3138 Rename resetCurrentQuotas to setCurrentQuotas
---
 .../james/mailbox/quota/CurrentQuotaManager.java       |  2 +-
 .../cassandra/quota/CassandraCurrentQuotaManager.java  |  2 +-
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java      |  2 +-
 .../inmemory/quota/InMemoryCurrentQuotaManager.java    |  2 +-
 .../mailbox/store/quota/CurrentQuotaManagerTest.java   | 18 +++++++++---------
 .../quota/task/RecomputeCurrentQuotasService.java      |  2 +-
 6 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index 8b0164e..b7a205f 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -41,6 +41,6 @@ public interface CurrentQuotaManager {
 
     Publisher<Void> decrease(QuotaOperation quotaOperation);
 
-    Publisher<Void> resetCurrentQuotas(QuotaOperation quotaOperation);
+    Publisher<Void> setCurrentQuotas(QuotaOperation quotaOperation);
 
 }
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index fdb0e85..92c4200 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -115,7 +115,7 @@ public class CassandraCurrentQuotaManager implements CurrentQuotaManager {
     }
 
     @Override
-    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+    public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
         return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
             .flatMap(storedQuotas -> {
                 if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index f297078..3e4c6d1 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -108,7 +108,7 @@ public class JpaCurrentQuotaManager implements CurrentQuotaManager {
     }
 
     @Override
-    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+    public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
         return Mono.fromCallable(() -> getCurrentQuotas(quotaOperation.quotaRoot()))
             .flatMap(storedQuotas -> Mono.fromRunnable(() ->
                 transactionRunner.run(
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 45c14cb..34a9be6 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -84,7 +84,7 @@ public class InMemoryCurrentQuotaManager implements CurrentQuotaManager {
     }
 
     @Override
-    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+    public Mono<Void> setCurrentQuotas(QuotaOperation quotaOperation) {
         return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
             .flatMap(storedQuotas -> {
                 if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
index b4dcf62..e331c95 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
@@ -103,39 +103,39 @@ public abstract class CurrentQuotaManagerTest {
     }
 
     @Test
-    void resetCurrentQuotasShouldNoopWhenZeroAndNoData() {
+    void setCurrentQuotasShouldNoopWhenZeroAndNoData() {
         QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(0));
 
-        Mono.from(testee.resetCurrentQuotas(quotaOperation)).block();
+        Mono.from(testee.setCurrentQuotas(quotaOperation)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CurrentQuotas.emptyQuotas());
     }
 
     @Test
-    void resetCurrentQuotasShouldReInitQuotasWhenNothing() {
-        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+    void setCurrentQuotasShouldReInitQuotasWhenNothing() {
+        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
     }
 
     @Test
-    void resetCurrentQuotasShouldReInitQuotasWhenData() {
+    void setCurrentQuotasShouldReInitQuotasWhenData() {
         Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
-        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
     }
 
     @Test
-    void resetCurrentQuotasShouldBeIdempotent() {
+    void setCurrentQuotasShouldBeIdempotent() {
         Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
 
-        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
-        Mono.from(testee.resetCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
 
         assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
             .isEqualTo(CURRENT_QUOTAS);
diff --git a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
index 46c8d3e..8508b8e 100644
--- a/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
+++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
@@ -155,7 +155,7 @@ public class RecomputeCurrentQuotasService {
 
         return Mono.fromCallable(() -> currentQuotaCalculator.recalculateCurrentQuotas(quotaRoot, session))
             .map(recalculatedQuotas -> QuotaOperation.from(quotaRoot, recalculatedQuotas))
-            .flatMap(quotaOperation -> Mono.from(storeCurrentQuotaManager.resetCurrentQuotas(quotaOperation)))
+            .flatMap(quotaOperation -> Mono.from(storeCurrentQuotaManager.setCurrentQuotas(quotaOperation)))
             .then(Mono.just(Task.Result.COMPLETED))
             .doOnNext(any -> {
                 LOGGER.info("Current quotas recomputed for {}", quotaRoot);


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 09/10: JAMES-3138 Change CurrentQuotaManagerTest into CurrentQuotaManagerContract

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 14bba3e472d575d1d503c67c943d9711712f357b
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Tue Apr 21 17:34:13 2020 +0700

    JAMES-3138 Change CurrentQuotaManagerTest into CurrentQuotaManagerContract
---
 .../quota/CassandraCurrentQuotaManagerTest.java    |   6 +-
 .../jpa/quota/JPACurrentQuotaManagerTest.java      |   6 +-
 .../store/quota/CurrentQuotaManagerContract.java   | 135 +++++++++++++++++++
 .../store/quota/CurrentQuotaManagerTest.java       | 143 ---------------------
 4 files changed, 141 insertions(+), 149 deletions(-)

diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
index 60e3db3..f8f3fe8 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManagerTest.java
@@ -22,16 +22,16 @@ package org.apache.james.mailbox.cassandra.quota;
 import org.apache.james.backends.cassandra.CassandraClusterExtension;
 import org.apache.james.mailbox.cassandra.modules.CassandraQuotaModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerTest;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
-class CassandraCurrentQuotaManagerTest extends CurrentQuotaManagerTest {
+class CassandraCurrentQuotaManagerTest implements CurrentQuotaManagerContract {
 
     @RegisterExtension
     static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraQuotaModule.MODULE);
 
     @Override
-    protected CurrentQuotaManager provideTestee() {
+    public CurrentQuotaManager testee() {
         return new CassandraCurrentQuotaManager(cassandraCluster.getCassandraCluster().getConf());
     }
 }
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
index c347113..1897513 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPACurrentQuotaManagerTest.java
@@ -22,15 +22,15 @@ package org.apache.james.mailbox.jpa.quota;
 import org.apache.james.backends.jpa.JpaTestCluster;
 import org.apache.james.mailbox.jpa.JPAMailboxFixture;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.apache.james.mailbox.store.quota.CurrentQuotaManagerTest;
+import org.apache.james.mailbox.store.quota.CurrentQuotaManagerContract;
 import org.junit.jupiter.api.AfterEach;
 
-class JPACurrentQuotaManagerTest extends CurrentQuotaManagerTest {
+class JPACurrentQuotaManagerTest implements CurrentQuotaManagerContract {
 
     static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES);
 
     @Override
-    protected CurrentQuotaManager provideTestee() {
+    public CurrentQuotaManager testee() {
         return new JpaCurrentQuotaManager(JPA_TEST_CLUSTER.getEntityManagerFactory());
     }
 
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
new file mode 100644
index 0000000..e79173c
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerContract.java
@@ -0,0 +1,135 @@
+/****************************************************************
+ * 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.store.quota;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Optional;
+
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
+import org.assertj.core.api.SoftAssertions;
+import org.junit.jupiter.api.Test;
+
+import com.github.fge.lambdas.Throwing;
+
+import reactor.core.publisher.Mono;
+
+public interface CurrentQuotaManagerContract {
+    QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
+    CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
+    QuotaOperation RESET_QUOTA_OPERATION = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
+    
+    CurrentQuotaManager testee();
+
+    @Test
+    default void getCurrentStorageShouldReturnZeroByDefault() {
+        assertThat(Mono.from(testee().getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(0));
+    }
+
+    @Test
+    default void getCurrentMessageCountShouldReturnZeroByDefault() {
+        assertThat(Mono.from(testee().getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(0));
+    }
+
+    @Test
+    default void getCurrentQuotasShouldReturnZeroByDefault() {
+        assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CurrentQuotas.emptyQuotas());
+    }
+
+    @Test
+    default void increaseShouldWork() {
+        Mono.from(testee().increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
+            softly.assertThat(Mono.from(testee().getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
+            softly.assertThat(Mono.from(testee().getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        }));
+    }
+
+    @Test
+    default void decreaseShouldWork() {
+        Mono.from(testee().increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
+
+        Mono.from(testee().decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
+            softly.assertThat(Mono.from(testee().getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
+            softly.assertThat(Mono.from(testee().getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
+        }));
+    }
+
+    @Test
+    default void decreaseShouldNotFailWhenItLeadsToNegativeValues() {
+        Mono.from(testee().decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
+
+        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
+            softly.assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block())
+                .isEqualTo(new CurrentQuotas(QuotaCountUsage.count(-10), QuotaSizeUsage.size(-100)));
+            softly.assertThat(Mono.from(testee().getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(-10));
+            softly.assertThat(Mono.from(testee().getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(-100));
+        }));
+    }
+
+    @Test
+    default void setCurrentQuotasShouldNoopWhenZeroAndNoData() {
+        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(0));
+
+        Mono.from(testee().setCurrentQuotas(quotaOperation)).block();
+
+        assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CurrentQuotas.emptyQuotas());
+    }
+
+    @Test
+    default void setCurrentQuotasShouldReInitQuotasWhenNothing() {
+        Mono.from(testee().setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+
+        assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
+
+    @Test
+    default void setCurrentQuotasShouldReInitQuotasWhenData() {
+        Mono.from(testee().increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
+
+        Mono.from(testee().setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+
+        assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
+
+    @Test
+    default void setCurrentQuotasShouldBeIdempotent() {
+        Mono.from(testee().increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
+
+        Mono.from(testee().setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+        Mono.from(testee().setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
+
+        assertThat(Mono.from(testee().getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
+}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
deleted file mode 100644
index e331c95..0000000
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/CurrentQuotaManagerTest.java
+++ /dev/null
@@ -1,143 +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.store.quota;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-import java.util.Optional;
-
-import org.apache.james.core.quota.QuotaCountUsage;
-import org.apache.james.core.quota.QuotaSizeUsage;
-import org.apache.james.mailbox.model.CurrentQuotas;
-import org.apache.james.mailbox.model.QuotaOperation;
-import org.apache.james.mailbox.model.QuotaRoot;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
-import org.assertj.core.api.SoftAssertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import com.github.fge.lambdas.Throwing;
-
-import reactor.core.publisher.Mono;
-
-public abstract class CurrentQuotaManagerTest {
-    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
-    private static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
-    private static final QuotaOperation RESET_QUOTA_OPERATION = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
-    
-    protected abstract CurrentQuotaManager provideTestee();
-    
-    private CurrentQuotaManager testee;
-
-    @BeforeEach
-    void setUp() {
-        testee = provideTestee();
-    }
-
-    @Test
-    void getCurrentStorageShouldReturnZeroByDefault() {
-        assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(0));
-    }
-
-    @Test
-    void getCurrentMessageCountShouldReturnZeroByDefault() {
-        assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(0));
-    }
-
-    @Test
-    void getCurrentQuotasShouldReturnZeroByDefault() {
-        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CurrentQuotas.emptyQuotas());
-    }
-
-    @Test
-    void increaseShouldWork() {
-        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
-
-        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
-            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
-            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
-        }));
-    }
-
-    @Test
-    void decreaseShouldWork() {
-        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
-
-        Mono.from(testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
-
-        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block()).isEqualTo(CURRENT_QUOTAS);
-            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(10));
-            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(100));
-        }));
-    }
-
-    @Test
-    void decreaseShouldNotFailWhenItLeadsToNegativeValues() {
-        Mono.from(testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100)))).block();
-
-        SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
-            softly.assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
-                .isEqualTo(new CurrentQuotas(QuotaCountUsage.count(-10), QuotaSizeUsage.size(-100)));
-            softly.assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(-10));
-            softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(-100));
-        }));
-    }
-
-    @Test
-    void setCurrentQuotasShouldNoopWhenZeroAndNoData() {
-        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(0));
-
-        Mono.from(testee.setCurrentQuotas(quotaOperation)).block();
-
-        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
-            .isEqualTo(CurrentQuotas.emptyQuotas());
-    }
-
-    @Test
-    void setCurrentQuotasShouldReInitQuotasWhenNothing() {
-        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
-
-        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
-            .isEqualTo(CURRENT_QUOTAS);
-    }
-
-    @Test
-    void setCurrentQuotasShouldReInitQuotasWhenData() {
-        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
-
-        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
-
-        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
-            .isEqualTo(CURRENT_QUOTAS);
-    }
-
-    @Test
-    void setCurrentQuotasShouldBeIdempotent() {
-        Mono.from(testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200)))).block();
-
-        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
-        Mono.from(testee.setCurrentQuotas(RESET_QUOTA_OPERATION)).block();
-
-        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
-            .isEqualTo(CURRENT_QUOTAS);
-    }
-}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 07/10: JAMES-3138 Move RecomputeQuotaService to a mailbox-tools-quota-recompute module

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 98c0630f2e460ffb3788d85b049e22e683592700
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Apr 21 11:16:41 2020 +0700

    JAMES-3138 Move RecomputeQuotaService to a mailbox-tools-quota-recompute module
    
    This allows removing data-api from mailbox-store dependencies.
---
 mailbox/cassandra/pom.xml                          | 11 +++++
 ...CassandraRecomputeCurrentQuotasServiceTest.java |  4 +-
 mailbox/jpa/pom.xml                                | 11 +++++
 .../task/JPARecomputeCurrentQuotasServiceTest.java |  4 +-
 mailbox/memory/pom.xml                             | 11 +++++
 .../MemoryRecomputeCurrentQuotasServiceTest.java   |  4 +-
 mailbox/pom.xml                                    |  1 +
 mailbox/store/pom.xml                              |  4 --
 mailbox/tools/quota-recompute/pom.xml              | 50 ++++++++++++++++++++++
 .../quota}/task/RecomputeCurrentQuotasService.java |  2 +-
 .../RecomputeCurrentQuotasServiceContract.java     |  4 +-
 pom.xml                                            | 11 +++++
 12 files changed, 104 insertions(+), 13 deletions(-)

diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index 9cbfceb..67e7546 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -69,6 +69,17 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>blob-api</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
index 865a651..c2335c7 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
@@ -36,9 +36,9 @@ import org.apache.james.mailbox.cassandra.CassandraTestSystemFixture;
 import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
diff --git a/mailbox/jpa/pom.xml b/mailbox/jpa/pom.xml
index d6538ae..6183cc6 100644
--- a/mailbox/jpa/pom.xml
+++ b/mailbox/jpa/pom.xml
@@ -69,6 +69,17 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-jpa</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
index 549341e..5d5dfbf 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
@@ -35,9 +35,9 @@ import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.StoreMailboxManager;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.user.api.UsersRepository;
diff --git a/mailbox/memory/pom.xml b/mailbox/memory/pom.xml
index 5676830..20eb170 100644
--- a/mailbox/memory/pom.xml
+++ b/mailbox/memory/pom.xml
@@ -54,6 +54,17 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-data-memory</artifactId>
             <scope>test</scope>
         </dependency>
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
index 85c3b1c..375f055 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
@@ -28,8 +28,8 @@ import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasServiceContract;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.memory.MemoryUsersRepository;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/mailbox/pom.xml b/mailbox/pom.xml
index d36dea7..3aa8e2f 100644
--- a/mailbox/pom.xml
+++ b/mailbox/pom.xml
@@ -72,6 +72,7 @@
         <module>tools/indexer</module>
         <module>tools/jpa-migrator</module>
         <module>tools/maildir-utils</module>
+        <module>tools/quota-recompute</module>
     </modules>
 
     <issueManagement>
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 2785e64..2868ef7 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -69,10 +69,6 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
-            <artifactId>james-server-data-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/tools/quota-recompute/pom.xml b/mailbox/tools/quota-recompute/pom.xml
new file mode 100644
index 0000000..34c21a7
--- /dev/null
+++ b/mailbox/tools/quota-recompute/pom.xml
@@ -0,0 +1,50 @@
+<?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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.james</groupId>
+        <artifactId>apache-james-mailbox</artifactId>
+        <version>3.6.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+
+    <name>Apache James :: Mailbox :: Tools :: Quota recompute</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>apache-james-mailbox-store</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
+            <artifactId>testing-base</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
similarity index 99%
rename from mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
rename to mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
index 06931c9..46c8d3e 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
+++ b/mailbox/tools/quota-recompute/src/main/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasService.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.store.mail.task;
+package org.apache.james.mailbox.quota.task;
 
 import java.util.Collection;
 import java.util.Objects;
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasServiceContract.java
similarity index 98%
rename from mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
rename to mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasServiceContract.java
index f9a8f45..f5784ac 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
+++ b/mailbox/tools/quota-recompute/src/test/java/org/apache/james/mailbox/quota/task/RecomputeCurrentQuotasServiceContract.java
@@ -17,7 +17,7 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.mailbox.store.mail.task;
+package org.apache.james.mailbox.quota.task;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
@@ -36,7 +36,7 @@ import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.UserQuotaRootResolver;
-import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService.Context;
+import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService.Context;
 import org.apache.james.mime4j.dom.Message;
 import org.apache.james.task.Task;
 import org.apache.james.user.api.UsersRepository;
diff --git a/pom.xml b/pom.xml
index 94c7782..fb0b2f0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -928,6 +928,17 @@
             </dependency>
             <dependency>
                 <groupId>${james.groupId}</groupId>
+                <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
+                <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId>
+                <version>${project.version}</version>
+                <type>test-jar</type>
+            </dependency>
+            <dependency>
+                <groupId>${james.groupId}</groupId>
                 <artifactId>apache-james-mpt-antlib</artifactId>
                 <version>${project.version}</version>
             </dependency>


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 01/10: JAMES-3138 Move CurrentQuotas to mailbox-api

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit da779b56e6059d24cff2e71ba77568bf0d37cbae
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Apr 10 10:58:49 2020 +0700

    JAMES-3138 Move CurrentQuotas to mailbox-api
---
 .../apache/james/mailbox/model/CurrentQuotas.java  | 71 ++++++++++++++++++++++
 .../james/mailbox/model/CurrentQuotasTest.java     | 32 ++++++++++
 .../quota/InMemoryCurrentQuotaManager.java         |  2 +-
 .../quota/InMemoryCurrentQuotaManagerTest.java     |  2 +-
 .../store/quota/CurrentQuotaCalculator.java        | 32 +---------
 5 files changed, 106 insertions(+), 33 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
new file mode 100644
index 0000000..e155841
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
@@ -0,0 +1,71 @@
+/****************************************************************
+ * 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.model;
+
+import java.util.Objects;
+
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
+
+public class CurrentQuotas {
+    private final QuotaCountUsage count;
+    private final QuotaSizeUsage size;
+
+    public CurrentQuotas(QuotaCountUsage count, QuotaSizeUsage size) {
+        this.count = count;
+        this.size = size;
+    }
+
+    public QuotaCountUsage count() {
+        return count;
+    }
+
+    public QuotaSizeUsage size() {
+        return size;
+    }
+
+    public CurrentQuotas increase(CurrentQuotas updateQuotas) {
+        return new CurrentQuotas(
+            QuotaCountUsage.count(this.count.asLong() + updateQuotas.count.asLong()),
+            QuotaSizeUsage.size(this.size.asLong() + updateQuotas.size.asLong()));
+    }
+
+    public CurrentQuotas decrease(CurrentQuotas updateQuotas) {
+        return new CurrentQuotas(
+            QuotaCountUsage.count(this.count.asLong() - updateQuotas.count.asLong()),
+            QuotaSizeUsage.size(this.size.asLong() - updateQuotas.size.asLong()));
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof CurrentQuotas) {
+            CurrentQuotas currentQuotas = (CurrentQuotas) o;
+
+            return Objects.equals(this.count, currentQuotas.count)
+                && Objects.equals(this.size, currentQuotas.size);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(count, size);
+    }
+}
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/CurrentQuotasTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/CurrentQuotasTest.java
new file mode 100644
index 0000000..2037d0b
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/CurrentQuotasTest.java
@@ -0,0 +1,32 @@
+/****************************************************************
+ * 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.model;
+
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class CurrentQuotasTest {
+    @Test
+    void shouldRespectBeanContract() {
+        EqualsVerifier.forClass(CurrentQuotas.class)
+            .verify();
+    }
+}
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index fcbe5ff..326640c 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -29,10 +29,10 @@ import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator.CurrentQuotas;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 
 import com.google.common.cache.CacheBuilder;
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
index 26e2b1f..9320964 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
@@ -28,10 +28,10 @@ import java.util.Optional;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator.CurrentQuotas;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
index 4dfbf0f..7c01a09 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/CurrentQuotaCalculator.java
@@ -30,6 +30,7 @@ import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.Mailbox;
 import org.apache.james.mailbox.model.MessageRange;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -64,35 +65,4 @@ public class CurrentQuotaCalculator {
         }
         return new CurrentQuotas(QuotaCountUsage.count(messageCount), QuotaSizeUsage.size(messagesSizes));
     }
-
-    public static class CurrentQuotas {
-        private final QuotaCountUsage count;
-        private final QuotaSizeUsage size;
-
-        public CurrentQuotas(QuotaCountUsage count, QuotaSizeUsage size) {
-            this.count = count;
-            this.size = size;
-        }
-
-        public QuotaCountUsage count() {
-            return count;
-        }
-
-        public QuotaSizeUsage size() {
-            return size;
-        }
-
-        public CurrentQuotas increase(CurrentQuotas updateQuotas) {
-            return new CurrentQuotas(
-                QuotaCountUsage.count(this.count.asLong() + updateQuotas.count.asLong()),
-                QuotaSizeUsage.size(this.size.asLong() + updateQuotas.size.asLong()));
-        }
-
-        public CurrentQuotas decrease(CurrentQuotas updateQuotas) {
-            return new CurrentQuotas(
-                QuotaCountUsage.count(this.count.asLong() - updateQuotas.count.asLong()),
-                QuotaSizeUsage.size(this.size.asLong() - updateQuotas.size.asLong()));
-        }
-    }
-
 }
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 04/10: JAMES-3138 Add resetting current quotas service

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit d254050d80b1509a3682f9804f31a3b84d2614b2
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Apr 10 17:34:52 2020 +0700

    JAMES-3138 Add resetting current quotas service
---
 .../apache/james/mailbox/model/CurrentQuotas.java  |  10 +
 .../apache/james/mailbox/model/QuotaOperation.java |   4 +
 mailbox/cassandra/pom.xml                          |   5 +
 .../quota/CassandraCurrentQuotaManager.java        |  11 +-
 .../CassandraMessageIdManagerQuotaTest.java        |   5 +-
 .../cassandra/CassandraTestSystemFixture.java      |  10 +-
 ...CassandraRecomputeCurrentQuotasServiceTest.java | 160 ++++++++++++++++
 mailbox/jpa/pom.xml                                |   5 +
 .../task/JPARecomputeCurrentQuotasServiceTest.java | 128 +++++++++++++
 mailbox/memory/pom.xml                             |   5 +
 .../MemoryRecomputeCurrentQuotasServiceTest.java   |  83 +++++++++
 .../manager/InMemoryIntegrationResources.java      |  13 +-
 mailbox/store/pom.xml                              |   4 +
 .../mail/task/RecomputeCurrentQuotasService.java   | 170 +++++++++++++++++
 .../store/AbstractMessageIdManagerQuotaTest.java   |   7 +-
 .../RecomputeCurrentQuotasServiceContract.java     | 205 +++++++++++++++++++++
 16 files changed, 807 insertions(+), 18 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
index 38acbaf..f6f0821 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
@@ -24,6 +24,8 @@ import java.util.Objects;
 import org.apache.james.core.quota.QuotaCountUsage;
 import org.apache.james.core.quota.QuotaSizeUsage;
 
+import com.google.common.base.MoreObjects;
+
 public class CurrentQuotas {
     private final QuotaCountUsage count;
     private final QuotaSizeUsage size;
@@ -76,4 +78,12 @@ public class CurrentQuotas {
     public final int hashCode() {
         return Objects.hash(count, size);
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("count", count)
+            .add("size", size)
+            .toString();
+    }
 }
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
index 7fbd3ba..0bd7007 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
@@ -31,6 +31,10 @@ public class QuotaOperation {
     private final QuotaCountUsage count;
     private final QuotaSizeUsage size;
 
+    public static QuotaOperation from(QuotaRoot quotaRoot, CurrentQuotas currentQuotas) {
+        return new QuotaOperation(quotaRoot, currentQuotas.count(), currentQuotas.size());
+    }
+
     public QuotaOperation(QuotaRoot quotaRoot, QuotaCountUsage count, QuotaSizeUsage size) {
         Preconditions.checkArgument(count.asLong() >= 0, "Count should be positive");
         Preconditions.checkArgument(size.asLong() >= 0, "Size should be positive");
diff --git a/mailbox/cassandra/pom.xml b/mailbox/cassandra/pom.xml
index ddc9764..9cbfceb 100644
--- a/mailbox/cassandra/pom.xml
+++ b/mailbox/cassandra/pom.xml
@@ -84,6 +84,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-cassandra</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-task-api</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index fcda0ca..624d003 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -26,6 +26,7 @@ import static com.datastax.driver.core.querybuilder.QueryBuilder.incr;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
 import static com.datastax.driver.core.querybuilder.QueryBuilder.update;
 import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.MESSAGE_COUNT;
+import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.QUOTA_ROOT;
 import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.STORAGE;
 import static org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota.TABLE_NAME;
 
@@ -60,20 +61,20 @@ public class CassandraCurrentQuotaManager implements StoreCurrentQuotaManager {
         this.increaseStatement = session.prepare(update(TABLE_NAME)
             .with(incr(MESSAGE_COUNT, bindMarker()))
             .and(incr(STORAGE, bindMarker()))
-            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+            .where(eq(QUOTA_ROOT, bindMarker())));
         this.decreaseStatement = session.prepare(update(TABLE_NAME)
             .with(decr(MESSAGE_COUNT, bindMarker()))
             .and(decr(STORAGE, bindMarker()))
-            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+            .where(eq(QUOTA_ROOT, bindMarker())));
         this.getCurrentMessageCountStatement = session.prepare(select(MESSAGE_COUNT)
             .from(TABLE_NAME)
-            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+            .where(eq(QUOTA_ROOT, bindMarker())));
         this.getCurrentStorageStatement = session.prepare(select(STORAGE)
             .from(TABLE_NAME)
-            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+            .where(eq(QUOTA_ROOT, bindMarker())));
         this.getCurrentQuotasStatement = session.prepare(select(MESSAGE_COUNT, STORAGE)
             .from(TABLE_NAME)
-            .where(eq(CassandraCurrentQuota.QUOTA_ROOT, bindMarker())));
+            .where(eq(QUOTA_ROOT, bindMarker())));
     }
 
     @Override
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
index 2293ade..675232f 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMessageIdManagerQuotaTest.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.AbstractMessageIdManagerQuotaTest;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
@@ -45,12 +46,12 @@ class CassandraMessageIdManagerQuotaTest extends AbstractMessageIdManagerQuotaTe
     }
 
     @Override
-    protected QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, CurrentQuotaManager currentQuotaManager) {
+    protected QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, StoreCurrentQuotaManager currentQuotaManager) {
         return new StoreQuotaManager(currentQuotaManager, maxQuotaManager);
     }
 
     @Override
-    protected CurrentQuotaManager createCurrentQuotaManager() {
+    protected StoreCurrentQuotaManager createCurrentQuotaManager() {
         return CassandraTestSystemFixture.createCurrentQuotaManager(cassandraCluster.getCassandraCluster());
     }
 }
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index b55ea11..346d6cb 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -36,7 +36,6 @@ import org.apache.james.mailbox.events.EventBusTestFixture;
 import org.apache.james.mailbox.events.InVMEventBus;
 import org.apache.james.mailbox.events.MemoryEventDeadLetters;
 import org.apache.james.mailbox.events.delivery.InVmEventDelivery;
-import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.Authenticator;
@@ -53,19 +52,20 @@ import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.QuotaComponents;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.search.MessageSearchIndex;
 import org.apache.james.mailbox.store.search.SimpleMessageSearchIndex;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 
-class CassandraTestSystemFixture {
+public class CassandraTestSystemFixture {
 
-    static CassandraMailboxSessionMapperFactory createMapperFactory(CassandraCluster cassandra) {
+    public static CassandraMailboxSessionMapperFactory createMapperFactory(CassandraCluster cassandra) {
         CassandraMessageId.Factory messageIdFactory = new CassandraMessageId.Factory();
 
         return TestCassandraMailboxSessionMapperFactory.forTests(cassandra, messageIdFactory);
     }
 
-    static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) {
+    public static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) {
         InVMEventBus eventBus = new InVMEventBus(new InVmEventDelivery(new RecordingMetricFactory()), EventBusTestFixture.RETRY_BACKOFF_CONFIGURATION, new MemoryEventDeadLetters());
         StoreRightManager storeRightManager = new StoreRightManager(mapperFactory, new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), eventBus);
         StoreMailboxAnnotationManager annotationManager = new StoreMailboxAnnotationManager(mapperFactory, storeRightManager);
@@ -104,7 +104,7 @@ class CassandraTestSystemFixture {
             new CassandraGlobalMaxQuotaDao(cassandra.getConf()));
     }
 
-    static CurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
+    public static StoreCurrentQuotaManager createCurrentQuotaManager(CassandraCluster cassandra) {
         return new CassandraCurrentQuotaManager(cassandra.getConf());
     }
 
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
new file mode 100644
index 0000000..fc53f32
--- /dev/null
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/task/CassandraRecomputeCurrentQuotasServiceTest.java
@@ -0,0 +1,160 @@
+/****************************************************************
+ * 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.cassandra.mail.task;
+
+import static org.apache.james.backends.cassandra.Scenario.Builder.fail;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.apache.james.backends.cassandra.CassandraCluster;
+import org.apache.james.backends.cassandra.CassandraClusterExtension;
+import org.apache.james.backends.cassandra.components.CassandraModule;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.domainlist.cassandra.CassandraDomainListModule;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.cassandra.CassandraMailboxSessionMapperFactory;
+import org.apache.james.mailbox.cassandra.CassandraTestSystemFixture;
+import org.apache.james.mailbox.cassandra.mail.MailboxAggregateModule;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
+import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.sieve.cassandra.CassandraSieveRepositoryModule;
+import org.apache.james.task.Task;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.cassandra.CassandraUsersDAO;
+import org.apache.james.user.cassandra.CassandraUsersRepositoryModule;
+import org.apache.james.user.lib.UsersRepositoryImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+import com.google.common.collect.ImmutableList;
+
+public class CassandraRecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServiceContract {
+    static final DomainList NO_DOMAIN_LIST = null;
+
+    @RegisterExtension
+    static CassandraClusterExtension cassandraCluster = new CassandraClusterExtension(CassandraModule.aggregateModules(
+        MailboxAggregateModule.MODULE_WITH_QUOTA,
+        CassandraDomainListModule.MODULE,
+        CassandraSieveRepositoryModule.MODULE,
+        CassandraUsersRepositoryModule.MODULE));
+
+    UsersRepositoryImpl usersRepository;
+    StoreMailboxManager mailboxManager;
+    SessionProvider sessionProvider;
+    StoreCurrentQuotaManager currentQuotaManager;
+    UserQuotaRootResolver userQuotaRootResolver;
+    RecomputeCurrentQuotasService testee;
+
+    @BeforeEach
+    void setUp() {
+        CassandraCluster cassandra = cassandraCluster.getCassandraCluster();
+        CassandraMailboxSessionMapperFactory mapperFactory = CassandraTestSystemFixture.createMapperFactory(cassandra);
+
+        CassandraUsersDAO usersDAO = new CassandraUsersDAO(cassandra.getConf());
+        usersRepository = new UsersRepositoryImpl(NO_DOMAIN_LIST, usersDAO);
+        usersRepository.setEnableVirtualHosting(false);
+
+        mailboxManager = CassandraTestSystemFixture.createMailboxManager(mapperFactory);
+        sessionProvider  = mailboxManager.getSessionProvider();
+        currentQuotaManager = CassandraTestSystemFixture.createCurrentQuotaManager(cassandra);
+        userQuotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mapperFactory);
+        CurrentQuotaCalculator currentQuotaCalculator = new CurrentQuotaCalculator(mapperFactory, userQuotaRootResolver);
+
+        testee = new RecomputeCurrentQuotasService(usersRepository, currentQuotaManager, currentQuotaCalculator, userQuotaRootResolver, sessionProvider);
+    }
+
+    @Override
+    public UsersRepository usersRepository() {
+        return usersRepository;
+    }
+
+    @Override
+    public SessionProvider sessionProvider() {
+        return sessionProvider;
+    }
+
+    @Override
+    public MailboxManager mailboxManager() {
+        return mailboxManager;
+    }
+
+    @Override
+    public StoreCurrentQuotaManager currentQuotaManager() {
+        return currentQuotaManager;
+    }
+
+    @Override
+    public UserQuotaRootResolver userQuotaRootResolver() {
+        return userQuotaRootResolver;
+    }
+
+    @Override
+    public RecomputeCurrentQuotasService testee() {
+        return testee;
+    }
+
+    @Test
+    void recomputeCurrentQuotasShouldReturnPartialWhenFailureAtReset() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        cassandraCluster.getCassandraCluster().getConf().registerScenario(fail()
+            .times(1)
+            .whenQueryStartsWith("UPDATE currentQuota SET"));
+
+        assertThat(testee().recomputeCurrentQuotas(new RecomputeCurrentQuotasService.Context()).block())
+            .isEqualTo(Task.Result.PARTIAL);
+    }
+
+    @Test
+    void recomputeCurrentQuotasShouldUpdateContextWhenFailureAtReset() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        cassandraCluster.getCassandraCluster().getConf().registerScenario(fail()
+            .times(1)
+            .whenQueryStartsWith("UPDATE currentQuota SET"));
+
+        RecomputeCurrentQuotasService.Context context = new RecomputeCurrentQuotasService.Context();
+        testee().recomputeCurrentQuotas(context).block();
+
+        assertThat(context.snapshot())
+            .isEqualTo(new RecomputeCurrentQuotasService.Context(0L,
+                ImmutableList.of(userQuotaRootResolver.forUser(USER_1))).snapshot());
+    }
+}
diff --git a/mailbox/jpa/pom.xml b/mailbox/jpa/pom.xml
index d148681..d6538ae 100644
--- a/mailbox/jpa/pom.xml
+++ b/mailbox/jpa/pom.xml
@@ -69,6 +69,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-jpa</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
new file mode 100644
index 0000000..95ba065
--- /dev/null
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/mail/task/JPARecomputeCurrentQuotasServiceTest.java
@@ -0,0 +1,128 @@
+/****************************************************************
+ * 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.jpa.mail.task;
+
+import javax.persistence.EntityManagerFactory;
+
+import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
+import org.apache.james.backends.jpa.JpaTestCluster;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.jpa.JPAMailboxFixture;
+import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory;
+import org.apache.james.mailbox.jpa.JpaMailboxManagerProvider;
+import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
+import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
+import org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
+import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.jpa.JPAUsersRepository;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+
+import com.google.common.collect.ImmutableList;
+
+@Disabled("JAMES-3138 Broken...")
+class JPARecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServiceContract {
+
+    static final DomainList NO_DOMAIN_LIST = null;
+
+    static final JpaTestCluster JPA_TEST_CLUSTER = JpaTestCluster.create(ImmutableList.<Class<?>>builder()
+        .addAll(JPAMailboxFixture.MAILBOX_PERSISTANCE_CLASSES)
+        .addAll(JPAMailboxFixture.QUOTA_PERSISTANCE_CLASSES)
+        .build());
+
+    JPAUsersRepository usersRepository;
+    StoreMailboxManager mailboxManager;
+    SessionProvider sessionProvider;
+    StoreCurrentQuotaManager currentQuotaManager;
+    UserQuotaRootResolver userQuotaRootResolver;
+    RecomputeCurrentQuotasService testee;
+
+    @BeforeEach
+    void setUp() throws Exception {
+        EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
+        JPAMailboxSessionMapperFactory mapperFactory = new JPAMailboxSessionMapperFactory(entityManagerFactory,
+            new JPAUidProvider(entityManagerFactory),
+            new JPAModSeqProvider(entityManagerFactory));
+
+        usersRepository = new JPAUsersRepository(NO_DOMAIN_LIST);
+        usersRepository.setEntityManagerFactory(JPA_TEST_CLUSTER.getEntityManagerFactory());
+        BaseHierarchicalConfiguration configuration = new BaseHierarchicalConfiguration();
+        configuration.addProperty("enableVirtualHosting", "false");
+        usersRepository.configure(configuration);
+
+        mailboxManager = JpaMailboxManagerProvider.provideMailboxManager(JPA_TEST_CLUSTER);
+        sessionProvider = mailboxManager.getSessionProvider();
+        currentQuotaManager = new JpaCurrentQuotaManager(entityManagerFactory);
+
+        userQuotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mapperFactory);
+
+        CurrentQuotaCalculator currentQuotaCalculator = new CurrentQuotaCalculator(mapperFactory, userQuotaRootResolver);
+
+        testee = new RecomputeCurrentQuotasService(usersRepository, currentQuotaManager, currentQuotaCalculator, userQuotaRootResolver, sessionProvider);
+    }
+
+    @AfterEach
+    void tearDownJpa() {
+        JPA_TEST_CLUSTER.clear(ImmutableList.<String>builder()
+            .addAll(JPAMailboxFixture.MAILBOX_TABLE_NAMES)
+            .addAll(JPAMailboxFixture.QUOTA_TABLES_NAMES)
+            .build());
+    }
+
+    @Override
+    public UsersRepository usersRepository() {
+        return usersRepository;
+    }
+
+    @Override
+    public SessionProvider sessionProvider() {
+        return sessionProvider;
+    }
+
+    @Override
+    public MailboxManager mailboxManager() {
+        return mailboxManager;
+    }
+
+    @Override
+    public StoreCurrentQuotaManager currentQuotaManager() {
+        return currentQuotaManager;
+    }
+
+    @Override
+    public UserQuotaRootResolver userQuotaRootResolver() {
+        return userQuotaRootResolver;
+    }
+
+    @Override
+    public RecomputeCurrentQuotasService testee() {
+        return testee;
+    }
+}
diff --git a/mailbox/memory/pom.xml b/mailbox/memory/pom.xml
index a460862..5676830 100644
--- a/mailbox/memory/pom.xml
+++ b/mailbox/memory/pom.xml
@@ -54,6 +54,11 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
new file mode 100644
index 0000000..f9a550d
--- /dev/null
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/task/MemoryRecomputeCurrentQuotasServiceTest.java
@@ -0,0 +1,83 @@
+/****************************************************************
+ * 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.inmemory.mail.task;
+
+import static org.mockito.Mockito.mock;
+
+import org.apache.james.dnsservice.api.DNSService;
+import org.apache.james.domainlist.memory.MemoryDomainList;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasServiceContract;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.memory.MemoryUsersRepository;
+import org.junit.jupiter.api.BeforeEach;
+
+class MemoryRecomputeCurrentQuotasServiceTest implements RecomputeCurrentQuotasServiceContract {
+
+    MemoryUsersRepository usersRepository;
+    InMemoryIntegrationResources resources;
+    RecomputeCurrentQuotasService testee;
+
+    @BeforeEach
+    void setUp() {
+        DNSService dnsService = mock(DNSService.class);
+        MemoryDomainList memoryDomainList = new MemoryDomainList(dnsService);
+        memoryDomainList.setAutoDetect(false);
+        usersRepository = MemoryUsersRepository.withoutVirtualHosting(memoryDomainList);
+
+        resources = InMemoryIntegrationResources.defaultResources();
+        testee = new RecomputeCurrentQuotasService(usersRepository, resources.getCurrentQuotaManager(), resources.getCurrentQuotaCalculator(), resources.getDefaultUserQuotaRootResolver(), resources.getMailboxManager().getSessionProvider());
+    }
+
+    @Override
+    public RecomputeCurrentQuotasService testee() {
+        return testee;
+    }
+
+    @Override
+    public UsersRepository usersRepository() {
+        return usersRepository;
+    }
+
+    @Override
+    public SessionProvider sessionProvider() {
+        return resources.getMailboxManager().getSessionProvider();
+    }
+
+    @Override
+    public MailboxManager mailboxManager() {
+        return resources.getMailboxManager();
+    }
+
+    @Override
+    public StoreCurrentQuotaManager currentQuotaManager() {
+        return resources.getCurrentQuotaManager();
+    }
+
+    @Override
+    public UserQuotaRootResolver userQuotaRootResolver() {
+        return resources.getDefaultUserQuotaRootResolver();
+    }
+}
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 61e0c8f..b2027a1 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -306,7 +306,8 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
 
             InMemoryPerUserMaxQuotaManager maxQuotaManager = new InMemoryPerUserMaxQuotaManager();
             DefaultUserQuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(sessionProvider, mailboxSessionMapperFactory);
-            InMemoryCurrentQuotaManager currentQuotaManager = new InMemoryCurrentQuotaManager(new CurrentQuotaCalculator(mailboxSessionMapperFactory, quotaRootResolver), sessionProvider);
+            CurrentQuotaCalculator currentQuotaCalculator = new CurrentQuotaCalculator(mailboxSessionMapperFactory, quotaRootResolver);
+            InMemoryCurrentQuotaManager currentQuotaManager = new InMemoryCurrentQuotaManager(currentQuotaCalculator, sessionProvider);
             QuotaManager quotaManager = this.quotaManager.get().apply(new BaseQuotaComponentsStage(maxQuotaManager, currentQuotaManager));
             ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = new ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver, eventBus, quotaManager);
             QuotaComponents quotaComponents = new QuotaComponents(maxQuotaManager, quotaManager, quotaRootResolver);
@@ -342,7 +343,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
 
             StoreBlobManager blobManager = new StoreBlobManager(attachmentManager, messageIdManager, messageIdFactory);
 
-            return new InMemoryIntegrationResources(manager, storeRightManager, messageIdFactory, currentQuotaManager, quotaRootResolver, maxQuotaManager, quotaManager, messageIdManager, index, eventBus, blobManager);
+            return new InMemoryIntegrationResources(manager, storeRightManager, messageIdFactory, currentQuotaCalculator, currentQuotaManager, quotaRootResolver, maxQuotaManager, quotaManager, messageIdManager, index, eventBus, blobManager);
         }
 
         private PreDeletionHooks createHooks(MailboxManagerPreInstanciationStage preInstanciationStage) {
@@ -417,6 +418,7 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
     private final InMemoryMailboxManager mailboxManager;
     private final StoreRightManager storeRightManager;
     private final MessageId.Factory messageIdFactory;
+    private final CurrentQuotaCalculator currentQuotaCalculator;
     private final InMemoryCurrentQuotaManager currentQuotaManager;
     private final DefaultUserQuotaRootResolver defaultUserQuotaRootResolver;
     private final InMemoryPerUserMaxQuotaManager maxQuotaManager;
@@ -426,10 +428,11 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
     private final EventBus eventBus;
     private final StoreBlobManager blobManager;
 
-    InMemoryIntegrationResources(InMemoryMailboxManager mailboxManager, StoreRightManager storeRightManager, MessageId.Factory messageIdFactory, InMemoryCurrentQuotaManager currentQuotaManager, DefaultUserQuotaRootResolver defaultUserQuotaRootResolver, InMemoryPerUserMaxQuotaManager maxQuotaManager, QuotaManager quotaManager, StoreMessageIdManager storeMessageIdManager, MessageSearchIndex searchIndex, EventBus eventBus, StoreBlobManager blobManager) {
+    InMemoryIntegrationResources(InMemoryMailboxManager mailboxManager, StoreRightManager storeRightManager, MessageId.Factory messageIdFactory, CurrentQuotaCalculator currentQuotaCalculator, InMemoryCurrentQuotaManager currentQuotaManager, DefaultUserQuotaRootResolver defaultUserQuotaRootResolver, InMemoryPerUserMaxQuotaManager maxQuotaManager, QuotaManager quotaManager, StoreMessageIdManager storeMessageIdManager, MessageSearchIndex searchIndex, EventBus eventBus, StoreBlobManager blob [...]
         this.mailboxManager = mailboxManager;
         this.storeRightManager = storeRightManager;
         this.messageIdFactory = messageIdFactory;
+        this.currentQuotaCalculator = currentQuotaCalculator;
         this.currentQuotaManager = currentQuotaManager;
         this.defaultUserQuotaRootResolver = defaultUserQuotaRootResolver;
         this.maxQuotaManager = maxQuotaManager;
@@ -448,6 +451,10 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
         return mailboxManager;
     }
 
+    public CurrentQuotaCalculator getCurrentQuotaCalculator() {
+        return currentQuotaCalculator;
+    }
+
     public InMemoryCurrentQuotaManager getCurrentQuotaManager() {
         return currentQuotaManager;
     }
diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml
index 2868ef7..2785e64 100644
--- a/mailbox/store/pom.xml
+++ b/mailbox/store/pom.xml
@@ -69,6 +69,10 @@
         </dependency>
         <dependency>
             <groupId>${james.groupId}</groupId>
+            <artifactId>james-server-data-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${james.groupId}</groupId>
             <artifactId>james-server-util</artifactId>
         </dependency>
         <dependency>
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
new file mode 100644
index 0000000..e6ae74e
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasService.java
@@ -0,0 +1,170 @@
+/****************************************************************
+ * 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.store.mail.task;
+
+import java.util.Collection;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentLinkedDeque;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.Username;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.task.Task;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.apache.james.util.streams.Iterators;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableList;
+
+import reactor.core.publisher.Mono;
+
+public class RecomputeCurrentQuotasService {
+    private static final Logger LOGGER = LoggerFactory.getLogger(RecomputeCurrentQuotasService.class);
+
+    public static class Context {
+        static class Snapshot {
+            private final long processedQuotaRootCount;
+            private final ImmutableList<QuotaRoot> failedQuotaRoots;
+
+            private Snapshot(long processedQuotaRootCount, ImmutableList<QuotaRoot> failedQuotaRoots) {
+                this.processedQuotaRootCount = processedQuotaRootCount;
+                this.failedQuotaRoots = failedQuotaRoots;
+            }
+
+            long getProcessedQuotaRootCount() {
+                return processedQuotaRootCount;
+            }
+
+            ImmutableList<QuotaRoot> getFailedQuotaRoots() {
+                return failedQuotaRoots;
+            }
+
+            @Override
+            public final boolean equals(Object o) {
+                if (o instanceof Snapshot) {
+                    Snapshot that = (Snapshot) o;
+
+                    return Objects.equals(this.processedQuotaRootCount, that.processedQuotaRootCount)
+                        && Objects.equals(this.failedQuotaRoots, that.failedQuotaRoots);
+                }
+                return false;
+            }
+
+            @Override
+            public final int hashCode() {
+                return Objects.hash(processedQuotaRootCount, failedQuotaRoots);
+            }
+
+            @Override
+            public String toString() {
+                return MoreObjects.toStringHelper(this)
+                    .add("processedQuotaRootCount", processedQuotaRootCount)
+                    .add("failedQuotaRoots", failedQuotaRoots)
+                    .toString();
+            }
+        }
+
+        private final AtomicLong processedQuotaRootCount;
+        private final ConcurrentLinkedDeque<QuotaRoot> failedQuotaRoots;
+
+        public Context() {
+            this.processedQuotaRootCount = new AtomicLong();
+            this.failedQuotaRoots = new ConcurrentLinkedDeque<>();
+        }
+
+        public Context(long processedQuotaRootCount, Collection<QuotaRoot> failedQuotaRoots) {
+            this.processedQuotaRootCount = new AtomicLong(processedQuotaRootCount);
+            this.failedQuotaRoots = new ConcurrentLinkedDeque<>(failedQuotaRoots);
+        }
+
+        void incrementProcessed() {
+            processedQuotaRootCount.incrementAndGet();
+        }
+
+        void addToFailedMailboxes(QuotaRoot quotaRoot) {
+            failedQuotaRoots.add(quotaRoot);
+        }
+
+        public Snapshot snapshot() {
+            return new Snapshot(processedQuotaRootCount.get(),
+                ImmutableList.copyOf(failedQuotaRoots));
+        }
+    }
+
+    private final UsersRepository usersRepository;
+    private final StoreCurrentQuotaManager storeCurrentQuotaManager;
+    private final CurrentQuotaCalculator currentQuotaCalculator;
+    private final UserQuotaRootResolver userQuotaRootResolver;
+    private final SessionProvider sessionProvider;
+
+    @Inject
+    public RecomputeCurrentQuotasService(UsersRepository usersRepository,
+                                         StoreCurrentQuotaManager storeCurrentQuotaManager,
+                                         CurrentQuotaCalculator currentQuotaCalculator,
+                                         UserQuotaRootResolver userQuotaRootResolver,
+                                         SessionProvider sessionProvider) {
+        this.usersRepository = usersRepository;
+        this.storeCurrentQuotaManager = storeCurrentQuotaManager;
+        this.currentQuotaCalculator = currentQuotaCalculator;
+        this.userQuotaRootResolver = userQuotaRootResolver;
+        this.sessionProvider = sessionProvider;
+    }
+
+    public Mono<Task.Result> recomputeCurrentQuotas(Context context) {
+        try {
+            return Iterators.toFlux(usersRepository.list())
+                .flatMap(username -> recomputeUserCurrentQuotas(context, username))
+                .reduce(Task.Result.COMPLETED, Task::combine);
+        } catch (UsersRepositoryException e) {
+            LOGGER.error("Error while accessing users from repository", e);
+            return Mono.just(Task.Result.PARTIAL);
+        }
+    }
+
+    private Mono<Task.Result> recomputeUserCurrentQuotas(Context context, Username username) {
+        MailboxSession session = sessionProvider.createSystemSession(username);
+        QuotaRoot quotaRoot = userQuotaRootResolver.forUser(username);
+
+        return Mono.fromCallable(() -> currentQuotaCalculator.recalculateCurrentQuotas(quotaRoot, session))
+            .map(recalculatedQuotas -> QuotaOperation.from(quotaRoot, recalculatedQuotas))
+            .flatMap(storeCurrentQuotaManager::resetCurrentQuotas)
+            .then(Mono.just(Task.Result.COMPLETED))
+            .doOnNext(any -> {
+                LOGGER.info("Current quotas recomputed for {}", quotaRoot);
+                context.incrementProcessed();
+            })
+            .onErrorResume(e -> {
+                LOGGER.error("Error while recomputing current quotas for {}", quotaRoot, e);
+                context.addToFailedMailboxes(quotaRoot);
+                return Mono.just(Task.Result.PARTIAL);
+            });
+    }
+}
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
index 8624426..34c4efb 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/AbstractMessageIdManagerQuotaTest.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -59,14 +60,14 @@ public abstract class AbstractMessageIdManagerQuotaTest {
 
     protected abstract MaxQuotaManager createMaxQuotaManager();
     
-    protected abstract CurrentQuotaManager createCurrentQuotaManager();
+    protected abstract StoreCurrentQuotaManager createCurrentQuotaManager();
     
-    protected abstract QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, CurrentQuotaManager currentQuotaManager);
+    protected abstract QuotaManager createQuotaManager(MaxQuotaManager maxQuotaManager, StoreCurrentQuotaManager currentQuotaManager);
 
     @BeforeEach
     void setUp() throws Exception {
         maxQuotaManager = createMaxQuotaManager();
-        CurrentQuotaManager currentQuotaManager = createCurrentQuotaManager();
+        StoreCurrentQuotaManager currentQuotaManager = createCurrentQuotaManager();
         QuotaManager quotaManager = createQuotaManager(maxQuotaManager, currentQuotaManager);
 
         session = MailboxSessionUtil.create(ALICE);
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
new file mode 100644
index 0000000..d4bb3b0
--- /dev/null
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/task/RecomputeCurrentQuotasServiceContract.java
@@ -0,0 +1,205 @@
+/****************************************************************
+ * 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.store.mail.task;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.nio.charset.StandardCharsets;
+
+import org.apache.james.core.Username;
+import org.apache.james.core.quota.QuotaCountUsage;
+import org.apache.james.core.quota.QuotaSizeUsage;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.SessionProvider;
+import org.apache.james.mailbox.model.CurrentQuotas;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.QuotaOperation;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.mail.task.RecomputeCurrentQuotasService.Context;
+import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
+import org.apache.james.mime4j.dom.Message;
+import org.apache.james.task.Task;
+import org.apache.james.user.api.UsersRepository;
+import org.junit.jupiter.api.Test;
+
+import com.google.common.collect.ImmutableList;
+
+import reactor.core.publisher.Mono;
+
+public interface RecomputeCurrentQuotasServiceContract {
+    Username USER_1 = Username.of("user1");
+    String PASSWORD = "password";
+    MailboxPath MAILBOX_PATH = MailboxPath.forUser(USER_1, "mailbox");
+    CurrentQuotas EXPECTED_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(1L), QuotaSizeUsage.size(103L));
+
+    UsersRepository usersRepository();
+    SessionProvider sessionProvider();
+    MailboxManager mailboxManager();
+    StoreCurrentQuotaManager currentQuotaManager();
+    UserQuotaRootResolver userQuotaRootResolver();
+    RecomputeCurrentQuotasService testee();
+
+    @Test
+    default void recomputeCurrentQuotasShouldReturnCompleteWhenNoData() {
+        assertThat(testee().recomputeCurrentQuotas(new Context()).block())
+            .isEqualTo(Task.Result.COMPLETED);
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldReturnCompleteWhenUserWithNoMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        assertThat(testee().recomputeCurrentQuotas(new Context()).block())
+            .isEqualTo(Task.Result.COMPLETED);
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldComputeEmptyQuotasWhenUserWithNoMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        testee().recomputeCurrentQuotas(new Context()).block();
+
+        assertThat(Mono.from(currentQuotaManager().getCurrentQuotas(userQuotaRootResolver().forUser(USER_1))).block())
+            .isEqualTo(CurrentQuotas.emptyQuotas());
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldReturnCompleteWhenUserWithMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        assertThat(testee().recomputeCurrentQuotas(new Context()).block())
+            .isEqualTo(Task.Result.COMPLETED);
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldRecomputeCurrentQuotasCorrectlyWhenUserWithMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        testee().recomputeCurrentQuotas(new Context()).block();
+
+        assertThat(Mono.from(currentQuotaManager().getCurrentQuotas(userQuotaRootResolver().forUser(USER_1))).block())
+            .isEqualTo(EXPECTED_QUOTAS);
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldResetCurrentQuotasWhenIncorrectQuotas() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        QuotaRoot quotaRoot = userQuotaRootResolver().forUser(USER_1);
+
+        QuotaOperation operation = new QuotaOperation(quotaRoot, QuotaCountUsage.count(3L), QuotaSizeUsage.size(390L));
+        currentQuotaManager().increase(operation).block();
+
+        testee().recomputeCurrentQuotas(new Context()).block();
+
+        assertThat(Mono.from(currentQuotaManager().getCurrentQuotas(userQuotaRootResolver().forUser(USER_1))).block())
+            .isEqualTo(EXPECTED_QUOTAS);
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldNotUpdateContextWhenNoData() {
+        Context context = new Context();
+        testee().recomputeCurrentQuotas(context).block();
+
+        assertThat(context.snapshot()).isEqualToComparingFieldByFieldRecursively(new Context().snapshot());
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldUpdateContextWhenUserWithNoMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        Context context = new Context();
+        testee().recomputeCurrentQuotas(context).block();
+
+        assertThat(context.snapshot())
+            .isEqualTo(new Context(1L, ImmutableList.of()).snapshot());
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldUpdateContextWhenUserWithMessage() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        Context context = new Context();
+        testee().recomputeCurrentQuotas(context).block();
+
+        assertThat(context.snapshot())
+            .isEqualTo(new Context(1L, ImmutableList.of()).snapshot());
+    }
+
+    @Test
+    default void recomputeCurrentQuotasShouldUpdateContextWhenIncorrectQuotas() throws Exception {
+        usersRepository().addUser(USER_1, PASSWORD);
+        usersRepository().addUser(Username.of("user2"), PASSWORD);
+
+        MailboxSession session = sessionProvider().createSystemSession(USER_1);
+        mailboxManager().createMailbox(MAILBOX_PATH, session);
+
+        MessageManager messageManager = mailboxManager().getMailbox(MAILBOX_PATH, session);
+        appendAMessageForUser(messageManager, session);
+
+        QuotaRoot quotaRoot = userQuotaRootResolver().forUser(USER_1);
+
+        QuotaOperation operation = new QuotaOperation(quotaRoot, QuotaCountUsage.count(3L), QuotaSizeUsage.size(390L));
+        currentQuotaManager().increase(operation).block();
+
+        Context context = new Context();
+        testee().recomputeCurrentQuotas(context).block();
+
+        assertThat(context.snapshot())
+            .isEqualTo(new Context(2L, ImmutableList.of()).snapshot());
+    }
+
+    default void appendAMessageForUser(MessageManager messageManager, MailboxSession session) throws Exception {
+        String recipient = "test@localhost.com";
+        String body = "This is a message";
+        messageManager.appendMessage(MessageManager.AppendCommand.from(
+            Message.Builder.of()
+                .setTo(recipient)
+                .setBody(body, StandardCharsets.UTF_8)),
+            session);
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


[james-project] 03/10: JAMES-3138 Allow resetting current quotas

Posted by bt...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 273129e75e2312c4e68ea5e8124a751cf6326262
Author: Rene Cordier <rc...@linagora.com>
AuthorDate: Fri Apr 10 16:07:16 2020 +0700

    JAMES-3138 Allow resetting current quotas
---
 .../apache/james/mailbox/model/CurrentQuotas.java  |  4 ++
 .../apache/james/mailbox/model/QuotaOperation.java |  4 +-
 .../james/mailbox/model/QuotaOperationTest.java    | 13 +++---
 .../mailbox/jpa/quota/JpaCurrentQuotaManager.java  | 14 ++++++
 .../store/quota/StoreCurrentQuotaManager.java      | 12 ++++++
 .../store/quota/StoreCurrentQuotaManagerTest.java  | 50 +++++++++++++++++++---
 6 files changed, 84 insertions(+), 13 deletions(-)

diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
index 3b82866..38acbaf 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/CurrentQuotas.java
@@ -32,6 +32,10 @@ public class CurrentQuotas {
         return new CurrentQuotas(QuotaCountUsage.count(0L), QuotaSizeUsage.size(0L));
     }
 
+    public static CurrentQuotas from(QuotaOperation quotaOperation) {
+        return new CurrentQuotas(quotaOperation.count(), quotaOperation.size());
+    }
+
     public CurrentQuotas(QuotaCountUsage count, QuotaSizeUsage size) {
         this.count = count;
         this.size = size;
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
index f788c40..7fbd3ba 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaOperation.java
@@ -32,8 +32,8 @@ public class QuotaOperation {
     private final QuotaSizeUsage size;
 
     public QuotaOperation(QuotaRoot quotaRoot, QuotaCountUsage count, QuotaSizeUsage size) {
-        Preconditions.checkArgument(count.asLong() > 0, "Count should be strictly positive");
-        Preconditions.checkArgument(size.asLong() > 0, "Size should be strictly positive");
+        Preconditions.checkArgument(count.asLong() >= 0, "Count should be positive");
+        Preconditions.checkArgument(size.asLong() >= 0, "Size should be positive");
 
         this.quotaRoot = quotaRoot;
         this.count = count;
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaOperationTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaOperationTest.java
index 2a71822..2383c36 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaOperationTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaOperationTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.model;
 
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
@@ -39,9 +40,9 @@ class QuotaOperationTest {
     }
 
     @Test
-    void shouldThrowWhenCountIsZero() {
-        assertThatThrownBy(() -> new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(5)))
-            .isInstanceOf(IllegalArgumentException.class);
+    void shouldNotThrowWhenCountIsZero() {
+        assertThatCode(() -> new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(5)))
+            .doesNotThrowAnyException();
     }
 
     @Test
@@ -51,9 +52,9 @@ class QuotaOperationTest {
     }
 
     @Test
-    void shouldThrowWhenSizeIsZero() {
-        assertThatThrownBy(() -> new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(5), QuotaSizeUsage.size(0)))
-            .isInstanceOf(IllegalArgumentException.class);
+    void shouldNotThrowWhenSizeIsZero() {
+        assertThatCode(() -> new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(5), QuotaSizeUsage.size(0)))
+            .doesNotThrowAnyException();
     }
 
     @Test
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index f79f4a1..d2f57ec 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -107,6 +107,20 @@ public class JpaCurrentQuotaManager implements StoreCurrentQuotaManager {
                 }));
     }
 
+    @Override
+    public Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+        return Mono.fromCallable(() -> getCurrentQuotas(quotaOperation.quotaRoot()))
+            .flatMap(storedQuotas -> Mono.fromRunnable(() ->
+                transactionRunner.run(
+                    entityManager -> {
+                        if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
+                            entityManager.merge(new JpaCurrentQuota(quotaOperation.quotaRoot().getValue(),
+                                quotaOperation.count().asLong(),
+                                quotaOperation.size().asLong()));
+                        }
+                    })));
+    }
+
     private JpaCurrentQuota retrieveUserQuota(EntityManager entityManager, QuotaRoot quotaRoot) {
         return entityManager.find(JpaCurrentQuota.class, quotaRoot.getValue());
     }
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
index 5d6cb08..3891326 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManager.java
@@ -19,6 +19,7 @@
 
 package org.apache.james.mailbox.store.quota;
 
+import org.apache.james.mailbox.model.CurrentQuotas;
 import org.apache.james.mailbox.model.QuotaOperation;
 import org.apache.james.mailbox.quota.CurrentQuotaManager;
 
@@ -30,4 +31,15 @@ public interface StoreCurrentQuotaManager extends CurrentQuotaManager {
 
     Mono<Void> decrease(QuotaOperation quotaOperation);
 
+    default Mono<Void> resetCurrentQuotas(QuotaOperation quotaOperation) {
+        return Mono.from(getCurrentQuotas(quotaOperation.quotaRoot()))
+            .flatMap(storedQuotas -> {
+                if (!storedQuotas.equals(CurrentQuotas.from(quotaOperation))) {
+                    return decrease(new QuotaOperation(quotaOperation.quotaRoot(), storedQuotas.count(), storedQuotas.size()))
+                        .then(increase(quotaOperation));
+                }
+                return Mono.empty();
+            });
+    }
+
 }
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
index 74ca11c..4ba155c 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
@@ -39,6 +39,7 @@ import reactor.core.publisher.Mono;
 public abstract class StoreCurrentQuotaManagerTest {
     private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", Optional.empty());
     private static final CurrentQuotas CURRENT_QUOTAS = new CurrentQuotas(QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
+    private static final QuotaOperation RESET_QUOTA_OPERATION = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100));
     
     protected abstract StoreCurrentQuotaManager provideTestee();
     
@@ -50,12 +51,12 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    void getCurrentStorageShouldReturnZeroByDefault() throws Exception {
+    void getCurrentStorageShouldReturnZeroByDefault() {
         assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(0));
     }
 
     @Test
-    void getCurrentMessageCountShouldReturnZeroByDefault() throws Exception {
+    void getCurrentMessageCountShouldReturnZeroByDefault() {
         assertThat(Mono.from(testee.getCurrentMessageCount(QUOTA_ROOT)).block()).isEqualTo(QuotaCountUsage.count(0));
     }
 
@@ -65,7 +66,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    void increaseShouldWork() throws Exception {
+    void increaseShouldWork() {
         testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
@@ -76,7 +77,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    void decreaseShouldWork() throws Exception {
+    void decreaseShouldWork() {
         testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
 
         testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
@@ -89,7 +90,7 @@ public abstract class StoreCurrentQuotaManagerTest {
     }
 
     @Test
-    void decreaseShouldNotFailWhenItLeadsToNegativeValues() throws Exception {
+    void decreaseShouldNotFailWhenItLeadsToNegativeValues() {
         testee.decrease(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(10), QuotaSizeUsage.size(100))).block();
 
         SoftAssertions.assertSoftly(Throwing.consumer(softly -> {
@@ -99,4 +100,43 @@ public abstract class StoreCurrentQuotaManagerTest {
             softly.assertThat(Mono.from(testee.getCurrentStorage(QUOTA_ROOT)).block()).isEqualTo(QuotaSizeUsage.size(-100));
         }));
     }
+
+    @Test
+    void resetCurrentQuotasShouldNoopWhenZeroAndNoData() {
+        QuotaOperation quotaOperation = new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(0), QuotaSizeUsage.size(0));
+
+        testee.resetCurrentQuotas(quotaOperation).block();
+
+        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CurrentQuotas.emptyQuotas());
+    }
+
+    @Test
+    void resetCurrentQuotasShouldReInitQuotasWhenNothing() {
+        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+
+        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
+
+    @Test
+    void resetCurrentQuotasShouldReInitQuotasWhenData() {
+        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
+
+        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+
+        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
+
+    @Test
+    void resetCurrentQuotasShouldBeIdempotent() {
+        testee.increase(new QuotaOperation(QUOTA_ROOT, QuotaCountUsage.count(20), QuotaSizeUsage.size(200))).block();
+
+        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+        testee.resetCurrentQuotas(RESET_QUOTA_OPERATION).block();
+
+        assertThat(Mono.from(testee.getCurrentQuotas(QUOTA_ROOT)).block())
+            .isEqualTo(CURRENT_QUOTAS);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org