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]
