You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2018/05/28 01:06:23 UTC

[13/13] james-project git commit: JAMES-2403 Retrieving the max ratio should be defined once

JAMES-2403 Retrieving the max ratio should be defined once


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

Branch: refs/heads/master
Commit: f8b587a7a5d76d3da614a07b95e69c1fe07ea5d5
Parents: 95c4423
Author: Antoine Duprat <ad...@linagora.com>
Authored: Thu May 24 13:27:13 2018 +0200
Committer: benwa <bt...@linagora.com>
Committed: Mon May 28 08:05:36 2018 +0700

----------------------------------------------------------------------
 .../apache/james/mailbox/model/QuotaRatio.java  | 80 ++++++++++++++++++++
 .../james/mailbox/model/QuotaRatioTest.java     | 79 +++++++++++++++++++
 .../elasticsearch/json/QuotaRatioAsJson.java    | 14 ++--
 .../json/QuotaRatioToElasticSearchJson.java     |  5 +-
 .../json/QuotaRatioAsJsonTest.java              | 29 ++++++-
 .../quota/search/scanning/ClauseConverter.java  |  3 +-
 .../james/webadmin/dto/OccupationRatioDTO.java  | 10 ++-
 7 files changed, 205 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
new file mode 100644
index 0000000..5ba6bf1
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/QuotaRatio.java
@@ -0,0 +1,80 @@
+/****************************************************************
+ * 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.model;
+
+import java.util.Objects;
+
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+
+public class QuotaRatio {
+
+    public static QuotaRatio from(Quota<QuotaSize> quotaSize, Quota<QuotaCount> quotaCount) {
+        return new QuotaRatio(quotaSize, quotaCount);
+    }
+
+    private final Quota<QuotaSize> quotaSize;
+    private final Quota<QuotaCount> quotaCount;
+
+    private QuotaRatio(Quota<QuotaSize> quotaSize, Quota<QuotaCount> quotaCount) {
+        Preconditions.checkNotNull(quotaSize, "'quotaSize' is mandatory");
+        Preconditions.checkNotNull(quotaCount, "'quotaCount' is mandatory");
+        this.quotaSize = quotaSize;
+        this.quotaCount = quotaCount;
+    }
+
+    public Quota<QuotaSize> getQuotaSize() {
+        return quotaSize;
+    }
+
+    public Quota<QuotaCount> getQuotaCount() {
+        return quotaCount;
+    }
+
+    public double max() {
+        return Math.max(quotaSize.getRatio(), quotaCount.getRatio());
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (o instanceof QuotaRatio) {
+            QuotaRatio quotaRatio = (QuotaRatio) o;
+
+            return Objects.equals(this.quotaSize, quotaRatio.quotaSize)
+                && Objects.equals(this.quotaCount, quotaRatio.quotaCount);
+        }
+        return false;
+    }
+
+    @Override
+    public final int hashCode() {
+        return Objects.hash(quotaSize, quotaCount);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("quotaSize", quotaSize)
+            .add("quotaCount", quotaCount)
+            .toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
new file mode 100644
index 0000000..182caf6
--- /dev/null
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/model/QuotaRatioTest.java
@@ -0,0 +1,79 @@
+/****************************************************************
+ * 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.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+public class QuotaRatioTest {
+
+    private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize> builder()
+            .used(QuotaSize.size(15))
+            .computedLimit(QuotaSize.size(60))
+            .build();
+    private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount> builder()
+            .used(QuotaCount.count(1))
+            .computedLimit(QuotaCount.count(2))
+            .build();
+
+    @Test
+    public void shouldMatchBeanContact() {
+        EqualsVerifier.forClass(QuotaRatio.class)
+            .allFieldsShouldBeUsed()
+            .verify();
+    }
+
+    @Test
+    public void quotaRatioShouldThrowWhenQuotaSizeIsNull() {
+        assertThatThrownBy(() -> QuotaRatio.from(null, QUOTA_COUNT))
+            .isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    public void quotaRatioShouldThrowWhenQuotaCountIsNull() {
+        assertThatThrownBy(() -> QuotaRatio.from(QUOTA_SIZE, null))
+            .isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    public void quotaSizeShouldReturnTheQuotaSize() {
+        QuotaRatio quotaRatio = QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT);
+        assertThat(quotaRatio.getQuotaSize()).isEqualTo(QUOTA_SIZE);
+    }
+
+    @Test
+    public void quotaCountShouldReturnTheQuotaCount() {
+        QuotaRatio quotaRatio = QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT);
+        assertThat(quotaRatio.getQuotaCount()).isEqualTo(QUOTA_COUNT);
+    }
+
+    @Test
+    public void maxShouldReturnTheMaxRatio() {
+        double max = QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT)
+                .max();
+
+        assertThat(max).isEqualTo(0.5);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
index ec8e597..4084727 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJson.java
@@ -21,6 +21,8 @@ package org.apache.james.quota.search.elasticsearch.json;
 import java.util.Objects;
 import java.util.Optional;
 
+import org.apache.james.mailbox.model.QuotaRatio;
+
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
@@ -36,7 +38,7 @@ public class QuotaRatioAsJson {
 
         private String user;
         private Optional<String> domain;
-        private Double quotaRatio;
+        private QuotaRatio quotaRatio;
 
         private Builder() {
             domain = Optional.empty();
@@ -52,7 +54,7 @@ public class QuotaRatioAsJson {
             return this;
         }
 
-        public Builder quotaRatio(double quotaRatio) {
+        public Builder quotaRatio(QuotaRatio quotaRatio) {
             this.quotaRatio = quotaRatio;
             return this;
         }
@@ -67,9 +69,9 @@ public class QuotaRatioAsJson {
 
     private final String user;
     private final Optional<String> domain;
-    private final double quotaRatio;
+    private final QuotaRatio quotaRatio;
 
-    private QuotaRatioAsJson(String user, Optional<String> domain, double quotaRatio) {
+    private QuotaRatioAsJson(String user, Optional<String> domain, QuotaRatio quotaRatio) {
         this.user = user;
         this.domain = domain;
         this.quotaRatio = quotaRatio;
@@ -86,8 +88,8 @@ public class QuotaRatioAsJson {
     }
 
     @JsonProperty(JsonMessageConstants.QUOTA_RATIO)
-    public double getQuotaRatio() {
-        return quotaRatio;
+    public double getMaxQuotaRatio() {
+        return quotaRatio.max();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
index ad8f975..a03577f 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/main/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioToElasticSearchJson.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
 
 import org.apache.james.core.Domain;
 import org.apache.james.mailbox.MailboxListener.QuotaUsageUpdatedEvent;
+import org.apache.james.mailbox.model.QuotaRatio;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -42,9 +43,7 @@ public class QuotaRatioToElasticSearchJson {
         return mapper.writeValueAsString(QuotaRatioAsJson.builder()
                 .user(user)
                 .domain(event.getQuotaRoot().getDomain().map(Domain::asString))
-                .quotaRatio(Math.max(
-                    event.getCountQuota().getRatio(),
-                    event.getSizeQuota().getRatio()))
+                .quotaRatio(QuotaRatio.from(event.getSizeQuota(), event.getCountQuota()))
                 .build());
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
index e0b9c14..fb16937 100644
--- a/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
+++ b/mailbox/plugin/quota-search-elasticsearch/src/test/java/org/apache/james/quota/search/elasticsearch/json/QuotaRatioAsJsonTest.java
@@ -23,12 +23,25 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
 import java.util.Optional;
 
+import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.model.QuotaRatio;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
 import org.junit.jupiter.api.Test;
 
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 public class QuotaRatioAsJsonTest {
 
+    private static final Quota<QuotaSize> QUOTA_SIZE = Quota.<QuotaSize> builder()
+            .used(QuotaSize.size(15))
+            .computedLimit(QuotaSize.size(60))
+            .build();
+    private static final Quota<QuotaCount> QUOTA_COUNT = Quota.<QuotaCount> builder()
+            .used(QuotaCount.count(1))
+            .computedLimit(QuotaCount.count(2))
+            .build();
+
     @Test
     public void shouldMatchBeanContract() {
         EqualsVerifier.forClass(QuotaRatioAsJson.class)
@@ -63,7 +76,7 @@ public class QuotaRatioAsJsonTest {
     public void getDomainShouldReturnEmptyWhenNone() {
         QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
             .user("user")
-            .quotaRatio(0.3)
+            .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
             .build();
 
         assertThat(quotaRatioAsJson.getDomain()).isEmpty();
@@ -75,9 +88,21 @@ public class QuotaRatioAsJsonTest {
         QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
             .user("user")
             .domain(Optional.of(domain))
-            .quotaRatio(0.2)
+            .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
             .build();
 
         assertThat(quotaRatioAsJson.getDomain()).contains(domain);
     }
+
+    @Test
+    public void getMaxQuotaRatioShouldReturnTheMaxQuotaRatio() {
+        String domain = "domain";
+        QuotaRatioAsJson quotaRatioAsJson = QuotaRatioAsJson.builder()
+            .user("user")
+            .domain(Optional.of(domain))
+            .quotaRatio(QuotaRatio.from(QUOTA_SIZE, QUOTA_COUNT))
+            .build();
+
+        assertThat(quotaRatioAsJson.getMaxQuotaRatio()).isEqualTo(0.5);
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
----------------------------------------------------------------------
diff --git a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
index f1d9035..c527a70 100644
--- a/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
+++ b/mailbox/plugin/quota-search-scanning/src/main/java/org/apache/james/quota/search/scanning/ClauseConverter.java
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 import org.apache.james.core.User;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.model.QuotaRatio;
 import org.apache.james.mailbox.model.QuotaRoot;
 import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaManager;
@@ -95,7 +96,7 @@ public class ClauseConverter {
             Quota<QuotaSize> storageQuota = quotaManager.getStorageQuota(quotaRoot);
             Quota<QuotaCount> messageQuota = quotaManager.getMessageQuota(quotaRoot);
 
-            return Math.max(storageQuota.getRatio(), messageQuota.getRatio());
+            return QuotaRatio.from(storageQuota, messageQuota).max();
         } catch (MailboxException e) {
             throw new RuntimeException(e);
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/f8b587a7/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
index 1358f13..2189aa2 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
@@ -20,6 +20,7 @@
 package org.apache.james.webadmin.dto;
 
 import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.model.QuotaRatio;
 import org.apache.james.mailbox.quota.QuotaCount;
 import org.apache.james.mailbox.quota.QuotaSize;
 
@@ -28,15 +29,18 @@ public class OccupationRatioDTO {
     public static OccupationRatioDTO from(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
         return new OccupationRatioDTO(
             sizeQuota.getRatio(),
-            countQuota.getRatio());
+            countQuota.getRatio(),
+            QuotaRatio.from(sizeQuota, countQuota).max());
     }
 
     private final double size;
     private final double count;
+    private final double max;
 
-    private OccupationRatioDTO(double size, double count) {
+    private OccupationRatioDTO(double size, double count, double max) {
         this.size = size;
         this.count = count;
+        this.max = max;
     }
 
     public double getSize() {
@@ -48,6 +52,6 @@ public class OccupationRatioDTO {
     }
 
     public double getMax() {
-        return Math.max(size, count);
+        return max;
     }
 }


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