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 ro...@apache.org on 2018/03/08 08:30:47 UTC
[12/17] james-project git commit: JAMES-2345 JMAP Handle max quota
JAMES-2345 JMAP Handle max quota
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/23a634c0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/23a634c0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/23a634c0
Branch: refs/heads/master
Commit: 23a634c08cbfcaa88a055fc97c437a6f737674f8
Parents: bfd7185
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Tue Mar 6 15:28:04 2018 +0100
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Thu Mar 8 09:29:52 2018 +0100
----------------------------------------------------------------------
.../integration/GetMailboxesMethodTest.java | 50 ++++++++++++++++++--
.../apache/james/jmap/model/MailboxFactory.java | 35 ++++++++++++--
.../jmap/methods/GetMailboxesMethodTest.java | 9 +++-
.../james/jmap/model/MailboxFactoryTest.java | 10 ++--
4 files changed, 90 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/23a634c0/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 ed06dd6..820d6bf 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
@@ -40,6 +40,7 @@ import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import java.util.Optional;
import javax.mail.Flags;
@@ -54,11 +55,16 @@ import org.apache.james.mailbox.model.MailboxACL.Right;
import org.apache.james.mailbox.model.MailboxConstants;
import org.apache.james.mailbox.model.MailboxId;
import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.store.mail.model.Mailbox;
+import org.apache.james.mailbox.store.mail.model.SerializableQuotaValue;
import org.apache.james.mailbox.store.probe.ACLProbe;
import org.apache.james.mailbox.store.probe.MailboxProbe;
+import org.apache.james.mailbox.store.probe.QuotaProbe;
import org.apache.james.modules.ACLProbeImpl;
import org.apache.james.modules.MailboxProbeImpl;
+import org.apache.james.modules.QuotaProbesImpl;
import org.apache.james.probe.DataProbe;
import org.apache.james.utils.DataProbeImpl;
import org.apache.james.utils.JmapGuiceProbe;
@@ -91,6 +97,7 @@ public abstract class GetMailboxesMethodTest {
private GuiceJamesServer jmapServer;
private MailboxProbe mailboxProbe;
private ACLProbe aclProbe;
+ private QuotaProbe quotaProbe;
@Before
public void setup() throws Throwable {
@@ -98,6 +105,7 @@ public abstract class GetMailboxesMethodTest {
jmapServer.start();
mailboxProbe = jmapServer.getProbe(MailboxProbeImpl.class);
aclProbe = jmapServer.getProbe(ACLProbeImpl.class);
+ quotaProbe = jmapServer.getProbe(QuotaProbesImpl.class);
RestAssured.requestSpecification = new RequestSpecBuilder()
.setContentType(ContentType.JSON)
@@ -778,8 +786,42 @@ public abstract class GetMailboxesMethodTest {
.statusCode(200)
.body(NAME, equalTo("mailboxes"))
.body(ARGUMENTS + ".list", hasSize(1))
- .body(FIRST_MAILBOX + ".quotas['key']['STORAGE'].max", nullValue())
- .body(FIRST_MAILBOX + ".quotas['key']['MESSAGE'].max", nullValue());
+ .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['STORAGE'].max", nullValue())
+ .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['MESSAGE'].max", nullValue());
+ }
+
+ @Test
+ public void getMailboxesShouldReturnMaxStorageQuotasForInboxWhenSet() throws Exception {
+ quotaProbe.setDefaultMaxStorage(SerializableQuotaValue.valueOf(Optional.of(QuotaSize.size(42))));
+ String mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, DefaultMailboxes.INBOX).serialize();
+
+ 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&alice@domain.tld']['STORAGE'].max", equalTo(42));
+ }
+
+ @Test
+ public void getMailboxesShouldReturnMaxMessageQuotasForInboxWhenSet() throws Exception {
+ quotaProbe.setDefaultMaxMessageCount(SerializableQuotaValue.valueOf(Optional.of(QuotaCount.count(43))));
+ String mailboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, alice, DefaultMailboxes.INBOX).serialize();
+
+ 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&alice@domain.tld']['MESSAGE'].max", equalTo(43));
}
@Test
@@ -795,7 +837,7 @@ public abstract class GetMailboxesMethodTest {
.statusCode(200)
.body(NAME, equalTo("mailboxes"))
.body(ARGUMENTS + ".list", hasSize(1))
- .body(FIRST_MAILBOX + ".quotas['key']['STORAGE'].used", equalTo(0))
- .body(FIRST_MAILBOX + ".quotas['key']['MESSAGE'].used", equalTo(0));
+ .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['STORAGE'].used", equalTo(0))
+ .body(FIRST_MAILBOX + ".quotas['#private&alice@domain.tld']['MESSAGE'].used", equalTo(0));
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/23a634c0/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 8013ed3..665cbb0 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,6 +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.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.quota.QuotaSize;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
@@ -52,6 +56,8 @@ import com.google.common.collect.ImmutableMap;
public class MailboxFactory {
public static final boolean NO_RESET_RECENT = false;
private final MailboxManager mailboxManager;
+ private final MaxQuotaManager maxQuotaManager;
+ private final QuotaRootResolver quotaRootResolver;
public static class MailboxBuilder {
private final MailboxFactory mailboxFactory;
@@ -94,8 +100,10 @@ public class MailboxFactory {
}
@Inject
- public MailboxFactory(MailboxManager mailboxManager) {
+ public MailboxFactory(MailboxManager mailboxManager, MaxQuotaManager maxQuotaManager, QuotaRootResolver quotaRootResolver) {
this.mailboxManager = mailboxManager;
+ this.maxQuotaManager = maxQuotaManager;
+ this.quotaRootResolver = quotaRootResolver;
}
public MailboxBuilder builder() {
@@ -111,11 +119,9 @@ public class MailboxFactory {
MessageManager.MetaData metaData = messageManager.getMetaData(NO_RESET_RECENT, mailboxSession, MessageManager.MetaData.FetchGroup.NO_COUNT);
Rights rights = Rights.fromACL(metaData.getACL())
- .removeEntriesFor(Username.forMailboxPath(messageManager.getMailboxPath()));
+ .removeEntriesFor(Username.forMailboxPath(mailboxPath));
Username username = Username.fromSession(mailboxSession);
- Quotas quotas = new Quotas(ImmutableMap.of(new QuotaId(QuotaRoot.quotaRoot("key")), new Quotas.Quota(ImmutableMap.of(
- Type.STORAGE, new Quotas.Value(Number.ZERO, Optional.empty()),
- Type.MESSAGE, new Quotas.Value(Number.ZERO, Optional.empty())))));
+ Quotas quotas = getQuotas(mailboxPath);
return Mailbox.builder()
.id(messageManager.getId())
@@ -137,6 +143,25 @@ public class MailboxFactory {
.build();
}
+ 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))))));
+ }
+
+ private Optional<Number> getStorageMaxQuota(QuotaRoot quotaRoot) throws MailboxException {
+ return maxQuotaManager.getMaxStorage(quotaRoot)
+ .map(QuotaSize::asLong)
+ .map(Number.BOUND_SANITIZING_FACTORY::from);
+ }
+
+ private Optional<Number> getMessageMaxQuota(QuotaRoot quotaRoot) throws MailboxException {
+ return maxQuotaManager.getMaxMessage(quotaRoot)
+ .map(QuotaCount::asLong)
+ .map(Number.BOUND_SANITIZING_FACTORY::from);
+ }
+
private MailboxNamespace getNamespace(MailboxPath mailboxPath, boolean isOwner) {
if (isOwner) {
return MailboxNamespace.personal();
http://git-wip-us.apache.org/repos/asf/james-project/blob/23a634c0/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 c750526..7350eb9 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,9 @@ 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.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.store.StoreMailboxManager;
import org.apache.james.metrics.logger.DefaultMetricFactory;
import org.assertj.core.groups.Tuple;
import org.junit.Before;
@@ -60,7 +63,7 @@ public class GetMailboxesMethodTest {
private static final String USERNAME = "username@domain.tld";
private static final String USERNAME2 = "username2@domain.tld";
- private MailboxManager mailboxManager;
+ private StoreMailboxManager mailboxManager;
private GetMailboxesMethod getMailboxesMethod;
private ClientId clientId;
private MailboxFactory mailboxFactory;
@@ -71,7 +74,9 @@ public class GetMailboxesMethodTest {
InMemoryIntegrationResources inMemoryIntegrationResources = new InMemoryIntegrationResources();
GroupMembershipResolver groupMembershipResolver = inMemoryIntegrationResources.createGroupMembershipResolver();
mailboxManager = inMemoryIntegrationResources.createMailboxManager(groupMembershipResolver);
- mailboxFactory = new MailboxFactory(mailboxManager);
+ MaxQuotaManager maxQuotaManager = inMemoryIntegrationResources.createMaxQuotaManager();
+ QuotaRootResolver quotaRootResolver = inMemoryIntegrationResources.createQuotaRootResolver(mailboxManager);
+ mailboxFactory = new MailboxFactory(mailboxManager, maxQuotaManager, quotaRootResolver);
getMailboxesMethod = new GetMailboxesMethod(mailboxManager, mailboxFactory, new DefaultMetricFactory());
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/23a634c0/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 4d18bdb..e0f832c 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
@@ -24,7 +24,6 @@ import java.util.Optional;
import org.apache.james.jmap.model.mailbox.Mailbox;
import org.apache.james.jmap.model.mailbox.MailboxNamespace;
-import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.MailboxSession;
import org.apache.james.mailbox.inmemory.InMemoryId;
import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
@@ -32,7 +31,10 @@ 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.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
import org.apache.james.mailbox.store.SimpleMailboxMetaData;
+import org.apache.james.mailbox.store.StoreMailboxManager;
import org.assertj.core.api.JUnitSoftAssertions;
import org.junit.Before;
import org.junit.Rule;
@@ -46,7 +48,7 @@ public class MailboxFactoryTest {
@Rule
public final JUnitSoftAssertions softly = new JUnitSoftAssertions();
- private MailboxManager mailboxManager;
+ private StoreMailboxManager mailboxManager;
private MailboxSession mailboxSession;
private MailboxSession otherMailboxSession;
private String user;
@@ -57,11 +59,13 @@ public class MailboxFactoryTest {
public void setup() throws Exception {
InMemoryIntegrationResources inMemoryIntegrationResources = new InMemoryIntegrationResources();
mailboxManager = inMemoryIntegrationResources.createMailboxManager(inMemoryIntegrationResources.createGroupMembershipResolver());
+ MaxQuotaManager maxQuotaManager = inMemoryIntegrationResources.createMaxQuotaManager();
+ QuotaRootResolver quotaRootResolver = inMemoryIntegrationResources.createQuotaRootResolver(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);
+ sut = new MailboxFactory(mailboxManager, maxQuotaManager, quotaRootResolver);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org