JAMES-2344 Embed domain knowledge as part of the quota root

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

Branch: refs/heads/master
Commit: 40921ed22572cd0f8e9ecaceeea4201a823e171e
Parents: f258987
Author: benwa <[email protected]>
Authored: Tue Mar 13 11:29:50 2018 +0700
Committer: benwa <[email protected]>
Committed: Thu Mar 15 14:40:15 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/QuotaRoot.java   | 16 ++++++++---
 .../james/mailbox/quota/QuotaRootResolver.java  |  2 ++
 .../quota/InMemoryCurrentQuotaManagerTest.java  |  4 ++-
 .../quota/DefaultUserQuotaRootResolver.java     | 30 +++++++++++++++-----
 .../quota/DefaultQuotaRootResolverTest.java     |  6 ++--
 .../store/quota/GenericMaxQuotaManagerTest.java |  4 ++-
 .../quota/ListeningCurrentQuotaUpdaterTest.java |  3 +-
 .../mailbox/store/quota/QuotaCheckerTest.java   |  4 ++-
 .../quota/StoreCurrentQuotaManagerTest.java     |  4 ++-
 .../store/quota/StoreQuotaManagerTest.java      |  2 +-
 .../james/imap/processor/GetQuotaProcessor.java |  8 +++---
 .../imap/processor/GetQuotaProcessorTest.java   |  8 ++++--
 .../processor/GetQuotaRootProcessorTest.java    |  4 ++-
 .../james/cli/QuotaCommandsIntegrationTest.java |  4 ++-
 .../apache/james/modules/QuotaProbesImpl.java   | 13 ++++-----
 .../james/adapter/mailbox/QuotaManagement.java  | 21 +++++++-------
 .../mailbox/MaxQuotaConfigurationReader.java    | 13 +++++++--
 .../META-INF/org/apache/james/spring-server.xml |  1 +
 18 files changed, 99 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java
index 248b7fc..ff421ca 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRoot.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.model;
 
+import java.util.Optional;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
@@ -27,14 +29,16 @@ import com.google.common.base.Objects;
  */
 public class QuotaRoot {
 
-    public static QuotaRoot quotaRoot(String value) {
-        return new QuotaRoot(value);
+    public static QuotaRoot quotaRoot(String value, Optional<String> domain) {
+        return new QuotaRoot(value, domain);
     }
 
     private final String value;
+    private final Optional<String> domain;
 
-    private QuotaRoot(String value) {
+    private QuotaRoot(String value, Optional<String> domain) {
         this.value = value;
+        this.domain = domain;
     }
 
     public boolean equals(Object o) {
@@ -45,13 +49,17 @@ public class QuotaRoot {
     }
 
     public int hashCode() {
-        return Objects.hashCode(value);
+        return Objects.hashCode(value, domain);
     }
 
     public String getValue() {
         return value;
     }
 
+    public Optional<String> getDomain() {
+        return domain;
+    }
+
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("value", value)

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
----------------------------------------------------------------------
diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
 
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
index 80bf8c9..83d5f64 100644
--- 
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
+++ 
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaRootResolver.java
@@ -37,5 +37,7 @@ public interface QuotaRootResolver {
      */
     QuotaRoot getQuotaRoot(MailboxPath mailboxPath) throws MailboxException;
 
+    QuotaRoot fromString(String serializedQuotaRoot) throws MailboxException;
+
     List<MailboxPath> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, 
MailboxSession mailboxSession) throws MailboxException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManagerTest.java
----------------------------------------------------------------------
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 8331d20..3ea0438 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
@@ -23,6 +23,8 @@ 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.mailbox.MailboxManager;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaCount;
@@ -33,7 +35,7 @@ import org.junit.Test;
 
 public class InMemoryCurrentQuotaManagerTest {
 
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa");
+    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", 
Optional.empty());
 
     private InMemoryCurrentQuotaManager testee;
     private CurrentQuotaCalculator mockedCurrentQuotaCalculator;

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
index 98a8816..bbf90a2 100644
--- 
a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
+++ 
b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -50,26 +50,42 @@ public class DefaultUserQuotaRootResolver implements 
UserQuotaRootResolver {
 
     @Override
     public QuotaRoot forUser(User user) {
-        return QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR 
+ user.asString());
+        return QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR 
+ user.asString(),
+            user.getDomainPart());
     }
 
     @Override
-    public QuotaRoot getQuotaRoot(MailboxPath mailboxPath) throws 
MailboxException {
+    public QuotaRoot getQuotaRoot(MailboxPath mailboxPath) {
         
Preconditions.checkArgument(!mailboxPath.getNamespace().contains(SEPARATOR), 
"Namespace should not contain " + SEPARATOR);
         
Preconditions.checkArgument(!mailboxPath.getUser().contains(SEPARATOR), 
"Username should not contain " + SEPARATOR);
-        return QuotaRoot.quotaRoot(mailboxPath.getNamespace() + SEPARATOR + 
mailboxPath.getUser());
+        User user = User.fromUsername(mailboxPath.getUser());
+        return QuotaRoot.quotaRoot(mailboxPath.getNamespace() + SEPARATOR + 
user.asString(),
+            user.getDomainPart());
+    }
+
+    @Override
+    public QuotaRoot fromString(String serializedQuotaRoot) throws 
MailboxException {
+        List<String> parts = toParts(serializedQuotaRoot);
+        User user = User.fromUsername(parts.get(1));
+
+        return QuotaRoot.quotaRoot(serializedQuotaRoot, user.getDomainPart());
     }
 
     @Override
     public List<MailboxPath> retrieveAssociatedMailboxes(QuotaRoot quotaRoot, 
MailboxSession mailboxSession) throws MailboxException {
-        List<String> parts = 
Lists.newArrayList(Splitter.on(SEPARATOR).split(quotaRoot.getValue()));
-        if (parts.size() != 2) {
-            throw new MailboxException(quotaRoot + " used as QuotaRoot should 
contain exactly one \"" + SEPARATOR + "\"");
-        }
+        List<String> parts = toParts(quotaRoot.getValue());
         String namespace = parts.get(0);
         String user = parts.get(1);
         return Lists.transform(factory.getMailboxMapper(mailboxSession)
             .findMailboxWithPathLike(new MailboxPath(namespace, user, "%")),
             Mailbox::generateAssociatedPath);
     }
+
+    public List<String> toParts(String serializedQuotaRoot) throws 
MailboxException {
+        List<String> parts = 
Splitter.on(SEPARATOR).splitToList(serializedQuotaRoot);
+        if (parts.size() != 2) {
+            throw new MailboxException(serializedQuotaRoot + " used as 
QuotaRoot should contain exactly one \"" + SEPARATOR + "\"");
+        }
+        return parts;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolverTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolverTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolverTest.java
index 1c3e95c..4c855bf 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolverTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolverTest.java
@@ -23,6 +23,8 @@ 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.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.QuotaRoot;
@@ -41,7 +43,7 @@ public class DefaultQuotaRootResolverTest {
     public static final MailboxPath PATH_LIKE = MailboxPath.forUser("benwa", 
"%");
     public static final MailboxPath MAILBOX_PATH_2 = 
MailboxPath.forUser("benwa", "test");
     public static final SimpleMailbox MAILBOX_2 = new 
SimpleMailbox(MAILBOX_PATH_2, 10);
-    public static final QuotaRoot QUOTA_ROOT = 
QuotaRoot.quotaRoot("#private&benwa");
+    public static final QuotaRoot QUOTA_ROOT = 
QuotaRoot.quotaRoot("#private&benwa", Optional.empty());
 
     private DefaultUserQuotaRootResolver testee;
     private MailboxSessionMapperFactory mockedFactory;
@@ -77,7 +79,7 @@ public class DefaultQuotaRootResolverTest {
 
     @Test(expected = MailboxException.class)
     public void 
retrieveAssociatedMailboxesShouldThrowWhenQuotaRootContainsSeparator2Times() 
throws Exception {
-        
testee.retrieveAssociatedMailboxes(QuotaRoot.quotaRoot("#private&be&nwa"), 
null);
+        
testee.retrieveAssociatedMailboxes(QuotaRoot.quotaRoot("#private&be&nwa", 
Optional.empty()), null);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
index b2f152c..8452fb3 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/GenericMaxQuotaManagerTest.java
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.store.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Optional;
+
 import org.apache.james.mailbox.model.Quota;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
@@ -41,7 +43,7 @@ public abstract class GenericMaxQuotaManagerTest {
     @Before
     public void setUp() {
         maxQuotaManager = provideMaxQuotaManager();
-        quotaRoot = QuotaRoot.quotaRoot("benwa");
+        quotaRoot = QuotaRoot.quotaRoot("benwa", Optional.empty());
         domain = "domain";
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/ListeningCurrentQuotaUpdaterTest.java
----------------------------------------------------------------------
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 3fe73df..f2e9c7d 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
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Date;
+import java.util.Optional;
 
 import javax.mail.Flags;
 
@@ -44,7 +45,7 @@ public class ListeningCurrentQuotaUpdaterTest {
 
     public static final int SIZE = 45;
     public static final MailboxPath MAILBOX_PATH = 
MailboxPath.forUser("benwa", "INBOX");
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa");
+    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", 
Optional.empty());
 
     private StoreCurrentQuotaManager mockedCurrentQuotaManager;
     private QuotaRootResolver mockedQuotaRootResolver;

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
index d85336b..0f3aee1 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/QuotaCheckerTest.java
@@ -23,6 +23,8 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.Optional;
+
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.OverQuotaException;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -38,7 +40,7 @@ import org.junit.Test;
 
 public class QuotaCheckerTest {
 
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa");
+    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", 
Optional.empty());
     public static final MailboxPath MAILBOX_PATH = 
MailboxPath.forUser("benwa", "INBOX");
     public static final SimpleMailbox MAILBOX = new 
SimpleMailbox(MAILBOX_PATH, 10);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreCurrentQuotaManagerTest.java
----------------------------------------------------------------------
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 c5c51b9..4fb109d 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
@@ -21,6 +21,8 @@ package org.apache.james.mailbox.store.quota;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Optional;
+
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaSize;
@@ -28,7 +30,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 public abstract class StoreCurrentQuotaManagerTest {
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa");
+    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("benwa", 
Optional.empty());
     
     protected abstract StoreCurrentQuotaManager provideTestee();
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
----------------------------------------------------------------------
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
index 2d7ed2a..36a9750 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/quota/StoreQuotaManagerTest.java
@@ -46,7 +46,7 @@ public class StoreQuotaManagerTest {
         mockedCurrentQuotaManager = mock(CurrentQuotaManager.class);
         mockedMaxQuotaManager = mock(MaxQuotaManager.class);
         testee = new StoreQuotaManager(mockedCurrentQuotaManager, 
mockedMaxQuotaManager);
-        quotaRoot = QuotaRoot.quotaRoot("benwa");
+        quotaRoot = QuotaRoot.quotaRoot("benwa", Optional.empty());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
index 3f4d63f..1e24ccc 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/GetQuotaProcessor.java
@@ -77,8 +77,8 @@ public class GetQuotaProcessor extends 
AbstractMailboxProcessor<GetQuotaRequest>
     @Override
     protected void doProcess(GetQuotaRequest message, ImapSession session, 
String tag, ImapCommand command, Responder responder) {
         try {
-            if (hasRight(message.getQuotaRoot(), session)) {
-                QuotaRoot quotaRoot = 
QuotaRoot.quotaRoot(message.getQuotaRoot());
+            QuotaRoot quotaRoot = 
quotaRootResolver.fromString(message.getQuotaRoot());
+            if (hasRight(quotaRoot, session)) {
                 Quota<QuotaCount> messageQuota = 
quotaManager.getMessageQuota(quotaRoot);
                 Quota<QuotaSize> storageQuota = 
quotaManager.getStorageQuota(quotaRoot);
                 if (messageQuota.getLimit().isLimited()) {
@@ -102,10 +102,10 @@ public class GetQuotaProcessor extends 
AbstractMailboxProcessor<GetQuotaRequest>
         }
     }
 
-    private boolean hasRight(String quotaRoot, ImapSession session) throws 
MailboxException {
+    private boolean hasRight(QuotaRoot quotaRoot, ImapSession session) throws 
MailboxException {
         // If any of the mailboxes owned by quotaRoot user can be read by the 
current user, then we should respond to him.
         final MailboxSession mailboxSession = 
ImapSessionUtils.getMailboxSession(session);
-        List<MailboxPath> mailboxList = 
quotaRootResolver.retrieveAssociatedMailboxes(QuotaRoot.quotaRoot(quotaRoot), 
mailboxSession);
+        List<MailboxPath> mailboxList = 
quotaRootResolver.retrieveAssociatedMailboxes(quotaRoot, mailboxSession);
         for (MailboxPath mailboxPath : mailboxList) {
             if (getMailboxManager().hasRight(mailboxPath, 
MailboxACL.Right.Read, mailboxSession)) {
                 return true;

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
index 45eec7f..50cc173 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaProcessorTest.java
@@ -20,12 +20,15 @@
 package org.apache.james.imap.processor;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
+import java.util.Optional;
+
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -56,7 +59,7 @@ import com.google.common.collect.ImmutableList;
 
 public class GetQuotaProcessorTest {
 
-    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop");
+    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", 
Optional.empty());
     public static final MailboxPath MAILBOX_PATH = new 
MailboxPath("namespace", "plop", "INBOX");
     public static final Quota<QuotaCount> MESSAGE_QUOTA =
         
Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();
@@ -72,12 +75,13 @@ public class GetQuotaProcessorTest {
     private MailboxSession mailboxSession;
 
     @Before
-    public void setUp() {
+    public void setUp() throws Exception {
         mailboxSession = new MockMailboxSession("plop");
         UnpooledStatusResponseFactory statusResponseFactory = new 
UnpooledStatusResponseFactory();
         mockedImapSession = mock(ImapSession.class);
         mockedQuotaManager = mock(QuotaManager.class);
         mockedQuotaRootResolver = mock(QuotaRootResolver.class);
+        
when(mockedQuotaRootResolver.fromString(eq(QUOTA_ROOT.getValue()))).thenReturn(QUOTA_ROOT);
         mockedResponder = mock(ImapProcessor.Responder.class);
         mockedMailboxManager = mock(MailboxManager.class);
         testee = new GetQuotaProcessor(mock(ImapProcessor.class), 
mockedMailboxManager,

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
----------------------------------------------------------------------
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
index 8220517..e907c1e 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/GetQuotaRootProcessorTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.imap.processor;
 
+import java.util.Optional;
+
 import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.ImapSessionState;
 import org.apache.james.imap.api.ImapSessionUtils;
@@ -50,7 +52,7 @@ import org.junit.Test;
 
 public class GetQuotaRootProcessorTest {
 
-    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop");
+    private static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("plop", 
Optional.empty());
     public static final MailboxPath MAILBOX_PATH = MailboxPath.forUser("plop", 
"INBOX");
     public static final Quota<QuotaCount> MESSAGE_QUOTA =
         
Quota.<QuotaCount>builder().used(QuotaCount.count(24)).computedLimit(QuotaCount.count(1589)).build();

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/server/container/cli-integration/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/cli-integration/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java
 
b/server/container/cli-integration/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java
index 6875461..9bd5ab6 100644
--- 
a/server/container/cli-integration/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java
+++ 
b/server/container/cli-integration/src/test/java/org/apache/james/cli/QuotaCommandsIntegrationTest.java
@@ -22,6 +22,8 @@ package org.apache.james.cli;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 
+import java.util.Optional;
+
 import org.apache.james.GuiceJamesServer;
 import org.apache.james.MemoryJmapTestRule;
 import org.apache.james.cli.util.OutputCapture;
@@ -36,7 +38,7 @@ import org.junit.Test;
 
 public class QuotaCommandsIntegrationTest {
     public static final String USER = "user";
-    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&" 
+ USER);
+    public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&" 
+ USER, Optional.empty());
     private OutputCapture outputCapture;
 
     @Rule

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
index b384573..35bcd5c 100644
--- 
a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
+++ 
b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/QuotaProbesImpl.java
@@ -23,7 +23,6 @@ import javax.inject.Inject;
 
 import org.apache.james.mailbox.exception.MailboxException;
 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.QuotaManager;
@@ -56,22 +55,22 @@ public class QuotaProbesImpl implements QuotaProbe, 
GuiceProbe {
 
     @Override
     public SerializableQuota<QuotaCount> getMessageCountQuota(String 
quotaRoot) throws MailboxException {
-        return 
SerializableQuota.newInstance(quotaManager.getMessageQuota(QuotaRoot.quotaRoot(quotaRoot)));
+        return 
SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
     public SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) 
throws MailboxException {
-        return 
SerializableQuota.newInstance(quotaManager.getStorageQuota(QuotaRoot.quotaRoot(quotaRoot)));
+        return 
SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
     public SerializableQuotaValue<QuotaCount> getMaxMessageCount(String 
quotaRoot) throws MailboxException {
-        return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(QuotaRoot.quotaRoot(quotaRoot)));
+        return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
     public SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) 
throws MailboxException {
-        return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(QuotaRoot.quotaRoot(quotaRoot)));
+        return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
     }
 
     @Override
@@ -89,7 +88,7 @@ public class QuotaProbesImpl implements QuotaProbe, 
GuiceProbe {
         maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaCount value) -> 
maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(quotaRoot), value))
+                    (QuotaCount value) -> 
maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
                     .sneakyThrow());
     }
 
@@ -98,7 +97,7 @@ public class QuotaProbesImpl implements QuotaProbe, 
GuiceProbe {
         maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaSize value) -> 
maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(quotaRoot), value))
+                    (QuotaSize value) -> 
maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
                     .sneakyThrow());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
----------------------------------------------------------------------
diff --git 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
index ebf28d3..0e05d8c 100644
--- 
a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
+++ 
b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/QuotaManagement.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
 
 import org.apache.james.mailbox.exception.MailboxException;
 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.QuotaManager;
@@ -72,7 +71,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxMessageCount")
                      .build()) {
-            return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(QuotaRoot.quotaRoot(quotaRoot)));
+            return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -85,7 +84,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxStorage")
                      .build()) {
-            return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(QuotaRoot.quotaRoot(quotaRoot)));
+            return 
SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -118,7 +117,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
     }
 
     @Override
-    public void setMaxMessageCount(String quotaRoot, 
SerializableQuotaValue<QuotaCount> maxMessageCount) throws MailboxException {
+    public void setMaxMessageCount(String quotaRoot, 
SerializableQuotaValue<QuotaCount> maxMessageCount) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -127,7 +126,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
             maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
                 .ifPresent(
                     Throwing.consumer((QuotaCount value) ->
-                        
maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(quotaRoot), value))
+                        
maxQuotaManager.setMaxMessage(quotaRootResolver.fromString(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
             throw Throwables.propagate(e);
@@ -135,7 +134,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
     }
 
     @Override
-    public void setMaxStorage(String quotaRoot, 
SerializableQuotaValue<QuotaSize> maxSize) throws MailboxException {
+    public void setMaxStorage(String quotaRoot, 
SerializableQuotaValue<QuotaSize> maxSize) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -144,7 +143,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
             maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
                 .ifPresent(
                     Throwing.consumer((QuotaSize value) ->
-                        
maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(quotaRoot), value))
+                        
maxQuotaManager.setMaxStorage(quotaRootResolver.fromString(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
             throw Throwables.propagate(e);
@@ -152,7 +151,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
     }
 
     @Override
-    public void setDefaultMaxMessageCount(SerializableQuotaValue<QuotaCount> 
maxDefaultMessageCount) throws MailboxException {
+    public void setDefaultMaxMessageCount(SerializableQuotaValue<QuotaCount> 
maxDefaultMessageCount) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -167,7 +166,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
     }
 
     @Override
-    public void setDefaultMaxStorage(SerializableQuotaValue<QuotaSize> 
maxDefaultSize) throws MailboxException {
+    public void setDefaultMaxStorage(SerializableQuotaValue<QuotaSize> 
maxDefaultSize) {
         try (Closeable closeable =
                  MDCBuilder.create()
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
@@ -188,7 +187,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMessageCountQuota")
                      .build()) {
-            return 
SerializableQuota.newInstance(quotaManager.getMessageQuota(QuotaRoot.quotaRoot(quotaRoot)));
+            return 
SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -201,7 +200,7 @@ public class QuotaManagement implements 
QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getStorageQuota")
                      .build()) {
-            return 
SerializableQuota.newInstance(quotaManager.getStorageQuota(QuotaRoot.quotaRoot(quotaRoot)));
+            return 
SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.fromString(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
----------------------------------------------------------------------
diff --git 
a/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
 
b/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
index 229d65a..20be525 100644
--- 
a/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
+++ 
b/server/container/spring/src/main/java/org/apache/james/container/spring/mailbox/MaxQuotaConfigurationReader.java
@@ -30,14 +30,17 @@ import org.apache.james.mailbox.exception.MailboxException;
 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;
 
 public class MaxQuotaConfigurationReader implements Configurable {
 
     private final MaxQuotaManager maxQuotaManager;
+    private final QuotaRootResolver quotaRootResolver;
 
-    public MaxQuotaConfigurationReader(MaxQuotaManager maxQuotaManager) {
+    public MaxQuotaConfigurationReader(MaxQuotaManager maxQuotaManager, 
QuotaRootResolver quotaRootResolver) {
         this.maxQuotaManager = maxQuotaManager;
+        this.quotaRootResolver = quotaRootResolver;
     }
 
     @Override
@@ -74,10 +77,14 @@ public class MaxQuotaConfigurationReader implements 
Configurable {
 
     private void configureQuotaRootSpecificValues(Map<String, Long> 
maxMessage, Map<String, Long> maxStorage) throws MailboxException {
         for (Map.Entry<String, Long> entry : maxMessage.entrySet()) {
-            maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(entry.getKey()), 
QuotaCount.count(entry.getValue()));
+            maxQuotaManager.setMaxMessage(toQuotaRoot(entry.getKey()), 
QuotaCount.count(entry.getValue()));
         }
         for (Map.Entry<String, Long> entry : maxStorage.entrySet()) {
-            maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(entry.getKey()), 
QuotaSize.size(entry.getValue()));
+            maxQuotaManager.setMaxStorage(toQuotaRoot(entry.getKey()), 
QuotaSize.size(entry.getValue()));
         }
     }
+
+    private QuotaRoot toQuotaRoot(String serializedKey) throws 
MailboxException {
+        return quotaRootResolver.fromString(serializedKey);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/40921ed2/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
----------------------------------------------------------------------
diff --git 
a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
 
b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
index 6e66c29..f98eae7 100644
--- 
a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
+++ 
b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
@@ -145,6 +145,7 @@
 
     <bean id="quota" 
class="org.apache.james.container.spring.mailbox.MaxQuotaConfigurationReader">
         <constructor-arg index="0" ref="maxQuotaManager"/>
+        <constructor-arg index="1" ref="quotaRootResolver"/>
     </bean>
 
     <!-- Event system -->


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

Reply via email to