JAMES-2345 Display quota usage in JMAP getMailboxes

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/e3991210
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/e3991210
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/e3991210

Branch: refs/heads/master
Commit: e39912102ee82e971ca3322680f0cfbbe0f2fa67
Parents: df57476
Author: Raphael Ouazana <[email protected]>
Authored: Tue Mar 6 16:45:27 2018 +0100
Committer: Raphael Ouazana <[email protected]>
Committed: Thu Mar 8 09:29:52 2018 +0100

----------------------------------------------------------------------
 .../mailbox/manager/IntegrationResources.java   |  3 ++
 .../manager/InMemoryIntegrationResources.java   | 16 ++++++++---
 .../integration/GetMailboxesMethodTest.java     | 21 ++++++++++++++
 .../apache/james/jmap/model/MailboxFactory.java | 30 ++++++++++++++------
 .../jmap/methods/GetMailboxesMethodTest.java    |  4 ++-
 .../james/jmap/model/MailboxFactoryTest.java    |  5 +++-
 6 files changed, 64 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java
index a76acaf..bb1a868 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/IntegrationResources.java
@@ -23,6 +23,7 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MessageIdManager;
 import org.apache.james.mailbox.acl.GroupMembershipResolver;
 import org.apache.james.mailbox.exception.MailboxException;
+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.quota.QuotaRootResolver;
@@ -38,6 +39,8 @@ public interface IntegrationResources<T extends 
MailboxManager> {
 
     MaxQuotaManager createMaxQuotaManager() throws Exception;
 
+    CurrentQuotaManager createCurrentQuotaManager(T mailboxManager) throws 
Exception;
+
     QuotaRootResolver createQuotaRootResolver(T mailboxManager) throws 
Exception;
 
     GroupMembershipResolver createGroupMembershipResolver() throws Exception;

http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
----------------------------------------------------------------------
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 72654e3..b440613 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
@@ -58,6 +58,7 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
 
     private SimpleGroupMembershipResolver groupMembershipResolver;
     private DefaultUserQuotaRootResolver quotaRootResolver;
+    private InMemoryCurrentQuotaManager currentQuotaManager;
 
     @Override
     public InMemoryMailboxManager createMailboxManager(GroupMembershipResolver 
groupMembershipResolver) throws MailboxException {
@@ -146,10 +147,7 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
 
         QuotaRootResolver quotaRootResolver =  
createQuotaRootResolver(mailboxManager);
 
-        InMemoryCurrentQuotaManager currentQuotaManager = new 
InMemoryCurrentQuotaManager(
-            new CurrentQuotaCalculator(mailboxManager.getMapperFactory(), 
quotaRootResolver),
-            mailboxManager
-        );
+        InMemoryCurrentQuotaManager currentQuotaManager = 
createCurrentQuotaManager(mailboxManager);
 
         ListeningCurrentQuotaUpdater listeningCurrentQuotaUpdater = new 
ListeningCurrentQuotaUpdater(currentQuotaManager, quotaRootResolver);
         StoreQuotaManager quotaManager = new 
StoreQuotaManager(currentQuotaManager, maxQuotaManager);
@@ -160,6 +158,16 @@ public class InMemoryIntegrationResources implements 
IntegrationResources<StoreM
     }
 
     @Override
+    public InMemoryCurrentQuotaManager 
createCurrentQuotaManager(StoreMailboxManager mailboxManager) throws Exception {
+        if (currentQuotaManager == null) {
+            currentQuotaManager = new InMemoryCurrentQuotaManager(
+                    new 
CurrentQuotaCalculator(mailboxManager.getMapperFactory(), 
createQuotaRootResolver(mailboxManager)),
+                    mailboxManager);
+        }
+        return currentQuotaManager;
+    }
+
+    @Override
     public MaxQuotaManager createMaxQuotaManager() throws Exception {
         return new InMemoryPerUserMaxQuotaManager();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
index 820d6bf..c3c49e6 100644
--- 
a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
+++ 
b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/GetMailboxesMethodTest.java
@@ -840,4 +840,25 @@ public abstract class GetMailboxesMethodTest {
             .body(FIRST_MAILBOX + 
".quotas['#private&[email protected]']['STORAGE'].used", equalTo(0))
             .body(FIRST_MAILBOX + 
".quotas['#private&[email protected]']['MESSAGE'].used", equalTo(0));
     }
+
+    @Test
+    public void 
getMailboxesShouldReturnUpdatedQuotasForInboxWhenMailReceived() throws 
Exception {
+        String mailboxId = 
mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, 
DefaultMailboxes.INBOX).serialize();
+        String message = "Subject: hello\r\n\r\nContent";
+        mailboxProbe.appendMessage(alice, MailboxPath.forUser(alice, 
DefaultMailboxes.INBOX),
+                new 
ByteArrayInputStream(message.getBytes(StandardCharsets.UTF_8)),
+                new Date(), true, new Flags());
+
+        given()
+            .header("Authorization", accessToken.serialize())
+            .body("[[\"getMailboxes\", {\"ids\": [\"" + mailboxId + "\"]}, 
\"#0\"]]")
+        .when()
+            .post("/jmap")
+        .then()
+            .statusCode(200)
+            .body(NAME, equalTo("mailboxes"))
+            .body(ARGUMENTS + ".list", hasSize(1))
+            .body(FIRST_MAILBOX + 
".quotas['#private&[email protected]']['STORAGE'].used", 
equalTo(message.length()))
+            .body(FIRST_MAILBOX + 
".quotas['#private&[email protected]']['MESSAGE'].used", equalTo(1));
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
index 665cbb0..7ad48f0 100644
--- 
a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
+++ 
b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/MailboxFactory.java
@@ -42,10 +42,10 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxMetaData;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
-import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.quota.QuotaSize;
+import org.apache.james.mailbox.quota.QuotaValue;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -57,6 +57,7 @@ public class MailboxFactory {
     public static final boolean NO_RESET_RECENT = false;
     private final MailboxManager mailboxManager;
     private final MaxQuotaManager maxQuotaManager;
+    private final CurrentQuotaManager currentQuotaManager;
     private final QuotaRootResolver quotaRootResolver;
 
     public static class MailboxBuilder {
@@ -100,9 +101,10 @@ public class MailboxFactory {
     }
 
     @Inject
-    public MailboxFactory(MailboxManager mailboxManager, MaxQuotaManager 
maxQuotaManager, QuotaRootResolver quotaRootResolver) {
+    public MailboxFactory(MailboxManager mailboxManager, MaxQuotaManager 
maxQuotaManager, CurrentQuotaManager currentQuotaManager, QuotaRootResolver 
quotaRootResolver) {
         this.mailboxManager = mailboxManager;
         this.maxQuotaManager = maxQuotaManager;
+        this.currentQuotaManager = currentQuotaManager;
         this.quotaRootResolver = quotaRootResolver;
     }
 
@@ -146,20 +148,30 @@ public class MailboxFactory {
     private Quotas getQuotas(MailboxPath mailboxPath) throws MailboxException {
         QuotaRoot quotaRoot = quotaRootResolver.getQuotaRoot(mailboxPath);
         return new Quotas(ImmutableMap.of(new QuotaId(quotaRoot), new 
Quotas.Quota(ImmutableMap.of(
-                Type.STORAGE, new Quotas.Value(Number.ZERO, 
getStorageMaxQuota(quotaRoot)),
-                Type.MESSAGE, new Quotas.Value(Number.ZERO, 
getMessageMaxQuota(quotaRoot))))));
+                Type.STORAGE, new 
Quotas.Value(getCurrentStorageQuota(quotaRoot), getStorageMaxQuota(quotaRoot)),
+                Type.MESSAGE, new 
Quotas.Value(getCurrentMessageQuota(quotaRoot), 
getMessageMaxQuota(quotaRoot))))));
+    }
+
+    private Number getCurrentStorageQuota(QuotaRoot quotaRoot) throws 
MailboxException {
+        return 
quotaValueToNumber(currentQuotaManager.getCurrentStorage(quotaRoot));
+    }
+
+    private Number getCurrentMessageQuota(QuotaRoot quotaRoot) throws 
MailboxException {
+        return 
quotaValueToNumber(currentQuotaManager.getCurrentMessageCount(quotaRoot));
     }
 
     private Optional<Number> getStorageMaxQuota(QuotaRoot quotaRoot) throws 
MailboxException {
         return maxQuotaManager.getMaxStorage(quotaRoot)
-            .map(QuotaSize::asLong)
-            .map(Number.BOUND_SANITIZING_FACTORY::from);
+            .map(this::quotaValueToNumber);
     }
 
     private Optional<Number> getMessageMaxQuota(QuotaRoot quotaRoot) throws 
MailboxException {
         return maxQuotaManager.getMaxMessage(quotaRoot)
-            .map(QuotaCount::asLong)
-            .map(Number.BOUND_SANITIZING_FACTORY::from);
+            .map(this::quotaValueToNumber);
+    }
+
+    private Number quotaValueToNumber(QuotaValue<?> value) {
+        return Number.BOUND_SANITIZING_FACTORY.from(value.asLong());
     }
 
     private MailboxNamespace getNamespace(MailboxPath mailboxPath, boolean 
isOwner) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
index 7350eb9..719c626 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
@@ -48,6 +48,7 @@ import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.StoreMailboxManager;
@@ -76,7 +77,8 @@ public class GetMailboxesMethodTest {
         mailboxManager = 
inMemoryIntegrationResources.createMailboxManager(groupMembershipResolver);
         MaxQuotaManager maxQuotaManager = 
inMemoryIntegrationResources.createMaxQuotaManager();
         QuotaRootResolver quotaRootResolver = 
inMemoryIntegrationResources.createQuotaRootResolver(mailboxManager);
-        mailboxFactory = new MailboxFactory(mailboxManager, maxQuotaManager, 
quotaRootResolver);
+        CurrentQuotaManager currentQuotaManager = 
inMemoryIntegrationResources.createCurrentQuotaManager(mailboxManager);
+        mailboxFactory = new MailboxFactory(mailboxManager, maxQuotaManager, 
currentQuotaManager, quotaRootResolver);
 
         getMailboxesMethod = new GetMailboxesMethod(mailboxManager, 
mailboxFactory, new DefaultMetricFactory());
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/e3991210/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
index e0f832c..ce2f541 100644
--- 
a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
+++ 
b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/MailboxFactoryTest.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.manager.ManagerTestResources;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.SimpleMailboxMetaData;
@@ -61,11 +62,13 @@ public class MailboxFactoryTest {
         mailboxManager = 
inMemoryIntegrationResources.createMailboxManager(inMemoryIntegrationResources.createGroupMembershipResolver());
         MaxQuotaManager maxQuotaManager = 
inMemoryIntegrationResources.createMaxQuotaManager();
         QuotaRootResolver quotaRootResolver = 
inMemoryIntegrationResources.createQuotaRootResolver(mailboxManager);
+        CurrentQuotaManager currentQuotaManager = 
inMemoryIntegrationResources.createCurrentQuotaManager(mailboxManager);
+
         user = ManagerTestResources.USER;
         otherUser = ManagerTestResources.OTHER_USER;
         mailboxSession = mailboxManager.login(user, 
ManagerTestResources.USER_PASS);
         otherMailboxSession = mailboxManager.login(otherUser, 
ManagerTestResources.OTHER_USER_PASS);
-        sut = new MailboxFactory(mailboxManager, maxQuotaManager, 
quotaRootResolver);
+        sut = new MailboxFactory(mailboxManager, maxQuotaManager, 
currentQuotaManager, quotaRootResolver);
     }
 
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to