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:45 UTC

[10/17] james-project git commit: JAMES-2344 define a UserQuotaRootResolver to manage user based quota

JAMES-2344 define a UserQuotaRootResolver to manage user based 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/95c2367e
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/95c2367e
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/95c2367e

Branch: refs/heads/master
Commit: 95c2367e177ba81f4e58b72a9b787472ad5332c5
Parents: 63b010d
Author: Matthieu Baechler <ma...@apache.org>
Authored: Wed Mar 7 11:24:09 2018 +0100
Committer: Raphael Ouazana <ra...@linagora.com>
Committed: Thu Mar 8 09:29:51 2018 +0100

----------------------------------------------------------------------
 mailbox/api/pom.xml                             |   4 +
 .../apache/james/mailbox/model/QuotaRoot.java   |   6 -
 .../james/mailbox/quota/QuotaRootResolver.java  |   2 -
 .../mailbox/quota/UserQuotaRootResolver.java    |  29 +++++
 .../cassandra/CassandraTestSystemFixture.java   |   4 +-
 .../manager/InMemoryIntegrationResources.java   |   8 +-
 .../main/resources/META-INF/spring/quota.xml    |   2 +-
 .../mailbox/store/StoreMailboxManager.java      |   4 +-
 .../store/quota/DefaultQuotaRootResolver.java   |  73 ------------
 .../quota/DefaultUserQuotaRootResolver.java     |  75 +++++++++++++
 .../StoreMessageIdManagerSideEffectTest.java    |   4 +-
 .../quota/DefaultQuotaRootResolverTest.java     |   4 +-
 .../cassandra/host/CassandraHostSystem.java     |   4 +-
 .../host/ElasticSearchHostSystem.java           |   4 +-
 .../imapmailbox/hbase/host/HBaseHostSystem.java |   4 +-
 .../inmemory/host/InMemoryHostSystem.java       |   4 +-
 .../mpt/imapmailbox/jcr/host/JCRHostSystem.java |   4 +-
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java |   4 +-
 .../host/LuceneSearchHostSystem.java            |   4 +-
 .../maildir/host/MaildirHostSystem.java         |   4 +-
 .../response/ImmutableStatusResponse.java       |  13 +++
 .../james/imap/processor/GetQuotaProcessor.java |   4 +-
 .../imap/processor/GetQuotaProcessorTest.java   |  12 +-
 .../modules/mailbox/CassandraQuotaModule.java   |   8 +-
 .../james/modules/mailbox/JpaQuotaModule.java   |   8 +-
 .../apache/james/modules/QuotaProbesImpl.java   |  13 ++-
 .../modules/mailbox/DefaultQuotaModule.java     |   8 +-
 .../modules/mailbox/MemoryQuotaModule.java      |   8 +-
 .../james/adapter/mailbox/QuotaManagement.java  |  13 ++-
 .../mailbox/MaxQuotaConfigurationReader.java    |  10 +-
 .../META-INF/org/apache/james/spring-server.xml |   1 -
 .../transport/matchers/IsOverQuotaTest.java     |   6 +-
 .../integration/GetMailboxesMethodTest.java     |   2 +-
 .../james/webadmin/routes/UserQuotaRoutes.java  |  21 ++--
 .../webadmin/service/UserQuotaService.java      |  38 ++++---
 .../webadmin/routes/UserQuotaRoutesTest.java    | 111 ++++++++++---------
 36 files changed, 287 insertions(+), 236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/api/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/api/pom.xml b/mailbox/api/pom.xml
index 7e825f9..c7008e1 100644
--- a/mailbox/api/pom.xml
+++ b/mailbox/api/pom.xml
@@ -34,6 +34,10 @@
     <dependencies>
         <dependency>
             <groupId>${project.groupId}</groupId>
+            <artifactId>james-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
             <artifactId>james-server-util-java8</artifactId>
         </dependency>
         <dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 debb37a..885540b 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
@@ -26,12 +26,6 @@ import com.google.common.base.Objects;
  */
 public class QuotaRoot {
 
-    private static final String USER = "user-";
-
-    public static QuotaRoot forUser(String value) {
-        return new QuotaRoot(USER + value);
-    }
-
     public static QuotaRoot quotaRoot(String value) {
         return new QuotaRoot(value);
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 0a8ad75..80bf8c9 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
@@ -28,8 +28,6 @@ import org.apache.james.mailbox.model.QuotaRoot;
 
 public interface QuotaRootResolver {
 
-    QuotaRoot createQuotaRoot(String quotaRootString);
-
     /**
      * Return the quotaRoot associated with the given mailbox name.
      *

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
new file mode 100644
index 0000000..c643f4b
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/UserQuotaRootResolver.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * 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.quota;
+
+import org.apache.james.core.User;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaRootResolver;
+
+public interface UserQuotaRootResolver extends QuotaRootResolver {
+
+    QuotaRoot forUser(User user);
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
----------------------------------------------------------------------
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 4d502f9..6f6de00 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
@@ -40,7 +40,7 @@ import org.apache.james.mailbox.store.StoreRightManager;
 import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
 public class CassandraTestSystemFixture {
@@ -77,7 +77,7 @@ public class CassandraTestSystemFixture {
             dispatcher,
             new CassandraMessageId.Factory(),
             quotaManager,
-            new DefaultQuotaRootResolver(mapperFactory));
+            new DefaultUserQuotaRootResolver(mapperFactory));
     }
 
     public static MaxQuotaManager createMaxQuotaManager(CassandraCluster cassandra) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 b96947d..72654e3 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
@@ -50,14 +50,14 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
 public class InMemoryIntegrationResources implements IntegrationResources<StoreMailboxManager> {
 
     private SimpleGroupMembershipResolver groupMembershipResolver;
-    private DefaultQuotaRootResolver quotaRootResolver;
+    private DefaultUserQuotaRootResolver quotaRootResolver;
 
     @Override
     public InMemoryMailboxManager createMailboxManager(GroupMembershipResolver groupMembershipResolver) throws MailboxException {
@@ -171,9 +171,9 @@ public class InMemoryIntegrationResources implements IntegrationResources<StoreM
     }
 
     @Override
-    public DefaultQuotaRootResolver createQuotaRootResolver(StoreMailboxManager mailboxManager) throws Exception {
+    public DefaultUserQuotaRootResolver createQuotaRootResolver(StoreMailboxManager mailboxManager) throws Exception {
         if (quotaRootResolver == null) {
-            quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
+            quotaRootResolver = new DefaultUserQuotaRootResolver(mailboxManager.getMapperFactory());
         }
         return quotaRootResolver;
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/resources/META-INF/spring/quota.xml b/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
index 45361d2..2a564aa 100644
--- a/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
+++ b/mailbox/spring/src/main/resources/META-INF/spring/quota.xml
@@ -25,7 +25,7 @@
     <bean id="currentQuotaManager" class="org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager">
         <constructor-arg index="0" ref="entityManagerFactory" />
     </bean>
-    <bean id="defaultQuotaRootResolver" class="org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver" lazy-init="true">
+    <bean id="defaultQuotaRootResolver" class="org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver" lazy-init="true">
         <constructor-arg index="0" ref="messageMapperFactory"/>
     </bean>
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index a48e18f..2e633d6 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -72,7 +72,7 @@ import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.mailbox.store.quota.QuotaUpdater;
 import org.apache.james.mailbox.store.search.ListeningMessageSearchIndex;
@@ -220,7 +220,7 @@ public class StoreMailboxManager implements MailboxManager {
             quotaManager = new NoQuotaManager();
         }
         if (quotaRootResolver == null) {
-            quotaRootResolver = new DefaultQuotaRootResolver(mailboxSessionMapperFactory);
+            quotaRootResolver = new DefaultUserQuotaRootResolver(mailboxSessionMapperFactory);
         }
         if (quotaUpdater != null && quotaUpdater instanceof MailboxListener) {
             this.addGlobalListener((MailboxListener) quotaUpdater, session);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
deleted file mode 100644
index 3125b6f..0000000
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultQuotaRootResolver.java
+++ /dev/null
@@ -1,73 +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 java.util.List;
-
-import javax.inject.Inject;
-
-import org.apache.james.mailbox.MailboxSession;
-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.QuotaRootResolver;
-import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
-import org.apache.james.mailbox.store.mail.model.Mailbox;
-
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-
-public class DefaultQuotaRootResolver implements QuotaRootResolver {
-
-    public static final String SEPARATOR = "&"; // Character illegal for mailbox naming in regard of RFC 3501 section 5.1
-
-    private final MailboxSessionMapperFactory factory;
-
-    @Inject
-    public DefaultQuotaRootResolver(MailboxSessionMapperFactory factory) {
-        this.factory = factory;
-    }
-
-    @Override
-    public QuotaRoot createQuotaRoot(String quotaRootValue) {
-        return QuotaRoot.quotaRoot(quotaRootValue);
-    }
-
-    @Override
-    public QuotaRoot getQuotaRoot(MailboxPath mailboxPath) throws MailboxException {
-        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());
-    }
-
-    @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 not contain 2 \"" + SEPARATOR + "\"");
-        }
-        String namespace = parts.get(0);
-        String user = parts.get(1);
-        return Lists.transform(factory.getMailboxMapper(mailboxSession)
-            .findMailboxWithPathLike(new MailboxPath(namespace, user, "%")),
-            Mailbox::generateAssociatedPath);
-    }
-}

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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
new file mode 100644
index 0000000..a95c8a5
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/quota/DefaultUserQuotaRootResolver.java
@@ -0,0 +1,75 @@
+/****************************************************************
+ * 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 java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.User;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.mailbox.store.mail.model.Mailbox;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+
+public class DefaultUserQuotaRootResolver implements UserQuotaRootResolver {
+
+    public static final String SEPARATOR = "&"; // Character illegal for mailbox naming in regard of RFC 3501 section 5.1
+
+    private final MailboxSessionMapperFactory factory;
+
+    @Inject
+    public DefaultUserQuotaRootResolver(MailboxSessionMapperFactory factory) {
+        this.factory = factory;
+    }
+
+    @Override
+    public QuotaRoot forUser(User user) {
+        return QuotaRoot.quotaRoot(MailboxConstants.USER_NAMESPACE + SEPARATOR + user.asString());
+    }
+
+    @Override
+    public QuotaRoot getQuotaRoot(MailboxPath mailboxPath) throws MailboxException {
+        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());
+    }
+
+    @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 not contain 2 \"" + SEPARATOR + "\"");
+        }
+        String namespace = parts.get(0);
+        String user = parts.get(1);
+        return Lists.transform(factory.getMailboxMapper(mailboxSession)
+            .findMailboxWithPathLike(new MailboxPath(namespace, user, "%")),
+            Mailbox::generateAssociatedPath);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerSideEffectTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerSideEffectTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerSideEffectTest.java
index 4349dce..c4d3b9a 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerSideEffectTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMessageIdManagerSideEffectTest.java
@@ -32,7 +32,7 @@ import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.junit.Before;
 
 public class StoreMessageIdManagerSideEffectTest extends AbstractMessageIdManagerSideEffectTest {
@@ -53,7 +53,7 @@ public class StoreMessageIdManagerSideEffectTest extends AbstractMessageIdManage
 
         MessageIdManager messageIdManager = new StoreMessageIdManager(mailboxManager,
             testMailboxSessionMapperFactory, dispatcher, messageIdFactory,
-            quotaManager, new DefaultQuotaRootResolver(testMailboxSessionMapperFactory));
+            quotaManager, new DefaultUserQuotaRootResolver(testMailboxSessionMapperFactory));
 
         return new StoreMessageIdManagerTestSystem(messageIdManager,
             messageIdFactory,

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 89c46da..0ca9839 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
@@ -43,13 +43,13 @@ public class DefaultQuotaRootResolverTest {
     public static final SimpleMailbox MAILBOX_2 = new SimpleMailbox(MAILBOX_PATH_2, 10);
     public static final QuotaRoot QUOTA_ROOT = QuotaRoot.quotaRoot("#private&benwa");
 
-    private DefaultQuotaRootResolver testee;
+    private DefaultUserQuotaRootResolver testee;
     private MailboxSessionMapperFactory mockedFactory;
 
     @Before
     public void setUp() {
         mockedFactory = mock(MailboxSessionMapperFactory.class);
-        testee = new DefaultQuotaRootResolver(mockedFactory);
+        testee = new DefaultUserQuotaRootResolver(mockedFactory);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 89fea73..efe3d1a 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -61,7 +61,7 @@ import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
@@ -124,7 +124,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator,
             new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory,
             mailboxEventDispatcher, delegatingMailboxListener, annotationManager, storeRightManager);
-        QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
+        QuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(mapperFactory);
 
         perUserMaxQuotaManager = new CassandraPerUserMaxQuotaManager(new CassandraPerUserMaxQuotaDao(session));
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 4d19b58..ea9b789 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -57,7 +57,7 @@ import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -125,7 +125,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
             DefaultImapProcessorFactory.createDefaultProcessor(this.mailboxManager,
                 new StoreSubscriptionManager(factory),
                 new NoQuotaManager(),
-                new DefaultQuotaRootResolver(factory),
+                new DefaultUserQuotaRootResolver(factory),
                 new DefaultMetricFactory());
         configure(new DefaultImapDecoderFactory().buildImapDecoder(),
             new DefaultImapEncoderFactory().buildImapEncoder(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
index a9ac883..f09749f 100644
--- a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
+++ b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
@@ -51,7 +51,7 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.api.NoopMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -126,7 +126,7 @@ public class HBaseHostSystem extends JamesImapHostSystem {
                         mailboxManager, 
                         subscriptionManager, 
                         new NoQuotaManager(), 
-                        new DefaultQuotaRootResolver(mapperFactory),
+                        new DefaultUserQuotaRootResolver(mapperFactory),
                         new NoopMetricFactory());
 
         resetUserMetaData();

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
index feb3163..b9113d9 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
@@ -36,7 +36,7 @@ import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
@@ -64,7 +64,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
         super.beforeTest();
         this.mailboxManager = new InMemoryIntegrationResources()
             .createMailboxManager(new SimpleGroupMembershipResolver(), authenticator, authorizator);
-        QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
+        QuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(mailboxManager.getMapperFactory());
 
         perUserMaxQuotaManager = new InMemoryPerUserMaxQuotaManager();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
index 985f774..16395e6 100644
--- a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
+++ b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
@@ -50,7 +50,7 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -110,7 +110,7 @@ public class JCRHostSystem extends JamesImapHostSystem {
                     DefaultImapProcessorFactory.createDefaultProcessor(mailboxManager, 
                             new JCRSubscriptionManager(mf), 
                             new NoQuotaManager(), 
-                            new DefaultQuotaRootResolver(mf),
+                            new DefaultUserQuotaRootResolver(mf),
                             new DefaultMetricFactory());
             resetUserMetaData();
             MailboxSession session = mailboxManager.createSystemSession("test");

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 4b5d320..b884b28 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -54,7 +54,7 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.ListeningCurrentQuotaUpdater;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
@@ -106,7 +106,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
             messageParser, new DefaultMessageId.Factory(), delegatingListener,
             mailboxEventDispatcher, annotationManager, storeRightManager);
 
-        DefaultQuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
+        DefaultUserQuotaRootResolver quotaRootResolver = new DefaultUserQuotaRootResolver(mapperFactory);
         JpaCurrentQuotaManager currentQuotaManager = new JpaCurrentQuotaManager(entityManagerFactory);
         maxQuotaManager = new JPAPerUserMaxQuotaManager(new JPAPerUserMaxQuotaDAO(entityManagerFactory));
         StoreQuotaManager storeQuotaManager = new StoreQuotaManager(currentQuotaManager, maxQuotaManager);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index 740594e..5650706 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -58,7 +58,7 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -143,7 +143,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
                     mailboxManager,
                     subscriptionManager,
                     new NoQuotaManager(),
-                    new DefaultQuotaRootResolver(factory),
+                    new DefaultUserQuotaRootResolver(factory),
                     new DefaultMetricFactory());
 
             configure(new DefaultImapDecoderFactory().buildImapDecoder(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index 7861d4d..0243bf0 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -44,7 +44,7 @@ import org.apache.james.mailbox.store.event.DefaultDelegatingMailboxListener;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.mpt.api.ImapFeatures;
@@ -89,7 +89,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
                         mailboxManager, 
                         sm, 
                         new NoQuotaManager(), 
-                        new DefaultQuotaRootResolver(mailboxSessionMapperFactory),
+                        new DefaultUserQuotaRootResolver(mailboxSessionMapperFactory),
                         new DefaultMetricFactory());
         configure(new DefaultImapDecoderFactory().buildImapDecoder(),
                 new DefaultImapEncoderFactory().buildImapEncoder(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
index 4bd9767..8adba0a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/message/response/ImmutableStatusResponse.java
@@ -23,6 +23,8 @@ import org.apache.james.imap.api.ImapCommand;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponse;
 
+import com.google.common.base.MoreObjects;
+
 /**
  * Immutable status response. Suitable for unpooled usage.
  * 
@@ -83,4 +85,15 @@ public class ImmutableStatusResponse implements StatusResponse {
     public ImapCommand getCommand() {
         return command;
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("responseCode", responseCode)
+            .add("serverResponseType", serverResponseType)
+            .add("tag", tag)
+            .add("textKey", textKey)
+            .add("command", command)
+            .toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 bed1740..f7cbfbb 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
@@ -78,7 +78,7 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
     protected void doProcess(GetQuotaRequest message, ImapSession session, String tag, ImapCommand command, Responder responder) {
         try {
             if (hasRight(message.getQuotaRoot(), session)) {
-                QuotaRoot quotaRoot = quotaRootResolver.createQuotaRoot(message.getQuotaRoot());
+                QuotaRoot quotaRoot = QuotaRoot.quotaRoot(message.getQuotaRoot());
                 Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
                 Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
                 if (messageQuota.getMax().isLimited() && messageQuota.getUsed().isPresent()) {
@@ -105,7 +105,7 @@ public class GetQuotaProcessor extends AbstractMailboxProcessor<GetQuotaRequest>
     private boolean hasRight(String 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(quotaRootResolver.createQuotaRoot(quotaRoot), mailboxSession);
+        List<MailboxPath> mailboxList = quotaRootResolver.retrieveAssociatedMailboxes(QuotaRoot.quotaRoot(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/95c2367e/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 9f52053..abe0703 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
@@ -84,13 +84,11 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnValidRights() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), "quotaRoot");
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
-        when(mockedQuotaRootResolver.createQuotaRoot("quotaRoot"))
-            .thenReturn(QUOTA_ROOT);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
             .thenReturn(ImmutableList.of(MAILBOX_PATH));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))
@@ -116,13 +114,11 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnExceptionThrown() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), "quotaRoot");
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
-        when(mockedQuotaRootResolver.createQuotaRoot("quotaRoot"))
-            .thenReturn(QUOTA_ROOT);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
             .thenReturn(ImmutableList.of(MAILBOX_PATH));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))
@@ -143,13 +139,11 @@ public class GetQuotaProcessorTest {
 
     @Test
     public void processorShouldWorkOnNoRights() throws Exception {
-        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), "quotaRoot");
+        GetQuotaRequest getQuotaRequest = new GetQuotaRequest("A004", ImapCommand.anyStateCommand("Name"), QUOTA_ROOT.getValue());
 
         when(mockedImapSession.getState()).thenReturn(ImapSessionState.AUTHENTICATED);
         when(mockedImapSession.getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY))
             .thenReturn(mailboxSession);
-        when(mockedQuotaRootResolver.createQuotaRoot("quotaRoot"))
-            .thenReturn(QUOTA_ROOT);
         when(mockedQuotaRootResolver.retrieveAssociatedMailboxes(QUOTA_ROOT, mailboxSession))
             .thenReturn(ImmutableList.of(MAILBOX_PATH));
         when(mockedMailboxManager.hasRight(MAILBOX_PATH, MailboxACL.Right.Read, mailboxSession))

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraQuotaModule.java
----------------------------------------------------------------------
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 75d49a3..23aa2ec 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
@@ -26,7 +26,8 @@ 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;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
@@ -38,12 +39,13 @@ public class CassandraQuotaModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(DefaultQuotaRootResolver.class).in(Scopes.SINGLETON);
+        bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(CassandraPerUserMaxQuotaManager.class).in(Scopes.SINGLETON);
         bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
         bind(CassandraCurrentQuotaManager.class).in(Scopes.SINGLETON);
 
-        bind(QuotaRootResolver.class).to(DefaultQuotaRootResolver.class);
+        bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
+        bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
         bind(MaxQuotaManager.class).to(CassandraPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(CurrentQuotaManager.class).to(CassandraCurrentQuotaManager.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JpaQuotaModule.java
----------------------------------------------------------------------
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 f85cec7..6cd825c 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
@@ -25,7 +25,8 @@ 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;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
@@ -36,12 +37,13 @@ public class JpaQuotaModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(DefaultQuotaRootResolver.class).in(Scopes.SINGLETON);
+        bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(JPAPerUserMaxQuotaManager.class).in(Scopes.SINGLETON);
         bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
         bind(JpaCurrentQuotaManager.class).in(Scopes.SINGLETON);
 
-        bind(QuotaRootResolver.class).to(DefaultQuotaRootResolver.class);
+        bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
+        bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
         bind(MaxQuotaManager.class).to(JPAPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(CurrentQuotaManager.class).to(JpaCurrentQuotaManager.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 4f7dad5..b384573 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,6 +23,7 @@ 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;
@@ -55,22 +56,22 @@ public class QuotaProbesImpl implements QuotaProbe, GuiceProbe {
 
     @Override
     public SerializableQuota<QuotaCount> getMessageCountQuota(String quotaRoot) throws MailboxException {
-        return SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.createQuotaRoot(quotaRoot)));
+        return SerializableQuota.newInstance(quotaManager.getMessageQuota(QuotaRoot.quotaRoot(quotaRoot)));
     }
 
     @Override
     public SerializableQuota<QuotaSize> getStorageQuota(String quotaRoot) throws MailboxException {
-        return SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.createQuotaRoot(quotaRoot)));
+        return SerializableQuota.newInstance(quotaManager.getStorageQuota(QuotaRoot.quotaRoot(quotaRoot)));
     }
 
     @Override
     public SerializableQuotaValue<QuotaCount> getMaxMessageCount(String quotaRoot) throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.createQuotaRoot(quotaRoot)));
+        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(QuotaRoot.quotaRoot(quotaRoot)));
     }
 
     @Override
     public SerializableQuotaValue<QuotaSize> getMaxStorage(String quotaRoot) throws MailboxException {
-        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.createQuotaRoot(quotaRoot)));
+        return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(QuotaRoot.quotaRoot(quotaRoot)));
     }
 
     @Override
@@ -88,7 +89,7 @@ public class QuotaProbesImpl implements QuotaProbe, GuiceProbe {
         maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaCount value) -> maxQuotaManager.setMaxMessage(quotaRootResolver.createQuotaRoot(quotaRoot), value))
+                    (QuotaCount value) -> maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(quotaRoot), value))
                     .sneakyThrow());
     }
 
@@ -97,7 +98,7 @@ public class QuotaProbesImpl implements QuotaProbe, GuiceProbe {
         maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
             .ifPresent(
                 Throwing.consumer(
-                    (QuotaSize value) -> maxQuotaManager.setMaxStorage(quotaRootResolver.createQuotaRoot(quotaRoot), value))
+                    (QuotaSize value) -> maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(quotaRoot), value))
                     .sneakyThrow());
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultQuotaModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultQuotaModule.java b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultQuotaModule.java
index 41be7ea..f746791 100644
--- a/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultQuotaModule.java
+++ b/server/container/guice/mailbox/src/main/java/org/apache/james/modules/mailbox/DefaultQuotaModule.java
@@ -22,7 +22,8 @@ package org.apache.james.modules.mailbox;
 import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.NoMaxQuotaManager;
 import org.apache.james.mailbox.store.quota.NoQuotaManager;
 
@@ -34,12 +35,13 @@ public class DefaultQuotaModule extends AbstractModule {
     @Override
     protected void configure() {
         bind(NoQuotaManager.class).in(Scopes.SINGLETON);
-        bind(DefaultQuotaRootResolver.class).in(Scopes.SINGLETON);
+        bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(NoMaxQuotaManager.class).in(Scopes.SINGLETON);
 
         bind(MaxQuotaManager.class).to(NoMaxQuotaManager.class);
         bind(QuotaManager.class).to(NoQuotaManager.class);
-        bind(QuotaRootResolver.class).to(DefaultQuotaRootResolver.class);
+        bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
+        bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
     }
     
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryQuotaModule.java
----------------------------------------------------------------------
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 b180b27..bf2e1f0 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
@@ -25,7 +25,8 @@ 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;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 
@@ -36,12 +37,13 @@ public class MemoryQuotaModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        bind(DefaultQuotaRootResolver.class).in(Scopes.SINGLETON);
+        bind(DefaultUserQuotaRootResolver.class).in(Scopes.SINGLETON);
         bind(InMemoryPerUserMaxQuotaManager.class).in(Scopes.SINGLETON);
         bind(StoreQuotaManager.class).in(Scopes.SINGLETON);
         bind(InMemoryCurrentQuotaManager.class).in(Scopes.SINGLETON);
 
-        bind(QuotaRootResolver.class).to(DefaultQuotaRootResolver.class);
+        bind(UserQuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
+        bind(QuotaRootResolver.class).to(DefaultUserQuotaRootResolver.class);
         bind(MaxQuotaManager.class).to(InMemoryPerUserMaxQuotaManager.class);
         bind(QuotaManager.class).to(StoreQuotaManager.class);
         bind(CurrentQuotaManager.class).to(InMemoryCurrentQuotaManager.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 562b4b2..ebf28d3 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,6 +26,7 @@ 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;
@@ -71,7 +72,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxMessageCount")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(quotaRootResolver.createQuotaRoot(quotaRoot)));
+            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxMessage(QuotaRoot.quotaRoot(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -84,7 +85,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMaxStorage")
                      .build()) {
-            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(quotaRootResolver.createQuotaRoot(quotaRoot)));
+            return SerializableQuotaValue.valueOf(maxQuotaManager.getMaxStorage(QuotaRoot.quotaRoot(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -126,7 +127,7 @@ public class QuotaManagement implements QuotaManagementMBean {
             maxMessageCount.toValue(QuotaCount::count, QuotaCount.unlimited())
                 .ifPresent(
                     Throwing.consumer((QuotaCount value) ->
-                        maxQuotaManager.setMaxMessage(quotaRootResolver.createQuotaRoot(quotaRoot), value))
+                        maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
             throw Throwables.propagate(e);
@@ -143,7 +144,7 @@ public class QuotaManagement implements QuotaManagementMBean {
             maxSize.toValue(QuotaSize::size, QuotaSize.unlimited())
                 .ifPresent(
                     Throwing.consumer((QuotaSize value) ->
-                        maxQuotaManager.setMaxStorage(quotaRootResolver.createQuotaRoot(quotaRoot), value))
+                        maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(quotaRoot), value))
                         .sneakyThrow());
         } catch (IOException e) {
             throw Throwables.propagate(e);
@@ -187,7 +188,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getMessageCountQuota")
                      .build()) {
-            return SerializableQuota.newInstance(quotaManager.getMessageQuota(quotaRootResolver.createQuotaRoot(quotaRoot)));
+            return SerializableQuota.newInstance(quotaManager.getMessageQuota(QuotaRoot.quotaRoot(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }
@@ -200,7 +201,7 @@ public class QuotaManagement implements QuotaManagementMBean {
                      .addContext(MDCBuilder.PROTOCOL, "CLI")
                      .addContext(MDCBuilder.ACTION, "getStorageQuota")
                      .build()) {
-            return SerializableQuota.newInstance(quotaManager.getStorageQuota(quotaRootResolver.createQuotaRoot(quotaRoot)));
+            return SerializableQuota.newInstance(quotaManager.getStorageQuota(QuotaRoot.quotaRoot(quotaRoot)));
         } catch (IOException e) {
             throw Throwables.propagate(e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 b5ab1d6..229d65a 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
@@ -27,19 +27,17 @@ import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.james.lifecycle.api.Configurable;
 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, QuotaRootResolver quotaRootResolver) {
+    public MaxQuotaConfigurationReader(MaxQuotaManager maxQuotaManager) {
         this.maxQuotaManager = maxQuotaManager;
-        this.quotaRootResolver = quotaRootResolver;
     }
 
     @Override
@@ -76,10 +74,10 @@ 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(quotaRootResolver.createQuotaRoot(entry.getKey()), QuotaCount.count(entry.getValue()));
+            maxQuotaManager.setMaxMessage(QuotaRoot.quotaRoot(entry.getKey()), QuotaCount.count(entry.getValue()));
         }
         for (Map.Entry<String, Long> entry : maxStorage.entrySet()) {
-            maxQuotaManager.setMaxStorage(quotaRootResolver.createQuotaRoot(entry.getKey()), QuotaSize.size(entry.getValue()));
+            maxQuotaManager.setMaxStorage(QuotaRoot.quotaRoot(entry.getKey()), QuotaSize.size(entry.getValue()));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 f98eae7..6e66c29 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,7 +145,6 @@
 
     <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 -->

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
----------------------------------------------------------------------
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
index bc64c64..ae80229 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/matchers/IsOverQuotaTest.java
@@ -36,7 +36,7 @@ import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
-import org.apache.james.mailbox.store.quota.DefaultQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
 import org.apache.james.mailbox.store.quota.StoreQuotaManager;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.mailet.base.MailAddressFixture;
@@ -48,7 +48,7 @@ import org.junit.Test;
 public class IsOverQuotaTest {
     private IsOverQuota testee;
     private InMemoryPerUserMaxQuotaManager maxQuotaManager;
-    private DefaultQuotaRootResolver quotaRootResolver;
+    private DefaultUserQuotaRootResolver quotaRootResolver;
     private StoreMailboxManager mailboxManager;
     private UsersRepository usersRepository;
 
@@ -56,7 +56,7 @@ public class IsOverQuotaTest {
     public void setUp() throws Exception {
         mailboxManager = new InMemoryIntegrationResources().createMailboxManager(new SimpleGroupMembershipResolver());
 
-        quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
+        quotaRootResolver = new DefaultUserQuotaRootResolver(mailboxManager.getMapperFactory());
         maxQuotaManager = new InMemoryPerUserMaxQuotaManager();
         CurrentQuotaCalculator quotaCalculator = new CurrentQuotaCalculator(mailboxManager.getMapperFactory(), quotaRootResolver);
         InMemoryCurrentQuotaManager currentQuotaManager = new InMemoryCurrentQuotaManager(quotaCalculator, mailboxManager);

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/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 f0cfda7..54cc98b 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
@@ -48,9 +48,9 @@ import org.apache.james.GuiceJamesServer;
 import org.apache.james.jmap.HttpJmapAuthentication;
 import org.apache.james.jmap.api.access.AccessToken;
 import org.apache.james.jmap.model.mailbox.MailboxNamespace;
+import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxACL.Right;
-import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
index 2196fc4..a5fff50 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java
@@ -30,6 +30,7 @@ import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.apache.james.core.User;
 import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaSize;
 import org.apache.james.user.api.UsersRepository;
@@ -108,7 +109,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineUpdateQuota() {
         service.put(QUOTA_ENDPOINT, ((request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             QuotaDTO quotaDTO = parseQuotaDTO(request);
             userQuotaService.defineQuota(user, quotaDTO);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -127,7 +128,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineGetQuota() {
         service.get(QUOTA_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             return userQuotaService.getQuota(user);
         }, jsonTransformer);
     }
@@ -141,7 +142,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineDeleteQuotaSize() {
         service.delete(SIZE_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             userQuotaService.deleteMaxSizeQuota(user);
             response.status(HttpStatus.NO_CONTENT_204);
             return response;
@@ -162,7 +163,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaSize() {
         service.put(SIZE_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             QuotaSize quotaSize = Quotas.quotaSize(request.body());
             userQuotaService.defineMaxSizeQuota(user, quotaSize);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -180,7 +181,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineGetQuotaSize() {
         service.get(SIZE_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             Optional<QuotaSize> maxSizeQuota = userQuotaService.getMaxSizeQuota(user);
             if (maxSizeQuota.isPresent()) {
                 return maxSizeQuota;
@@ -199,7 +200,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineDeleteQuotaCount() {
         service.delete(COUNT_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             userQuotaService.deleteMaxCountQuota(user);
             response.status(HttpStatus.NO_CONTENT_204);
             return response;
@@ -220,7 +221,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineUpdateQuotaCount() {
         service.put(COUNT_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             QuotaCount quotaCount = Quotas.quotaCount(request.body());
             userQuotaService.defineMaxCountQuota(user, quotaCount);
             response.status(HttpStatus.NO_CONTENT_204);
@@ -237,7 +238,7 @@ public class UserQuotaRoutes implements Routes {
     })
     public void defineGetQuotaCount() {
         service.get(COUNT_ENDPOINT, (request, response) -> {
-            String user = checkUserExist(request);
+            User user = checkUserExist(request);
             Optional<QuotaCount> maxCountQuota = userQuotaService.getMaxCountQuota(user);
             if (maxCountQuota.isPresent()) {
                 return maxCountQuota;
@@ -247,7 +248,7 @@ public class UserQuotaRoutes implements Routes {
         }, jsonTransformer);
     }
 
-    private String checkUserExist(Request request) throws UsersRepositoryException {
+    private User checkUserExist(Request request) throws UsersRepositoryException {
         String user = request.params(USER);
         if (!usersRepository.contains(user)) {
             throw ErrorResponder.builder()
@@ -256,7 +257,7 @@ public class UserQuotaRoutes implements Routes {
                 .message("User not found")
                 .haltError();
         }
-        return user;
+        return User.fromUsername(user);
     }
 
     private QuotaDTO parseQuotaDTO(Request request) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/95c2367e/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
index 3b50cc4..1b79e42 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
@@ -22,11 +22,13 @@ import java.util.Optional;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.User;
 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.QuotaSize;
+import org.apache.james.mailbox.quota.UserQuotaRootResolver;
 import org.apache.james.webadmin.dto.QuotaDTO;
 
 import com.github.fge.lambdas.Throwing;
@@ -34,22 +36,24 @@ import com.github.fge.lambdas.Throwing;
 public class UserQuotaService {
 
     private final MaxQuotaManager maxQuotaManager;
+    private final UserQuotaRootResolver userQuotaRootResolver;
 
     @Inject
-    public UserQuotaService(MaxQuotaManager maxQuotaManager) {
+    public UserQuotaService(MaxQuotaManager maxQuotaManager, UserQuotaRootResolver userQuotaRootResolver) {
         this.maxQuotaManager = maxQuotaManager;
+        this.userQuotaRootResolver = userQuotaRootResolver;
     }
 
-    public void defineQuota(String user, QuotaDTO quota) {
-        QuotaRoot quotaRoot = QuotaRoot.forUser(user);
+    public void defineQuota(User user, QuotaDTO quota) {
+        QuotaRoot quotaRoot = userQuotaRootResolver.forUser(user);
         quota.getCount()
             .ifPresent(Throwing.consumer(count -> maxQuotaManager.setMaxMessage(quotaRoot, count)));
         quota.getSize()
             .ifPresent(Throwing.consumer(size -> maxQuotaManager.setMaxStorage(quotaRoot, size)));
     }
 
-    public QuotaDTO getQuota(String user) throws MailboxException {
-        QuotaRoot quotaRoot = QuotaRoot.forUser(user);
+    public QuotaDTO getQuota(User user) throws MailboxException {
+        QuotaRoot quotaRoot = userQuotaRootResolver.forUser(user);
         return QuotaDTO
             .builder()
             .count(maxQuotaManager.getMaxMessage(quotaRoot))
@@ -57,27 +61,27 @@ public class UserQuotaService {
             .build();
     }
 
-    public Optional<QuotaSize> getMaxSizeQuota(String user) throws MailboxException {
-        return maxQuotaManager.getMaxStorage(QuotaRoot.forUser(user));
+    public Optional<QuotaSize> getMaxSizeQuota(User user) throws MailboxException {
+        return maxQuotaManager.getMaxStorage(userQuotaRootResolver.forUser(user));
     }
 
-    public void defineMaxSizeQuota(String user, QuotaSize quotaSize) throws MailboxException {
-        maxQuotaManager.setMaxStorage(QuotaRoot.forUser(user), quotaSize);
+    public void defineMaxSizeQuota(User user, QuotaSize quotaSize) throws MailboxException {
+        maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(user), quotaSize);
     }
 
-    public void deleteMaxSizeQuota(String user) throws MailboxException {
-        maxQuotaManager.removeMaxStorage(QuotaRoot.forUser(user));
+    public void deleteMaxSizeQuota(User user) throws MailboxException {
+        maxQuotaManager.removeMaxStorage(userQuotaRootResolver.forUser(user));
     }
 
-    public Optional<QuotaCount> getMaxCountQuota(String user) throws MailboxException {
-        return maxQuotaManager.getMaxMessage(QuotaRoot.forUser(user));
+    public Optional<QuotaCount> getMaxCountQuota(User user) throws MailboxException {
+        return maxQuotaManager.getMaxMessage(userQuotaRootResolver.forUser(user));
     }
 
-    public void defineMaxCountQuota(String user, QuotaCount quotaCount) throws MailboxException {
-        maxQuotaManager.setMaxMessage(QuotaRoot.forUser(user), quotaCount);
+    public void defineMaxCountQuota(User user, QuotaCount quotaCount) throws MailboxException {
+        maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(user), quotaCount);
     }
 
-    public void deleteMaxCountQuota(String user) throws MailboxException {
-        maxQuotaManager.removeMaxMessage(QuotaRoot.forUser(user));
+    public void deleteMaxCountQuota(User user) throws MailboxException {
+        maxQuotaManager.removeMaxMessage(userQuotaRootResolver.forUser(user));
     }
 }


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