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]
