JAMES-2344 Strong type QuotaSize and QuotaCount to allow representing more cases
switch from long to strong type to prevent some error types and
use Optional to force decision to happen in the right place.
Also, it should be compatible with current stored quota in production
but encoding to/from long is done at the protocol level now, as
expected.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/ebcb09a0
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/ebcb09a0
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/ebcb09a0
Branch: refs/heads/master
Commit: ebcb09a0c7b9910be06ae9ffbd3ad74df679ee65
Parents: 90fa81a
Author: Matthieu Baechler <[email protected]>
Authored: Wed Feb 21 17:55:36 2018 +0100
Committer: Matthieu Baechler <[email protected]>
Committed: Wed Mar 7 11:27:22 2018 +0100
----------------------------------------------------------------------
mailbox/api/pom.xml | 20 +-
.../mailbox/exception/OverQuotaException.java | 21 +-
.../org/apache/james/mailbox/model/Quota.java | 47 ++--
.../mailbox/quota/CurrentQuotaManager.java | 4 +-
.../james/mailbox/quota/MaxQuotaManager.java | 63 +++--
.../apache/james/mailbox/quota/QuotaCount.java | 90 +++++++
.../james/mailbox/quota/QuotaManager.java | 4 +-
.../apache/james/mailbox/quota/QuotaSize.java | 92 +++++++
.../apache/james/mailbox/quota/QuotaValue.java | 36 +++
.../mailbox/manager/ManagerTestResources.java | 6 +-
.../manager/QuotaMessageManagerTest.java | 20 +-
.../apache/james/mailbox/model/QuotaTest.java | 19 +-
.../james/mailbox/quota/QuotaCountTest.java | 40 +++
.../james/mailbox/quota/QuotaSizeTest.java | 40 +++
.../james/mailbox/quota/QuotaValueTest.java | 75 ++++++
.../quota/CassandraCurrentQuotaManager.java | 14 +-
.../quota/CassandraPerUserMaxQuotaDao.java | 95 +++++--
.../quota/CassandraPerUserMaxQuotaManager.java | 54 +++-
.../jpa/quota/JPAPerUserMaxQuotaDAO.java | 175 +++++++++++++
.../jpa/quota/JPAPerUserMaxQuotaManager.java | 97 ++++---
.../jpa/quota/JpaCurrentQuotaManager.java | 14 +-
.../jpa/quota/model/MaxDefaultMessageCount.java | 12 +-
.../jpa/quota/model/MaxDefaultStorage.java | 12 +-
.../jpa/quota/model/MaxUserMessageCount.java | 12 +-
.../mailbox/jpa/quota/model/MaxUserStorage.java | 12 +-
.../resources/META-INF/spring/mailbox-jpa.xml | 6 +-
.../jpa/quota/JPAPerUserMaxQuotaTest.java | 2 +-
.../quota/InMemoryCurrentQuotaManager.java | 10 +-
.../quota/InMemoryPerUserMaxQuotaManager.java | 60 +++--
.../quota/InMemoryCurrentQuotaManagerTest.java | 10 +-
.../store/mail/model/SerializableQuota.java | 33 ++-
.../james/mailbox/store/probe/QuotaProbe.java | 24 +-
.../store/quota/FixedMaxQuotaManager.java | 58 ++++-
.../mailbox/store/quota/NoMaxQuotaManager.java | 49 +++-
.../mailbox/store/quota/NoQuotaManager.java | 10 +-
.../james/mailbox/store/quota/QuotaChecker.java | 37 ++-
.../mailbox/store/quota/StoreQuotaManager.java | 28 +-
.../AbstractMessageIdManagerQuotaTest.java | 12 +-
.../AbstractMessageIdManagerSideEffectTest.java | 12 +-
.../store/quota/GenericMaxQuotaManagerTest.java | 54 +++-
.../mailbox/store/quota/QuotaCheckerTest.java | 32 ++-
.../quota/StoreCurrentQuotaManagerTest.java | 16 +-
.../store/quota/StoreQuotaManagerTest.java | 36 +--
.../apache/james/mpt/api/ImapHostSystem.java | 4 +-
.../james/mpt/host/ExternalHostSystem.java | 4 +-
.../cassandra/host/CassandraHostSystem.java | 4 +-
.../james/mpt/imapmailbox/suite/QuotaTest.java | 6 +-
.../imapmailbox/cyrus/host/CyrusHostSystem.java | 4 +-
.../host/ElasticSearchHostSystem.java | 4 +-
.../james/host/ExternalJamesHostSystem.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 | 8 +-
.../host/LuceneSearchHostSystem.java | 4 +-
.../maildir/host/MaildirHostSystem.java | 4 +-
.../james/imap/encode/QuotaResponseEncoder.java | 29 ++-
.../imap/message/response/QuotaResponse.java | 6 +-
.../james/imap/processor/GetQuotaProcessor.java | 14 +-
.../imap/processor/GetQuotaRootProcessor.java | 15 +-
.../imap/encode/QuotaResponseEncoderTest.java | 6 +-
.../imap/processor/GetQuotaProcessorTest.java | 6 +-
.../processor/GetQuotaRootProcessorTest.java | 6 +-
.../java/org/apache/james/cli/ServerCmd.java | 50 ++--
.../james/cli/probe/impl/JmxQuotaProbe.java | 23 +-
.../apache/james/cli/utils/ValueWithUnit.java | 8 +-
.../org/apache/james/cli/ServerCmdTest.java | 23 +-
.../james/cli/utils/ValueWithUnitTest.java | 5 +-
.../apache/james/modules/QuotaProbesImpl.java | 28 +-
.../modules/server/MailboxRoutesModule.java | 4 +
.../modules/server/WebAdminServerModule.java | 2 +
.../james/adapter/mailbox/QuotaManagement.java | 27 +-
.../adapter/mailbox/QuotaManagementMBean.java | 24 +-
.../mailbox/MaxQuotaConfigurationReader.java | 10 +-
.../transport/matchers/IsOverQuotaTest.java | 14 +-
.../james/webadmin/utils/JsonExtractor.java | 12 +-
.../james/webadmin/utils/JsonTransformer.java | 26 +-
.../webadmin/utils/JsonTransformerModule.java | 28 ++
.../org/apache/james/webadmin/dto/QuotaDTO.java | 61 ++++-
.../webadmin/dto/QuotaValueDeserializer.java | 52 ++++
.../webadmin/dto/QuotaValueSerializer.java | 42 +++
.../james/webadmin/jackson/QuotaModule.java | 46 ++++
.../webadmin/routes/GlobalQuotaRoutes.java | 40 ++-
.../james/webadmin/routes/UserQuotaRoutes.java | 34 ++-
.../webadmin/service/GlobalQuotaService.java | 34 ++-
.../webadmin/service/UserQuotaService.java | 29 ++-
.../james/webadmin/validation/QuotaValue.java | 78 ------
.../james/webadmin/validation/Quotas.java | 70 +++++
.../dto/QuotaValueDeserializerTest.java | 49 ++++
.../webadmin/routes/GlobalQuotaRoutesTest.java | 258 +++++++++++++------
.../webadmin/routes/UserQuotaRoutesTest.java | 134 +++++-----
.../webadmin/validation/QuotaValueTest.java | 30 ++-
92 files changed, 2182 insertions(+), 762 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/pom.xml
----------------------------------------------------------------------
diff --git a/mailbox/api/pom.xml b/mailbox/api/pom.xml
index f2572a6..7e825f9 100644
--- a/mailbox/api/pom.xml
+++ b/mailbox/api/pom.xml
@@ -66,11 +66,6 @@
<scope>test</scope>
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>nl.jqno.equalsverifier</groupId>
<artifactId>equalsverifier</artifactId>
<scope>test</scope>
@@ -90,6 +85,21 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.platform</groupId>
+ <artifactId>junit-platform-launcher</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.junit.vintage</groupId>
+ <artifactId>junit-vintage-engine</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
index fa4dcd6..ef4fb3e 100644
---
a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
+++
b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/OverQuotaException.java
@@ -18,39 +18,34 @@
****************************************************************/
package org.apache.james.mailbox.exception;
+import org.apache.james.mailbox.quota.QuotaValue;
/**
* {@link MailboxException} which identicate that a user was over-quota
- *
- *
*/
public class OverQuotaException extends MailboxException {
- /**
- *
- */
private static final long serialVersionUID = 532673188582481689L;
- private long used;
- private long max;
+ private QuotaValue<?> used;
+ private QuotaValue<?> max;
- public OverQuotaException(String msg, long max, long used) {
+ public OverQuotaException(String msg, QuotaValue<?> max, QuotaValue<?>
used) {
super(msg);
this.used = used;
this.max = max;
}
- public OverQuotaException(long max, long used) {
+ public OverQuotaException(QuotaValue<?> max, QuotaValue<?> used) {
this(null, max, used);
}
- public long getUsed() {
+ public QuotaValue<?> getUsed() {
return used;
}
- public long getMax() {
+ public QuotaValue<?> getMax() {
return max;
}
-
-
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
index da0ec14..14e1494 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/Quota.java
@@ -18,43 +18,42 @@
****************************************************************/
package org.apache.james.mailbox.model;
-import com.google.common.base.Objects;
-import com.google.common.base.Preconditions;
+import java.util.Optional;
-public class Quota {
+import org.apache.james.mailbox.quota.QuotaValue;
- public static final long UNLIMITED = -1;
-
- public static final long UNKNOWN = Long.MIN_VALUE;
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
- private static final Quota UNLIMITED_QUOTA = new Quota(UNKNOWN, UNLIMITED);
+public class Quota<T extends QuotaValue<T>> {
- public static Quota unlimited() {
- return UNLIMITED_QUOTA;
+ public static <T extends QuotaValue<T>> Quota<T> quota(T used, T max) {
+ Preconditions.checkNotNull(used);
+ return new Quota<>(Optional.of(used), max);
}
- public static Quota quota(long used, long max) {
- return new Quota(used, max);
+ public static <T extends QuotaValue<T>> Quota<T> unknownUsedQuota(T max) {
+ return new Quota<>(Optional.empty(), max);
}
- private final long max;
- private long used;
+ private final T max;
+ private final Optional<T> used;
- private Quota(long used, long max) {
+ private Quota(Optional<T> used, T max) {
this.used = used;
this.max = max;
}
- public long getMax() {
+ public T getMax() {
return max;
}
- public long getUsed() {
+ public Optional<T> getUsed() {
return used;
}
- public void addValueToQuota(long value) {
- used += value;
+ public Quota<T> addValueToQuota(T value) {
+ return new Quota<T>(used.map(x -> x.add(value)), max);
}
/**
@@ -68,8 +67,10 @@ public class Quota {
public boolean isOverQuotaWithAdditionalValue(long additionalValue) {
Preconditions.checkArgument(additionalValue >= 0);
- return max != UNLIMITED
- && used + additionalValue > max;
+ if (!max.isLimited()) {
+ return false;
+ }
+ return used.map(x ->
x.add(additionalValue).isGreaterThan(max)).orElse(false);
}
@Override
@@ -82,9 +83,9 @@ public class Quota {
if (o == null || ! (o instanceof Quota)) {
return false;
}
- Quota other = (Quota) o;
- return used == other.getUsed()
- && max == other.getMax();
+ Quota<?> other = (Quota<?>) o;
+ return Objects.equal(used, other.getUsed())
+ && Objects.equal(max,other.getMax());
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
index 5aa7dcf..ab9ea88 100644
---
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
+++
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/CurrentQuotaManager.java
@@ -27,8 +27,8 @@ import org.apache.james.mailbox.model.QuotaRoot;
*/
public interface CurrentQuotaManager {
- long getCurrentMessageCount(QuotaRoot quotaRoot) throws MailboxException;
+ QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException;
- long getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException;
+ QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
index 273d01e..13d8ba2 100644
---
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
+++
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/MaxQuotaManager.java
@@ -19,6 +19,8 @@
package org.apache.james.mailbox.quota;
+import java.util.Optional;
+
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.QuotaRoot;
@@ -34,33 +36,67 @@ public interface MaxQuotaManager {
* @param quotaRoot Quota root argument from RFC 2087 ( correspond to the
user owning this mailbox )
* @param maxStorageQuota The new storage quota ( in bytes ) for this user
*/
- void setMaxStorage(QuotaRoot quotaRoot, long maxStorageQuota) throws
MailboxException;
+ void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) throws
MailboxException;
/**
- * Method allowing you to set the maximum message count allowed for this
user
+ * Method allowing you to set the maximum message count allowed for this
quotaroot
*
- * @param quotaRoot Quota root argument from RFC 2087 ( correspond to the
user owning this mailbox )
- * @param maxMessageCount The new message count allowed for this user.
+ * @param quotaRoot Quota root argument from RFC 2087
+ * @param maxMessageCount The new message count allowed.
+ */
+ void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount) throws
MailboxException;
+
+ /**
+ * Method allowing you to remove the maximum messages count allowed for
this quotaroot
+ *
+ * @param quotaRoot Quota root argument from RFC 2087
*/
- void setMaxMessage(QuotaRoot quotaRoot, long maxMessageCount) throws
MailboxException;
+ void removeMaxMessage(QuotaRoot quotaRoot) throws MailboxException;
+
+ /**
+ * Method allowing you to remove the maximum messages size allowed for
this quotaroot
+ *
+ * @param quotaRoot Quota root argument from RFC 2087
+ */
+ void removeMaxStorage(QuotaRoot quotaRoot) throws MailboxException;
/**
* Method allowing you to set the default maximum storage in bytes.
*
* @param defaultMaxStorage new default maximum storage
*/
- void setDefaultMaxStorage(long defaultMaxStorage) throws MailboxException;
+ void setDefaultMaxStorage(QuotaSize defaultMaxStorage) throws
MailboxException;
+
+ /**
+ * Method allowing you to remove the default maximum messages size in
bytes.
+ */
+ void removeDefaultMaxStorage() throws MailboxException;
/**
* Method allowing you to set the default maximum message count allowed
*
* @param defaultMaxMessageCount new default message count
*/
- void setDefaultMaxMessage(long defaultMaxMessageCount) throws
MailboxException;
+ void setDefaultMaxMessage(QuotaCount defaultMaxMessageCount) throws
MailboxException;
- long getDefaultMaxStorage() throws MailboxException;
+ /**
+ * Method allowing you to remove the default maximum messages count.
+ */
+ void removeDefaultMaxMessage() throws MailboxException;
- long getDefaultMaxMessage() throws MailboxException;
+ /**
+ * Method allowing you to get the default maximum storage in bytes.
+ *
+ * @return default maximum storage, if defined
+ */
+ Optional<QuotaSize> getDefaultMaxStorage() throws MailboxException;
+
+ /**
+ * Method allowing you to get the default maximum message count allowed
+ *
+ * @return default maximum message count, if defined
+ */
+ Optional<QuotaCount> getDefaultMaxMessage() throws MailboxException;
/**
* Return the maximum storage which is allowed for the given {@link
QuotaRoot} (in fact the user which the session is bound to)
@@ -68,18 +104,15 @@ public interface MaxQuotaManager {
* The returned valued must be in <strong>bytes</strong>
*
* @param quotaRoot Quota root argument from RFC 2087 ( correspond to the
user owning this mailbox )
- * @return maxBytesThe maximum storage
- * @throws MailboxException
+ * @return The maximum storage in bytes if any
*/
- long getMaxStorage(QuotaRoot quotaRoot) throws MailboxException;
-
+ Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) throws
MailboxException;
/**
* Return the maximum message count which is allowed for the given {@link
QuotaRoot} (in fact the user which the session is bound to)
*
* @param quotaRoot Quota root argument from RFC 2087 ( correspond to the
user owning this mailbox )
* @return maximum of allowed message count
- * @throws MailboxException
*/
- long getMaxMessage(QuotaRoot quotaRoot) throws MailboxException;
+ Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) throws
MailboxException;
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCount.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCount.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCount.java
new file mode 100644
index 0000000..a932c33
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaCount.java
@@ -0,0 +1,90 @@
+/****************************************************************
+ * 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 java.util.Optional;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+public class QuotaCount implements QuotaValue<QuotaCount> {
+
+ public static QuotaCount unlimited() {
+ return new QuotaCount(Optional.empty());
+ }
+
+ public static QuotaCount count(long value) {
+ return new QuotaCount(Optional.of(value));
+ }
+
+ private final Optional<Long> value;
+
+ private QuotaCount(Optional<Long> value) {
+ this.value = value;
+ }
+
+ @Override
+ public long asLong() {
+ return value.orElseThrow(IllegalStateException::new);
+ }
+
+ @Override
+ public boolean isLimited() {
+ return value.isPresent();
+ }
+
+ @Override
+ public QuotaCount add(long additionalValue) {
+ return new QuotaCount(value.map(x -> x + additionalValue));
+ }
+
+ @Override
+ public QuotaCount add(QuotaCount additionalValue) {
+ if (additionalValue.isUnlimited()) {
+ return unlimited();
+ }
+ return new QuotaCount(value.map(x -> x + additionalValue.asLong()));
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("value", value.map(String::valueOf).orElse("unlimited"))
+ .toString();
+ }
+
+ @Override
+ public boolean isGreaterThan(QuotaCount other) {
+ return value.orElse(Long.MAX_VALUE) >
other.value.orElse(Long.MAX_VALUE);
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof QuotaCount) {
+ QuotaCount that = (QuotaCount) o;
+ return Objects.equal(this.value, that.value);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hashCode(value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
index 2890174..37a3c9e 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaManager.java
@@ -37,7 +37,7 @@ public interface QuotaManager {
* @return quota
* @throws MailboxException
*/
- Quota getMessageQuota(QuotaRoot quotaRoot) throws MailboxException;
+ Quota<QuotaCount> getMessageQuota(QuotaRoot quotaRoot) throws
MailboxException;
/**
@@ -48,5 +48,5 @@ public interface QuotaManager {
* @return quota
* @throws MailboxException
*/
- Quota getStorageQuota(QuotaRoot quotaRoot) throws MailboxException;
+ Quota<QuotaSize> getStorageQuota(QuotaRoot quotaRoot) throws
MailboxException;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaSize.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaSize.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaSize.java
new file mode 100644
index 0000000..c8fb1a0
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaSize.java
@@ -0,0 +1,92 @@
+/****************************************************************
+ * 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 java.util.Optional;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+
+public class QuotaSize implements QuotaValue<QuotaSize> {
+
+ public static final QuotaSize QUOTA_SIZE = new QuotaSize(Optional.empty());
+
+ public static QuotaSize unlimited() {
+ return QUOTA_SIZE;
+ }
+
+ public static QuotaSize size(long value) {
+ return new QuotaSize(Optional.of(value));
+ }
+
+ private final Optional<Long> value;
+
+ private QuotaSize(Optional<Long> value) {
+ this.value = value;
+ }
+
+ @Override
+ public long asLong() {
+ return value.orElseThrow(IllegalStateException::new);
+ }
+
+ @Override
+ public boolean isLimited() {
+ return value.isPresent();
+ }
+
+ @Override
+ public QuotaSize add(long additionalValue) {
+ return new QuotaSize(value.map(x -> x + additionalValue));
+ }
+
+ @Override
+ public QuotaSize add(QuotaSize additionalValue) {
+ if (additionalValue.isUnlimited()) {
+ return unlimited();
+ }
+ return new QuotaSize(value.map(x -> x + additionalValue.asLong()));
+ }
+
+ @Override
+ public boolean isGreaterThan(QuotaSize other) {
+ return value.orElse(Long.MAX_VALUE) >
other.value.orElse(Long.MAX_VALUE);
+ }
+
+ @Override
+ public String toString() {
+ return MoreObjects.toStringHelper(this)
+ .add("value", value.map(String::valueOf).orElse("unlimited"))
+ .toString();
+ }
+
+ @Override
+ public final boolean equals(Object o) {
+ if (o instanceof QuotaSize) {
+ QuotaSize that = (QuotaSize) o;
+ return Objects.equal(this.value, that.value);
+ }
+ return false;
+ }
+
+ @Override
+ public final int hashCode() {
+ return Objects.hashCode(value);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaValue.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaValue.java
b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaValue.java
new file mode 100644
index 0000000..5fe9c89
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/quota/QuotaValue.java
@@ -0,0 +1,36 @@
+/****************************************************************
+ * 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;
+
+public interface QuotaValue<T extends QuotaValue<T>> {
+
+ long asLong();
+
+ boolean isLimited();
+
+ default boolean isUnlimited() {
+ return !isLimited();
+ }
+
+ T add(long additionalValue);
+
+ T add(T additionalValue);
+
+ boolean isGreaterThan(T other);
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestResources.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestResources.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestResources.java
index 05613a0..2c9d34f 100644
---
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestResources.java
+++
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/ManagerTestResources.java
@@ -35,8 +35,10 @@ import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.mock.MockMail;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.quota.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaCount;
import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.quota.QuotaSize;
/**
* Provide an initialized Mailbox environment where we can run managers tests
@@ -75,8 +77,8 @@ public class ManagerTestResources<T extends MailboxManager> {
inbox = MailboxPath.inbox(session);
subFolder = new MailboxPath(inbox, "INBOX.SUB");
- maxQuotaManager.setDefaultMaxMessage(1000);
- maxQuotaManager.setDefaultMaxStorage(1000000);
+ maxQuotaManager.setDefaultMaxMessage(QuotaCount.count(1000));
+ maxQuotaManager.setDefaultMaxStorage(QuotaSize.size(1000000));
}
public void createMailboxes() throws MailboxException {
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
index 3b12343..d763de3 100644
---
a/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
+++
b/mailbox/api/src/test/java/org/apache/james/mailbox/manager/QuotaMessageManagerTest.java
@@ -30,7 +30,9 @@ import org.apache.james.mailbox.mock.MockMail;
import org.apache.james.mailbox.model.MailboxPath;
import org.apache.james.mailbox.model.MessageRange;
import org.apache.james.mailbox.quota.MaxQuotaManager;
+import org.apache.james.mailbox.quota.QuotaCount;
import org.apache.james.mailbox.quota.QuotaRootResolver;
+import org.apache.james.mailbox.quota.QuotaSize;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -76,13 +78,15 @@ public abstract class QuotaMessageManagerTest<T extends
MailboxManager> {
@Test(expected = OverQuotaException.class)
public void testAppendOverQuotaMessages() throws Exception {
- maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
8L);
+ QuotaCount maxMessageCount = QuotaCount.count(8);
+ maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
maxMessageCount);
resources.fillMailbox();
}
@Test(expected = OverQuotaException.class)
public void testAppendOverQuotaSize() throws Exception {
- maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), 3
* MockMail.MAIL_TEXT_PLAIN.length() + 1);
+ QuotaSize maxQuotaSize = QuotaSize.size(3 *
MockMail.MAIL_TEXT_PLAIN.length() + 1);
+ maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox),
maxQuotaSize);
resources.fillMailbox();
}
@@ -93,13 +97,15 @@ public abstract class QuotaMessageManagerTest<T extends
MailboxManager> {
} catch (OverQuotaException overQuotaException) {
// Silent these exception as we don't want it to disturb the test
}
- maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
20L);
+ QuotaCount maxMessageCount = QuotaCount.count(20L);
+ maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
maxMessageCount);
mailboxManager.copyMessages(MessageRange.all(), inbox, subFolder,
session);
}
@Test(expected = OverQuotaException.class)
public void testCopyOverQuotaSize() throws Exception {
- maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox),
20L * MockMail.MAIL_TEXT_PLAIN.length());
+ QuotaSize maxQuotaSize = QuotaSize.size(20L *
MockMail.MAIL_TEXT_PLAIN.length());
+ maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox),
maxQuotaSize);
try {
resources.fillMailbox();
} catch (OverQuotaException overQuotaException) {
@@ -110,7 +116,8 @@ public abstract class QuotaMessageManagerTest<T extends
MailboxManager> {
@Test
public void testRetrievalOverMaxMessage() throws Exception {
- maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
8L);
+ QuotaCount maxMessageCount = QuotaCount.count(8L);
+ maxQuotaManager.setMaxMessage(quotaRootResolver.getQuotaRoot(inbox),
maxMessageCount);
try {
resources.fillMailbox();
} catch (OverQuotaException overQuotaException) {
@@ -123,7 +130,8 @@ public abstract class QuotaMessageManagerTest<T extends
MailboxManager> {
@Test
public void testRetrievalOverMaxStorage() throws Exception {
- maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox), 8
* MockMail.MAIL_TEXT_PLAIN.length() + 1);
+ QuotaSize maxQuotaSize = QuotaSize.size(8 *
MockMail.MAIL_TEXT_PLAIN.length() + 1);
+ maxQuotaManager.setMaxStorage(quotaRootResolver.getQuotaRoot(inbox),
maxQuotaSize);
try {
resources.fillMailbox();
} catch (OverQuotaException overQuotaException) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
index 143886d..82f4c95 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaTest.java
@@ -22,6 +22,7 @@ package org.apache.james.mailbox.model;
import static org.assertj.core.api.Assertions.assertThat;
import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.quota.QuotaCount;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -33,49 +34,49 @@ public class QuotaTest {
@Test
public void unlimitedQuotaShouldNotBeOverQuota() {
- assertThat(Quota.unlimited().isOverQuota()).isFalse();
+
assertThat(Quota.unknownUsedQuota(QuotaCount.unlimited()).isOverQuota()).isFalse();
}
@Test
public void isOverQuotaShouldReturnFalseWhenQuotaIsNotExceeded() {
- assertThat(Quota.quota(36, 360).isOverQuota()).isFalse();
+ assertThat(Quota.quota(QuotaCount.count(36),
QuotaCount.count(360)).isOverQuota()).isFalse();
}
@Test
public void isOverQuotaShouldReturnFalseWhenMaxValueIsUnlimited() {
- assertThat(Quota.quota(36, Quota.UNLIMITED).isOverQuota()).isFalse();
+ assertThat(Quota.quota(QuotaCount.count(36),
QuotaCount.unlimited()).isOverQuota()).isFalse();
}
@Test
public void isOverQuotaShouldReturnFalseWhenUsedValueIsUnknown() {
- assertThat(Quota.quota(Quota.UNKNOWN, 36).isOverQuota()).isFalse();
+
assertThat(Quota.unknownUsedQuota(QuotaCount.count(36)).isOverQuota()).isFalse();
}
@Test
public void isOverQuotaShouldReturnTrueWhenQuotaIsExceeded() {
- assertThat(Quota.quota(360, 36).isOverQuota()).isTrue();
+ assertThat(Quota.quota(QuotaCount.count(360),
QuotaCount.count(36)).isOverQuota()).isTrue();
}
@Test
public void isOverQuotaWithAdditionalValueShouldReturnTrueWhenOverLimit() {
- assertThat(Quota.quota(36,
36).isOverQuotaWithAdditionalValue(1)).isTrue();
+ assertThat(Quota.quota(QuotaCount.count(36),
QuotaCount.count(36)).isOverQuotaWithAdditionalValue(1)).isTrue();
}
@Test
public void isOverQuotaWithAdditionalValueShouldReturnTrueWhenUnderLimit()
{
- assertThat(Quota.quota(34,
36).isOverQuotaWithAdditionalValue(1)).isFalse();
+ assertThat(Quota.quota(QuotaCount.count(34),
QuotaCount.count(36)).isOverQuotaWithAdditionalValue(1)).isFalse();
}
@Test
public void isOverQuotaWithAdditionalValueShouldReturnFalseWhenAtLimit() {
- assertThat(Quota.quota(36,
36).isOverQuotaWithAdditionalValue(0)).isFalse();
+ assertThat(Quota.quota(QuotaCount.count(36),
QuotaCount.count(36)).isOverQuotaWithAdditionalValue(0)).isFalse();
}
@Test
public void isOverQuotaWithAdditionalValueShouldThrowOnNegativeValue() {
expectedException.expect(IllegalArgumentException.class);
- Quota.quota(25, 36).isOverQuotaWithAdditionalValue(-1);
+ Quota.quota(QuotaCount.count(25),
QuotaCount.count(36)).isOverQuotaWithAdditionalValue(-1);
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaCountTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaCountTest.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaCountTest.java
new file mode 100644
index 0000000..b057374
--- /dev/null
+++
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaCountTest.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class QuotaCountTest implements QuotaValueTest<QuotaCount> {
+
+ public QuotaCount instance(long value) {
+ return QuotaCount.count(value);
+ }
+
+ public QuotaCount unlimited() {
+ return QuotaCount.unlimited();
+ }
+
+ @Test
+ public void shouldRespectBeanContract() {
+ EqualsVerifier.forClass(QuotaCount.class).verify();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaSizeTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaSizeTest.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaSizeTest.java
new file mode 100644
index 0000000..893b97e
--- /dev/null
+++
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaSizeTest.java
@@ -0,0 +1,40 @@
+/****************************************************************
+ * 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.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class QuotaSizeTest implements QuotaValueTest<QuotaSize> {
+
+ public QuotaSize instance(long value) {
+ return QuotaSize.size(value);
+ }
+
+ public QuotaSize unlimited() {
+ return QuotaSize.unlimited();
+ }
+
+ @Test
+ public void shouldRespectBeanContract() {
+ EqualsVerifier.forClass(QuotaSize.class).verify();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaValueTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaValueTest.java
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaValueTest.java
new file mode 100644
index 0000000..57d6b9e
--- /dev/null
+++
b/mailbox/api/src/test/java/org/apache/james/mailbox/quota/QuotaValueTest.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.quota;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.jupiter.api.Test;
+
+public interface QuotaValueTest<T extends QuotaValue<T>> {
+
+ T instance(long i);
+
+ T unlimited();
+
+ @Test
+ default void greaterThanShouldReturnFalseWhenFirstEqualToSecond() {
+ assertThat(instance(1).isGreaterThan(instance(1))).isFalse();
+ }
+
+ @Test
+ default void greaterThanShouldReturnFalseWhenFirstSmallerThanSecond() {
+ assertThat(instance(1).isGreaterThan(instance(2))).isFalse();
+ }
+
+ @Test
+ default void greaterThanShouldReturnTrueWhenFirstGreaterThanSecond() {
+ assertThat(instance(2).isGreaterThan(instance(1))).isTrue();
+ }
+
+ @Test
+ default void
greaterThanShouldReturnFalseWhenFirstIsLimitedAndSecondUnlimited() {
+ assertThat(instance(1).isGreaterThan(unlimited())).isFalse();
+ }
+
+ @Test
+ default void greaterThanShouldReturnFalseWhenBothAreUnlimited() {
+ assertThat(unlimited().isGreaterThan(unlimited())).isFalse();
+ }
+
+ @Test
+ default void
greaterThanShouldReturnTrueWhenFirstIsUnlimitedAndSecondLimited() {
+ assertThat(unlimited().isGreaterThan(instance(1))).isTrue();
+ }
+
+ @Test
+ default void addShouldReturnUnlimitedWhenThisIsUnlimited() {
+ assertThat(unlimited().add(2)).isEqualTo(unlimited());
+ }
+
+ @Test
+ default void addShouldReturnUnlimitedWhenBothAre() {
+ assertThat(unlimited().add(unlimited())).isEqualTo(unlimited());
+ }
+
+ @Test
+ default void addShouldReturnSumResult() {
+ assertThat(instance(12).add(instance(23))).isEqualTo(instance(35));
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
index 963477a..d6f495c 100644
---
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
+++
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraCurrentQuotaManager.java
@@ -32,6 +32,8 @@ import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.cassandra.table.CassandraCurrentQuota;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
import com.datastax.driver.core.PreparedStatement;
@@ -84,21 +86,21 @@ public class CassandraCurrentQuotaManager implements
StoreCurrentQuotaManager {
}
@Override
- public long getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
+ public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
ResultSet resultSet =
session.execute(getCurrentMessageCountStatement.bind(quotaRoot.getValue()));
if (resultSet.isExhausted()) {
- return 0L;
+ return QuotaCount.count(0L);
}
- return resultSet.one().getLong(CassandraCurrentQuota.MESSAGE_COUNT);
+ return
QuotaCount.count(resultSet.one().getLong(CassandraCurrentQuota.MESSAGE_COUNT));
}
@Override
- public long getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException
{
+ public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws
MailboxException {
ResultSet resultSet =
session.execute(getCurrentStorageStatement.bind(quotaRoot.getValue()));
if (resultSet.isExhausted()) {
- return 0L;
+ return QuotaSize.size(0L);
}
- return resultSet.one().getLong(CassandraCurrentQuota.STORAGE);
+ return
QuotaSize.size(resultSet.one().getLong(CassandraCurrentQuota.STORAGE));
}
private void checkArguments(long count, long size) {
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
----------------------------------------------------------------------
diff --git
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
index 8b7a868..88b2c71 100644
---
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
+++
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaDao.java
@@ -20,17 +20,22 @@
package org.apache.james.mailbox.cassandra.quota;
import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.delete;
import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
import static com.datastax.driver.core.querybuilder.QueryBuilder.insertInto;
import static com.datastax.driver.core.querybuilder.QueryBuilder.select;
import java.util.Optional;
+import java.util.function.Function;
import javax.inject.Inject;
import org.apache.james.mailbox.cassandra.table.CassandraDefaultMaxQuota;
import org.apache.james.mailbox.cassandra.table.CassandraMaxQuota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+import org.apache.james.mailbox.quota.QuotaValue;
import com.datastax.driver.core.PreparedStatement;
import com.datastax.driver.core.ResultSet;
@@ -38,6 +43,7 @@ import com.datastax.driver.core.Session;
public class CassandraPerUserMaxQuotaDao {
+ private static final long INFINITE = -1;
private final Session session;
private final PreparedStatement setMaxStorageStatement;
private final PreparedStatement setMaxMessageStatement;
@@ -46,6 +52,9 @@ public class CassandraPerUserMaxQuotaDao {
private final PreparedStatement setDefaultMaxStorageStatement;
private final PreparedStatement setDefaultMaxMessageStatement;
private final PreparedStatement getDefaultMaxStatement;
+ private final PreparedStatement removeMaxStorageStatement;
+ private final PreparedStatement removeMaxMessageStatement;
+ private final PreparedStatement removeDefaultMaxQuotaStatement;
@Inject
public CassandraPerUserMaxQuotaDao(Session session) {
@@ -71,55 +80,109 @@ public class CassandraPerUserMaxQuotaDao {
this.setDefaultMaxStorageStatement =
session.prepare(insertInto(CassandraDefaultMaxQuota.TABLE_NAME)
.value(CassandraDefaultMaxQuota.TYPE,
CassandraDefaultMaxQuota.STORAGE)
.value(CassandraDefaultMaxQuota.VALUE, bindMarker()));
+ this.removeDefaultMaxQuotaStatement = session.prepare(delete().all()
+ .from(CassandraDefaultMaxQuota.TABLE_NAME)
+ .where(eq(CassandraDefaultMaxQuota.TYPE,
bindMarker(CassandraDefaultMaxQuota.TYPE))));
+ this.removeMaxStorageStatement =
session.prepare(delete().column(CassandraMaxQuota.STORAGE)
+ .from(CassandraMaxQuota.TABLE_NAME)
+ .where(eq(CassandraMaxQuota.QUOTA_ROOT, bindMarker())));
+ this.removeMaxMessageStatement =
session.prepare(delete().column(CassandraMaxQuota.MESSAGE_COUNT)
+ .from(CassandraMaxQuota.TABLE_NAME)
+ .where(eq(CassandraMaxQuota.QUOTA_ROOT, bindMarker())));
}
- public void setMaxStorage(QuotaRoot quotaRoot, long maxStorageQuota) {
- session.execute(setMaxStorageStatement.bind(quotaRoot.getValue(),
maxStorageQuota));
+ public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
+ session.execute(setMaxStorageStatement.bind(quotaRoot.getValue(),
quotaValueToLong(maxStorageQuota)));
}
- public void setMaxMessage(QuotaRoot quotaRoot, long maxMessageCount) {
- session.execute(setMaxMessageStatement.bind(quotaRoot.getValue(),
maxMessageCount));
+ public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount)
{
+ session.execute(setMaxMessageStatement.bind(quotaRoot.getValue(),
quotaValueToLong(maxMessageCount)));
}
- public void setDefaultMaxStorage(long defaultMaxStorage) {
- session.execute(setDefaultMaxStorageStatement.bind(defaultMaxStorage));
+ public void setDefaultMaxStorage(QuotaSize defaultMaxStorage) {
+
session.execute(setDefaultMaxStorageStatement.bind(quotaValueToLong(defaultMaxStorage)));
}
- public void setDefaultMaxMessage(long defaultMaxMessageCount) {
-
session.execute(setDefaultMaxMessageStatement.bind(defaultMaxMessageCount));
+ public void setDefaultMaxMessage(QuotaCount defaultMaxMessageCount) {
+
session.execute(setDefaultMaxMessageStatement.bind(quotaValueToLong(defaultMaxMessageCount)));
}
- public Optional<Long> getDefaultMaxStorage() {
+ public Optional<QuotaSize> getDefaultMaxStorage() {
ResultSet resultSet = session.execute(getDefaultMaxStatement.bind()
.setString(CassandraDefaultMaxQuota.TYPE,
CassandraDefaultMaxQuota.STORAGE));
if (resultSet.isExhausted()) {
return Optional.empty();
}
- return
Optional.of(resultSet.one().getLong(CassandraDefaultMaxQuota.VALUE));
+ Long maxStorage = resultSet.one().get(CassandraDefaultMaxQuota.VALUE,
Long.class);
+ return longToQuotaSize(maxStorage);
}
- public Optional<Long> getDefaultMaxMessage() {
+ public Optional<QuotaCount> getDefaultMaxMessage() {
ResultSet resultSet = session.execute(getDefaultMaxStatement.bind()
.setString(CassandraDefaultMaxQuota.TYPE,
CassandraDefaultMaxQuota.MESSAGE));
if (resultSet.isExhausted()) {
return Optional.empty();
}
- return
Optional.of(resultSet.one().getLong(CassandraDefaultMaxQuota.VALUE));
+ Long maxMessages = resultSet.one().get(CassandraDefaultMaxQuota.VALUE,
Long.class);
+ return longToQuotaCount(maxMessages);
}
- public Optional<Long> getMaxStorage(QuotaRoot quotaRoot) {
+ public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
ResultSet resultSet =
session.execute(getMaxStorageStatement.bind(quotaRoot.getValue()));
if (resultSet.isExhausted()) {
return Optional.empty();
}
- return Optional.of(resultSet.one().getLong(CassandraMaxQuota.STORAGE));
+ Long maxStorage = resultSet.one().get(CassandraMaxQuota.STORAGE,
Long.class);
+ return longToQuotaSize(maxStorage);
}
- public Optional<Long> getMaxMessage(QuotaRoot quotaRoot) {
+ public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
ResultSet resultSet =
session.execute(getMaxMessageStatement.bind(quotaRoot.getValue()));
if (resultSet.isExhausted()) {
return Optional.empty();
}
- return
Optional.of(resultSet.one().getLong(CassandraMaxQuota.MESSAGE_COUNT));
+ Long maxMessages =
resultSet.one().get(CassandraMaxQuota.MESSAGE_COUNT, Long.class);
+ return longToQuotaCount(maxMessages);
+ }
+
+ private Long quotaValueToLong(QuotaValue<?> value) {
+ if (value.isUnlimited()) {
+ return INFINITE;
+ }
+ return value.asLong();
+ }
+
+ private Optional<QuotaSize> longToQuotaSize(Long value) {
+ return longToQuotaValue(value, QuotaSize.unlimited(), QuotaSize::size);
+ }
+
+ private Optional<QuotaCount> longToQuotaCount(Long value) {
+ return longToQuotaValue(value, QuotaCount.unlimited(),
QuotaCount::count);
+ }
+
+ private <T extends QuotaValue<T>> Optional<T> longToQuotaValue(Long value,
T infiniteValue, Function<Long, T> quotaFactory) {
+ if (value == null) {
+ return Optional.empty();
+ }
+ if (value == INFINITE) {
+ return Optional.of(infiniteValue);
+ }
+ return Optional.of(quotaFactory.apply(value));
+ }
+
+ public void removeMaxMessage(QuotaRoot quotaRoot) {
+ session.execute(removeMaxMessageStatement.bind(quotaRoot.getValue()));
+ }
+
+ public void removeMaxStorage(QuotaRoot quotaRoot) {
+ session.execute(removeMaxStorageStatement.bind(quotaRoot.getValue()));
+ }
+
+ public void removeDefaultMaxStorage() {
+
session.execute(removeDefaultMaxQuotaStatement.bind(CassandraDefaultMaxQuota.STORAGE));
+ }
+
+ public void removeDefaultMaxMessage() {
+
session.execute(removeDefaultMaxQuotaStatement.bind(CassandraDefaultMaxQuota.MESSAGE));
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
index 7f41fda..46fe5e3 100644
---
a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
+++
b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/quota/CassandraPerUserMaxQuotaManager.java
@@ -19,12 +19,14 @@
package org.apache.james.mailbox.cassandra.quota;
+import java.util.Optional;
+
import javax.inject.Inject;
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.model.Quota;
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 com.github.fge.lambdas.Throwing;
@@ -38,42 +40,66 @@ public class CassandraPerUserMaxQuotaManager implements
MaxQuotaManager {
}
@Override
- public void setMaxStorage(QuotaRoot quotaRoot, long maxStorageQuota)
throws MailboxException {
+ public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
dao.setMaxStorage(quotaRoot, maxStorageQuota);
}
@Override
- public void setMaxMessage(QuotaRoot quotaRoot, long maxMessageCount)
throws MailboxException {
+ public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount)
{
dao.setMaxMessage(quotaRoot, maxMessageCount);
}
@Override
- public void setDefaultMaxStorage(long defaultMaxStorage) throws
MailboxException {
+ public void removeMaxMessage(QuotaRoot quotaRoot) {
+ dao.removeMaxMessage(quotaRoot);
+ }
+
+ @Override
+ public void removeMaxStorage(QuotaRoot quotaRoot) {
+ dao.removeMaxStorage(quotaRoot);
+ }
+
+ @Override
+ public void setDefaultMaxStorage(QuotaSize defaultMaxStorage) {
dao.setDefaultMaxStorage(defaultMaxStorage);
}
@Override
- public void setDefaultMaxMessage(long defaultMaxMessageCount) throws
MailboxException {
+ public void removeDefaultMaxStorage() {
+ dao.removeDefaultMaxStorage();
+ }
+
+ @Override
+ public void setDefaultMaxMessage(QuotaCount defaultMaxMessageCount) {
dao.setDefaultMaxMessage(defaultMaxMessageCount);
}
@Override
- public long getDefaultMaxStorage() throws MailboxException {
- return dao.getDefaultMaxStorage().orElse(Quota.UNLIMITED);
+ public void removeDefaultMaxMessage() {
+ dao.removeDefaultMaxMessage();
+ }
+
+ @Override
+ public Optional<QuotaSize> getDefaultMaxStorage() {
+ return dao.getDefaultMaxStorage();
}
@Override
- public long getDefaultMaxMessage() throws MailboxException {
- return dao.getDefaultMaxMessage().orElse(Quota.UNLIMITED);
+ public Optional<QuotaCount> getDefaultMaxMessage() {
+ return dao.getDefaultMaxMessage();
}
@Override
- public long getMaxStorage(QuotaRoot quotaRoot) throws MailboxException {
- return
dao.getMaxStorage(quotaRoot).orElseGet(Throwing.supplier(this::getDefaultMaxStorage).sneakyThrow());
+ public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+ return dao.getMaxStorage(quotaRoot)
+ .map(Optional::of)
+
.orElseGet(Throwing.supplier(this::getDefaultMaxStorage).sneakyThrow());
}
@Override
- public long getMaxMessage(QuotaRoot quotaRoot) throws MailboxException {
- return
dao.getMaxMessage(quotaRoot).orElseGet(Throwing.supplier(this::getDefaultMaxMessage).sneakyThrow());
+ public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+ return dao.getMaxMessage(quotaRoot)
+ .map(Optional::of)
+
.orElseGet(Throwing.supplier(this::getDefaultMaxMessage).sneakyThrow());
}
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
new file mode 100644
index 0000000..d29db8a
--- /dev/null
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaDAO.java
@@ -0,0 +1,175 @@
+/****************************************************************
+ * 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.jpa.quota;
+
+import java.util.Optional;
+import java.util.function.Function;
+
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.apache.james.mailbox.jpa.quota.model.MaxDefaultMessageCount;
+import org.apache.james.mailbox.jpa.quota.model.MaxDefaultStorage;
+import org.apache.james.mailbox.jpa.quota.model.MaxUserMessageCount;
+import org.apache.james.mailbox.jpa.quota.model.MaxUserStorage;
+import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+import org.apache.james.mailbox.quota.QuotaValue;
+
+public class JPAPerUserMaxQuotaDAO {
+
+ private static final long INFINITE = -1;
+ private final EntityManager entityManager;
+
+ @Inject
+ public JPAPerUserMaxQuotaDAO(EntityManagerFactory entityManagerFactory) {
+ entityManager = entityManagerFactory.createEntityManager();
+ }
+
+ public void setMaxStorage(QuotaRoot quotaRoot, Optional<QuotaSize>
maxStorageQuota) {
+ entityManager.getTransaction().begin();
+ MaxUserStorage storedValue = getMaxUserStorageEntity(quotaRoot,
maxStorageQuota);
+ entityManager.persist(storedValue);
+ entityManager.getTransaction().commit();
+ }
+
+ private MaxUserStorage getMaxUserStorageEntity(QuotaRoot quotaRoot,
Optional<QuotaSize> maxStorageQuota) {
+ MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class,
quotaRoot.getValue());
+ Long value = quotaValueToLong(maxStorageQuota);
+ if (storedValue == null) {
+ return new MaxUserStorage(quotaRoot.getValue(), value);
+ }
+ storedValue.setValue(value);
+ return storedValue;
+ }
+
+ public void setMaxMessage(QuotaRoot quotaRoot, Optional<QuotaCount>
maxMessageCount) {
+ entityManager.getTransaction().begin();
+ MaxUserMessageCount storedValue = getMaxUserMessageEntity(quotaRoot,
maxMessageCount);
+ entityManager.persist(storedValue);
+ entityManager.getTransaction().commit();
+ }
+
+ private MaxUserMessageCount getMaxUserMessageEntity(QuotaRoot quotaRoot,
Optional<QuotaCount> maxMessageQuota) {
+ MaxUserMessageCount storedValue =
entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
+ Long value = quotaValueToLong(maxMessageQuota);
+ if (storedValue == null) {
+ return new MaxUserMessageCount(quotaRoot.getValue(), value);
+ }
+ storedValue.setValue(value);
+ return storedValue;
+ }
+
+ public void setDefaultMaxStorage(Optional<QuotaSize> defaultMaxStorage) {
+ entityManager.getTransaction().begin();
+ MaxDefaultStorage defaultMaxStorageEntity =
getDefaultMaxStorageEntity(defaultMaxStorage);
+ entityManager.persist(defaultMaxStorageEntity);
+ entityManager.getTransaction().commit();
+ }
+
+ private MaxDefaultStorage getDefaultMaxStorageEntity(Optional<QuotaSize>
maxSizeQuota) {
+ MaxDefaultStorage storedValue =
entityManager.find(MaxDefaultStorage.class, MaxDefaultStorage.DEFAULT_KEY);
+ Long value = quotaValueToLong(maxSizeQuota);
+ if (storedValue == null) {
+ return new MaxDefaultStorage(value);
+ }
+ storedValue.setValue(value);
+ return storedValue;
+ }
+
+ public void setDefaultMaxMessage(Optional<QuotaCount>
defaultMaxMessageCount) {
+ entityManager.getTransaction().begin();
+ MaxDefaultMessageCount defaultMaxMessageEntity =
getDefaultMaxMessageEntity(defaultMaxMessageCount);
+ entityManager.persist(defaultMaxMessageEntity);
+ entityManager.getTransaction().commit();
+ }
+
+ private MaxDefaultMessageCount
getDefaultMaxMessageEntity(Optional<QuotaCount> maxMessageQuota) {
+ MaxDefaultMessageCount storedValue =
entityManager.find(MaxDefaultMessageCount.class,
MaxDefaultMessageCount.DEFAULT_KEY);
+ Long value = quotaValueToLong(maxMessageQuota);
+ if (storedValue == null) {
+ return new MaxDefaultMessageCount(value);
+ }
+ storedValue.setValue(value);
+ return storedValue;
+ }
+
+ public Optional<QuotaSize> getDefaultMaxStorage() {
+ MaxDefaultStorage storedValue =
entityManager.find(MaxDefaultStorage.class, MaxDefaultStorage.DEFAULT_KEY);
+ if (storedValue == null) {
+ return Optional.empty();
+ }
+ return longToQuotaSize(storedValue.getValue());
+ }
+
+ public Optional<QuotaCount> getDefaultMaxMessage() {
+ MaxDefaultMessageCount storedValue =
entityManager.find(MaxDefaultMessageCount.class,
MaxDefaultMessageCount.DEFAULT_KEY);
+ if (storedValue == null) {
+ return Optional.empty();
+ }
+ return longToQuotaCount(storedValue.getValue());
+ }
+
+ public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+ MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class,
quotaRoot.getValue());
+ if (storedValue == null) {
+ return Optional.empty();
+ }
+ return longToQuotaSize(storedValue.getValue());
+ }
+
+ public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+ MaxUserMessageCount storedValue =
entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
+ if (storedValue == null) {
+ return Optional.empty();
+ }
+ return longToQuotaCount(storedValue.getValue());
+ }
+
+
+ private Long quotaValueToLong(Optional<? extends QuotaValue<?>>
maxStorageQuota) {
+ return maxStorageQuota.map(value -> {
+ if (value.isUnlimited()) {
+ return INFINITE;
+ }
+ return value.asLong();
+ }).orElse(null);
+ }
+
+ private Optional<QuotaSize> longToQuotaSize(Long value) {
+ return longToQuotaValue(value, QuotaSize.unlimited(), QuotaSize::size);
+ }
+
+ private Optional<QuotaCount> longToQuotaCount(Long value) {
+ return longToQuotaValue(value, QuotaCount.unlimited(),
QuotaCount::count);
+ }
+
+ private <T extends QuotaValue<T>> Optional<T> longToQuotaValue(Long value,
T infiniteValue, Function<Long, T> quotaFactory) {
+ if (value == null) {
+ return Optional.empty();
+ }
+ if (value == INFINITE) {
+ return Optional.of(infiniteValue);
+ }
+ return Optional.of(quotaFactory.apply(value));
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
index feb8d9e..a2ebbb7 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaManager.java
@@ -19,93 +19,86 @@
package org.apache.james.mailbox.jpa.quota;
+import java.util.Optional;
+
import javax.inject.Inject;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.apache.james.mailbox.exception.MailboxException;
-import org.apache.james.mailbox.jpa.quota.model.MaxDefaultMessageCount;
-import org.apache.james.mailbox.jpa.quota.model.MaxDefaultStorage;
-import org.apache.james.mailbox.jpa.quota.model.MaxUserMessageCount;
-import org.apache.james.mailbox.jpa.quota.model.MaxUserStorage;
-import org.apache.james.mailbox.model.Quota;
+
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;
public class JPAPerUserMaxQuotaManager implements MaxQuotaManager {
- private final EntityManager entityManager;
+ private final JPAPerUserMaxQuotaDAO dao;
@Inject
- public JPAPerUserMaxQuotaManager(EntityManagerFactory
entityManagerFactory) {
- entityManager = entityManagerFactory.createEntityManager();
+ public JPAPerUserMaxQuotaManager(JPAPerUserMaxQuotaDAO dao) {
+ this.dao = dao;
}
@Override
- public void setMaxStorage(QuotaRoot quotaRoot, long maxStorageQuota)
throws MailboxException {
- entityManager.getTransaction().begin();
- entityManager.merge(new MaxUserStorage(quotaRoot.getValue(),
maxStorageQuota));
- entityManager.getTransaction().commit();
+ public void setMaxStorage(QuotaRoot quotaRoot, QuotaSize maxStorageQuota) {
+ dao.setMaxStorage(quotaRoot, Optional.of(maxStorageQuota));
}
@Override
- public void setMaxMessage(QuotaRoot quotaRoot, long maxMessageCount)
throws MailboxException {
- entityManager.getTransaction().begin();
- entityManager.merge(new MaxUserMessageCount(quotaRoot.getValue(),
maxMessageCount));
- entityManager.getTransaction().commit();
+ public void setMaxMessage(QuotaRoot quotaRoot, QuotaCount maxMessageCount)
{
+ dao.setMaxMessage(quotaRoot, Optional.of(maxMessageCount));
}
@Override
- public void setDefaultMaxStorage(long defaultMaxStorage) throws
MailboxException {
- entityManager.getTransaction().begin();
- entityManager.merge(new MaxDefaultStorage(defaultMaxStorage));
- entityManager.getTransaction().commit();
+ public void removeMaxMessage(QuotaRoot quotaRoot) {
+ dao.setMaxMessage(quotaRoot, Optional.empty());
}
@Override
- public void setDefaultMaxMessage(long defaultMaxMessageCount) throws
MailboxException {
- entityManager.getTransaction().begin();
- entityManager.merge(new
MaxDefaultMessageCount(defaultMaxMessageCount));
- entityManager.getTransaction().commit();
+ public void setDefaultMaxStorage(QuotaSize defaultMaxStorage) {
+ dao.setDefaultMaxStorage(Optional.of(defaultMaxStorage));
}
@Override
- public long getDefaultMaxStorage() throws MailboxException {
- MaxDefaultStorage storedValue =
entityManager.find(MaxDefaultStorage.class, MaxDefaultStorage.DEFAULT_KEY);
+ public void removeDefaultMaxMessage() {
+ dao.setDefaultMaxMessage(Optional.empty());
+ }
- if (storedValue == null) {
- return Quota.UNLIMITED;
- }
- return storedValue.getValue();
+ @Override
+ public void setDefaultMaxMessage(QuotaCount defaultMaxMessageCount) {
+ dao.setDefaultMaxMessage(Optional.of(defaultMaxMessageCount));
}
@Override
- public long getDefaultMaxMessage() throws MailboxException {
- MaxDefaultMessageCount storedValue =
entityManager.find(MaxDefaultMessageCount.class,
MaxDefaultMessageCount.DEFAULT_KEY);
+ public Optional<QuotaSize> getDefaultMaxStorage() {
+ return dao.getDefaultMaxStorage();
+ }
- if (storedValue == null) {
- return Quota.UNLIMITED;
- }
- return storedValue.getValue();
+ @Override
+ public Optional<QuotaCount> getDefaultMaxMessage() {
+ return dao.getDefaultMaxMessage();
}
@Override
- public long getMaxStorage(QuotaRoot quotaRoot) throws MailboxException {
- MaxUserStorage storedValue = entityManager.find(MaxUserStorage.class,
quotaRoot.getValue());
+ public Optional<QuotaSize> getMaxStorage(QuotaRoot quotaRoot) {
+ return dao.getMaxStorage(quotaRoot)
+ .map(Optional::of)
+ .orElseGet(this::getDefaultMaxStorage);
+ }
- if (storedValue == null) {
- return getDefaultMaxStorage();
- }
- return storedValue.getValue();
+ @Override
+ public Optional<QuotaCount> getMaxMessage(QuotaRoot quotaRoot) {
+ return dao.getMaxMessage(quotaRoot)
+ .map(Optional::of)
+ .orElseGet(this::getDefaultMaxMessage);
}
@Override
- public long getMaxMessage(QuotaRoot quotaRoot) throws MailboxException {
- MaxUserMessageCount storedValue =
entityManager.find(MaxUserMessageCount.class, quotaRoot.getValue());
+ public void removeMaxStorage(QuotaRoot quotaRoot) {
+ dao.setMaxStorage(quotaRoot, Optional.empty());
+ }
- if (storedValue == null) {
- return getDefaultMaxMessage();
- }
- return storedValue.getValue();
+ @Override
+ public void removeDefaultMaxStorage() {
+ dao.setDefaultMaxStorage(Optional.empty());
}
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
index af334b4..5a19da5 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/JpaCurrentQuotaManager.java
@@ -28,6 +28,8 @@ import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.jpa.quota.model.JpaCurrentQuota;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
import com.google.common.base.Preconditions;
@@ -50,23 +52,23 @@ public class JpaCurrentQuotaManager implements
StoreCurrentQuotaManager {
}
@Override
- public long getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
+ public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
JpaCurrentQuota userQuota = retrieveUserQuota(quotaRoot);
if (userQuota == null) {
- return NO_STORED_BYTES;
+ return QuotaCount.count(NO_STORED_BYTES);
}
- return userQuota.getMessageCount();
+ return QuotaCount.count(userQuota.getMessageCount());
}
@Override
- public long getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException
{
+ public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws
MailboxException {
JpaCurrentQuota userQuota = retrieveUserQuota(quotaRoot);
if (userQuota == null) {
- return NO_STORED_BYTES;
+ return QuotaSize.size(NO_STORED_BYTES);
}
- return userQuota.getSize();
+ return QuotaSize.size(userQuota.getSize());
}
@Override
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultMessageCount.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultMessageCount.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultMessageCount.java
index 1091939..941e42a 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultMessageCount.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultMessageCount.java
@@ -33,10 +33,10 @@ public class MaxDefaultMessageCount {
@Column(name = "QUOTAROOT_ID")
private String quotaRoot = DEFAULT_KEY;
- @Column(name = "VALUE")
- private long value;
+ @Column(name = "VALUE", nullable = true)
+ private Long value;
- public MaxDefaultMessageCount(long value) {
+ public MaxDefaultMessageCount(Long value) {
this.quotaRoot = DEFAULT_KEY;
this.value = value;
}
@@ -44,7 +44,11 @@ public class MaxDefaultMessageCount {
public MaxDefaultMessageCount() {
}
- public long getValue() {
+ public Long getValue() {
return value;
}
+
+ public void setValue(Long value) {
+ this.value = value;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultStorage.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultStorage.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultStorage.java
index 6f18e97..de4a388 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultStorage.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxDefaultStorage.java
@@ -33,10 +33,10 @@ public class MaxDefaultStorage {
@Column(name = "QUOTAROOT_ID")
private String quotaRoot = DEFAULT_KEY;
- @Column(name = "VALUE")
- private long value;
+ @Column(name = "VALUE", nullable = true)
+ private Long value;
- public MaxDefaultStorage(long value) {
+ public MaxDefaultStorage(Long value) {
this.quotaRoot = DEFAULT_KEY;
this.value = value;
}
@@ -44,7 +44,11 @@ public class MaxDefaultStorage {
public MaxDefaultStorage() {
}
- public long getValue() {
+ public Long getValue() {
return value;
}
+
+ public void setValue(Long value) {
+ this.value = value;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java
index 19897b7..71056e9 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserMessageCount.java
@@ -31,10 +31,10 @@ public class MaxUserMessageCount {
@Column(name = "QUOTAROOT_ID")
private String quotaRoot;
- @Column(name = "VALUE")
- private long value;
+ @Column(name = "VALUE", nullable = true)
+ private Long value;
- public MaxUserMessageCount(String quotaRoot, long value) {
+ public MaxUserMessageCount(String quotaRoot, Long value) {
this.quotaRoot = quotaRoot;
this.value = value;
}
@@ -42,7 +42,11 @@ public class MaxUserMessageCount {
public MaxUserMessageCount() {
}
- public long getValue() {
+ public Long getValue() {
return value;
}
+
+ public void setValue(Long value) {
+ this.value = value;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java
index 222fb81..3e01be8 100644
---
a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java
+++
b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/quota/model/MaxUserStorage.java
@@ -32,10 +32,10 @@ public class MaxUserStorage {
@Column(name = "QUOTAROOT_ID")
private String quotaRoot;
- @Column(name = "VALUE")
- private long value;
+ @Column(name = "VALUE", nullable = true)
+ private Long value;
- public MaxUserStorage(String quotaRoot, long value) {
+ public MaxUserStorage(String quotaRoot, Long value) {
this.quotaRoot = quotaRoot;
this.value = value;
}
@@ -43,7 +43,11 @@ public class MaxUserStorage {
public MaxUserStorage() {
}
- public long getValue() {
+ public Long getValue() {
return value;
}
+
+ public void setValue(Long value) {
+ this.value = value;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
index 53d378c..53a014e 100644
--- a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
+++ b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
@@ -92,9 +92,13 @@
<bean id="jpa-mailbox-id-deserializer"
class="org.apache.james.mailbox.jpa.JPAMailboxIdDeserializer"/>
- <bean id="jpaMaxQuotaManager"
class="org.apache.james.mailbox.jpa.quota.JPAPerUserMaxQuotaManager">
+ <bean id="jpa-per-user-max-quota-dao"
class="org.apache.james.mailbox.jpa.quota.JPAPerUserMaxQuotaDAO">
<constructor-arg index="0" ref="entityManagerFactory"/>
</bean>
+
+ <bean id="jpaMaxQuotaManager"
class="org.apache.james.mailbox.jpa.quota.JPAPerUserMaxQuotaManager">
+ <constructor-arg index="0" ref="jpa-per-user-max-quota-dao"/>
+ </bean>
<bean id="jpaCurrentQuotaManager"
class="org.apache.james.mailbox.jpa.quota.JpaCurrentQuotaManager">
<constructor-arg index="0" ref="entityManagerFactory"/>
</bean>
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
----------------------------------------------------------------------
diff --git
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
index baed8c9..aca05da 100644
---
a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
+++
b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/quota/JPAPerUserMaxQuotaTest.java
@@ -31,7 +31,7 @@ public class JPAPerUserMaxQuotaTest extends
GenericMaxQuotaManagerTest {
@Override
protected MaxQuotaManager provideMaxQuotaManager() {
- return new
JPAPerUserMaxQuotaManager(JPA_TEST_CLUSTER.getEntityManagerFactory());
+ return new JPAPerUserMaxQuotaManager(new
JPAPerUserMaxQuotaDAO(JPA_TEST_CLUSTER.getEntityManagerFactory()));
}
@After
http://git-wip-us.apache.org/repos/asf/james-project/blob/ebcb09a0/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
----------------------------------------------------------------------
diff --git
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
index 4dbdc20..d41ad0e 100644
---
a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
+++
b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/quota/InMemoryCurrentQuotaManager.java
@@ -28,6 +28,8 @@ import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.MailboxManager;
import org.apache.james.mailbox.exception.MailboxException;
import org.apache.james.mailbox.model.QuotaRoot;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.store.quota.CurrentQuotaCalculator;
import org.apache.james.mailbox.store.quota.StoreCurrentQuotaManager;
@@ -68,18 +70,18 @@ public class InMemoryCurrentQuotaManager implements
StoreCurrentQuotaManager {
}
@Override
- public long getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
+ public QuotaCount getCurrentMessageCount(QuotaRoot quotaRoot) throws
MailboxException {
try {
- return quotaCache.get(quotaRoot).getCount().get();
+ return
QuotaCount.count(quotaCache.get(quotaRoot).getCount().get());
} catch (ExecutionException e) {
throw new MailboxException("Exception caught", e);
}
}
@Override
- public long getCurrentStorage(QuotaRoot quotaRoot) throws MailboxException
{
+ public QuotaSize getCurrentStorage(QuotaRoot quotaRoot) throws
MailboxException {
try {
- return quotaCache.get(quotaRoot).getSize().get();
+ return QuotaSize.size(quotaCache.get(quotaRoot).getSize().get());
} catch (ExecutionException e) {
throw new MailboxException("Exception caught", e);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]