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 ma...@apache.org on 2018/05/18 14:29:55 UTC
[2/4] james-project git commit: JAMES-2401 Getting user details
should return occupation
JAMES-2401 Getting user details should return occupation
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/4c1093dd
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/4c1093dd
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/4c1093dd
Branch: refs/heads/master
Commit: 4c1093dd2cfdad3edbc4d78313252c66768881f9
Parents: bb01282
Author: benwa <bt...@linagora.com>
Authored: Fri May 18 16:23:08 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Fri May 18 16:41:16 2018 +0700
----------------------------------------------------------------------
.../org/apache/james/mailbox/model/Quota.java | 7 +++
.../apache/james/mailbox/model/QuotaTest.java | 23 +++++++
.../james/webadmin/dto/OccupationDTO.java | 55 +++++++++++++++++
.../james/webadmin/dto/OccupationRatioDTO.java | 53 ++++++++++++++++
.../james/webadmin/dto/QuotaDetailsDTO.java | 21 ++++++-
.../webadmin/service/UserQuotaService.java | 9 ++-
.../webadmin/routes/UserQuotaRoutesTest.java | 63 +++++++++++++++++++-
7 files changed, 226 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/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 cabd05a..8b2a2a8 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
@@ -94,6 +94,13 @@ public class Quota<T extends QuotaValue<T>> {
return used;
}
+ public double getRatio() {
+ if (limit.isUnlimited()) {
+ return 0;
+ }
+ return Double.valueOf(used.asLong()) / Double.valueOf(limit.asLong());
+ }
+
public ImmutableMap<Scope, T> getLimitByScope() {
return limitByScope;
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/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 ef5a1d6..bcf360b 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
@@ -23,6 +23,7 @@ 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.Test;
public class QuotaTest {
@@ -93,4 +94,26 @@ public class QuotaTest {
assertThat(actual).isNotNull();
}
+ @Test
+ public void getRatioShouldReturnUsedDividedByLimit() {
+ assertThat(
+ Quota.<QuotaSize>builder()
+ .used(QuotaSize.size(15))
+ .computedLimit(QuotaSize.size(60))
+ .build()
+ .getRatio())
+ .isEqualTo(0.25);
+ }
+
+ @Test
+ public void getRatioShouldReturnZeroWhenUnlimited() {
+ assertThat(
+ Quota.<QuotaSize>builder()
+ .used(QuotaSize.size(15))
+ .computedLimit(QuotaSize.unlimited())
+ .build()
+ .getRatio())
+ .isEqualTo(0);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
new file mode 100644
index 0000000..ca85a37
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationDTO.java
@@ -0,0 +1,55 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+
+public class OccupationDTO {
+ public static OccupationDTO from(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+ return new OccupationDTO(
+ sizeQuota.getUsed().asLong(),
+ countQuota.getUsed().asLong(),
+ OccupationRatioDTO.from(sizeQuota, countQuota));
+ }
+
+ private final long size;
+ private final long count;
+ private final OccupationRatioDTO ratio;
+
+ private OccupationDTO(long size, long count, OccupationRatioDTO ratio) {
+ this.size = size;
+ this.count = count;
+ this.ratio = ratio;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public long getCount() {
+ return count;
+ }
+
+ public OccupationRatioDTO getRatio() {
+ return ratio;
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/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
new file mode 100644
index 0000000..1358f13
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/OccupationRatioDTO.java
@@ -0,0 +1,53 @@
+/****************************************************************
+ * 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.webadmin.dto;
+
+import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+
+public class OccupationRatioDTO {
+
+ public static OccupationRatioDTO from(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+ return new OccupationRatioDTO(
+ sizeQuota.getRatio(),
+ countQuota.getRatio());
+ }
+
+ private final double size;
+ private final double count;
+
+ private OccupationRatioDTO(double size, double count) {
+ this.size = size;
+ this.count = count;
+ }
+
+ public double getSize() {
+ return size;
+ }
+
+ public double getCount() {
+ return count;
+ }
+
+ public double getMax() {
+ return Math.max(size, count);
+ }
+}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
index 0519c43..e365ecc 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/dto/QuotaDetailsDTO.java
@@ -23,6 +23,10 @@ package org.apache.james.webadmin.dto;
import java.util.Optional;
import org.apache.james.mailbox.model.Quota;
+import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaSize;
+
+import com.google.common.base.Preconditions;
public class QuotaDetailsDTO {
@@ -35,6 +39,7 @@ public class QuotaDetailsDTO {
private Optional<QuotaDTO> domain;
private Optional<QuotaDTO> user;
private Optional<QuotaDTO> computed;
+ private OccupationDTO occupation;
private Builder() {
global = Optional.empty();
@@ -62,6 +67,11 @@ public class QuotaDetailsDTO {
return this;
}
+ public Builder occupation(Quota<QuotaSize> sizeQuota, Quota<QuotaCount> countQuota) {
+ this.occupation = OccupationDTO.from(sizeQuota, countQuota);
+ return this;
+ }
+
public Builder valueForScope(Quota.Scope scope, QuotaDTO value) {
switch (scope) {
case Global:
@@ -75,7 +85,8 @@ public class QuotaDetailsDTO {
}
public QuotaDetailsDTO build() {
- return new QuotaDetailsDTO(global, domain, user, computed);
+ Preconditions.checkNotNull(occupation);
+ return new QuotaDetailsDTO(global, domain, user, computed, occupation);
}
}
@@ -83,12 +94,14 @@ public class QuotaDetailsDTO {
private final Optional<QuotaDTO> domain;
private final Optional<QuotaDTO> user;
private final Optional<QuotaDTO> computed;
+ private final OccupationDTO occupation;
- private QuotaDetailsDTO(Optional<QuotaDTO> global, Optional<QuotaDTO> domain, Optional<QuotaDTO> user, Optional<QuotaDTO> computed) {
+ private QuotaDetailsDTO(Optional<QuotaDTO> global, Optional<QuotaDTO> domain, Optional<QuotaDTO> user, Optional<QuotaDTO> computed, OccupationDTO occupation) {
this.global = global;
this.domain = domain;
this.user = user;
this.computed = computed;
+ this.occupation = occupation;
}
public Optional<QuotaDTO> getGlobal() {
@@ -106,4 +119,8 @@ public class QuotaDetailsDTO {
public Optional<QuotaDTO> getComputed() {
return computed;
}
+
+ public OccupationDTO getOccupation() {
+ return occupation;
+ }
}
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
index 7e48bba..31a934f 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/service/UserQuotaService.java
@@ -31,6 +31,7 @@ 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.QuotaManager;
import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.quota.UserQuotaRootResolver;
import org.apache.james.webadmin.dto.QuotaDTO;
@@ -42,11 +43,13 @@ import com.google.common.collect.Sets;
public class UserQuotaService {
private final MaxQuotaManager maxQuotaManager;
+ private final QuotaManager quotaManager;
private final UserQuotaRootResolver userQuotaRootResolver;
@Inject
- public UserQuotaService(MaxQuotaManager maxQuotaManager, UserQuotaRootResolver userQuotaRootResolver) {
+ public UserQuotaService(MaxQuotaManager maxQuotaManager, QuotaManager quotaManager, UserQuotaRootResolver userQuotaRootResolver) {
this.maxQuotaManager = maxQuotaManager;
+ this.quotaManager = quotaManager;
this.userQuotaRootResolver = userQuotaRootResolver;
}
@@ -60,7 +63,9 @@ public class UserQuotaService {
public QuotaDetailsDTO getQuota(User user) throws MailboxException {
QuotaRoot quotaRoot = userQuotaRootResolver.forUser(user);
- QuotaDetailsDTO.Builder quotaDetails = QuotaDetailsDTO.builder();
+ QuotaDetailsDTO.Builder quotaDetails = QuotaDetailsDTO.builder()
+ .occupation(quotaManager.getStorageQuota(quotaRoot),
+ quotaManager.getMessageQuota(quotaRoot));
mergeMaps(
maxQuotaManager.listMaxMessagesDetails(quotaRoot),
http://git-wip-us.apache.org/repos/asf/james-project/blob/4c1093dd/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
index 2d877e3..b3c7204 100644
--- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/UserQuotaRoutesTest.java
@@ -23,6 +23,8 @@ import static com.jayway.restassured.RestAssured.given;
import static com.jayway.restassured.RestAssured.when;
import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
import java.util.Map;
@@ -31,10 +33,13 @@ import org.apache.james.core.User;
import org.apache.james.dnsservice.api.InMemoryDNSService;
import org.apache.james.domainlist.memory.MemoryDomainList;
import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
+import org.apache.james.mailbox.quota.CurrentQuotaManager;
import org.apache.james.mailbox.quota.QuotaCount;
+import org.apache.james.mailbox.quota.QuotaManager;
import org.apache.james.mailbox.quota.QuotaSize;
import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
import org.apache.james.mailbox.store.quota.DefaultUserQuotaRootResolver;
+import org.apache.james.mailbox.store.quota.StoreQuotaManager;
import org.apache.james.metrics.api.NoopMetricFactory;
import org.apache.james.user.memory.MemoryUsersRepository;
import org.apache.james.webadmin.WebAdminServer;
@@ -48,6 +53,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
import com.google.common.collect.ImmutableSet;
import com.jayway.restassured.RestAssured;
@@ -67,6 +73,7 @@ class UserQuotaRoutesTest {
private WebAdminServer webAdminServer;
private InMemoryPerUserMaxQuotaManager maxQuotaManager;
private DefaultUserQuotaRootResolver userQuotaRootResolver;
+ private CurrentQuotaManager currentQuotaManager;
@BeforeEach
void setUp() throws Exception {
@@ -79,7 +86,13 @@ class UserQuotaRoutesTest {
usersRepository.addUser(BOB.asString(), PASSWORD);
MailboxSessionMapperFactory factory = null;
userQuotaRootResolver = new DefaultUserQuotaRootResolver(factory);
- UserQuotaService userQuotaService = new UserQuotaService(maxQuotaManager, userQuotaRootResolver);
+
+ currentQuotaManager = mock(CurrentQuotaManager.class);
+ Mockito.when(currentQuotaManager.getCurrentMessageCount(any())).thenReturn(QuotaCount.count(0));
+ Mockito.when(currentQuotaManager.getCurrentStorage(any())).thenReturn(QuotaSize.size(0));
+
+ QuotaManager quotaManager = new StoreQuotaManager(currentQuotaManager, maxQuotaManager);
+ UserQuotaService userQuotaService = new UserQuotaService(maxQuotaManager, quotaManager, userQuotaRootResolver);
QuotaModule quotaModule = new QuotaModule();
UserQuotaRoutes userQuotaRoutes = new UserQuotaRoutes(usersRepository, userQuotaService, new JsonTransformer(quotaModule), ImmutableSet.of(quotaModule));
webAdminServer = WebAdminUtils.createWebAdminServer(
@@ -422,6 +435,54 @@ class UserQuotaRoutesTest {
}
@Test
+ public void getQuotaShouldReturnOccupation() throws Exception {
+ maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.size(80));
+ maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(100));
+ Mockito.when(currentQuotaManager.getCurrentStorage(any())).thenReturn(QuotaSize.size(40));
+ Mockito.when(currentQuotaManager.getCurrentMessageCount(any())).thenReturn(QuotaCount.count(20));
+
+ JsonPath jsonPath =
+ given()
+ .get(QUOTA_USERS + "/" + BOB.asString())
+ .then()
+ .statusCode(HttpStatus.OK_200)
+ .contentType(ContentType.JSON)
+ .extract()
+ .jsonPath();
+
+ SoftAssertions softly = new SoftAssertions();
+ softly.assertThat(jsonPath.getLong("occupation.count")).isEqualTo(20);
+ softly.assertThat(jsonPath.getLong("occupation.size")).isEqualTo(40);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.count")).isEqualTo(0.2);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.size")).isEqualTo(0.5);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.max")).isEqualTo(0.5);
+ }
+
+ @Test
+ public void getQuotaShouldReturnOccupationWhenUnlimited() throws Exception {
+ maxQuotaManager.setMaxStorage(userQuotaRootResolver.forUser(BOB), QuotaSize.unlimited());
+ maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.unlimited());
+ Mockito.when(currentQuotaManager.getCurrentStorage(any())).thenReturn(QuotaSize.size(40));
+ Mockito.when(currentQuotaManager.getCurrentMessageCount(any())).thenReturn(QuotaCount.count(20));
+
+ JsonPath jsonPath =
+ given()
+ .get(QUOTA_USERS + "/" + BOB.asString())
+ .then()
+ .statusCode(HttpStatus.OK_200)
+ .contentType(ContentType.JSON)
+ .extract()
+ .jsonPath();
+
+ SoftAssertions softly = new SoftAssertions();
+ softly.assertThat(jsonPath.getLong("occupation.count")).isEqualTo(20);
+ softly.assertThat(jsonPath.getLong("occupation.size")).isEqualTo(40);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.count")).isEqualTo(0);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.size")).isEqualTo(0);
+ softly.assertThat(jsonPath.getDouble("occupation.ratio.max")).isEqualTo(0);
+ }
+
+ @Test
public void getQuotaShouldReturnOnlySpecifiedValues() throws Exception {
maxQuotaManager.setGlobalMaxStorage(QuotaSize.size(1111));
maxQuotaManager.setMaxMessage(userQuotaRootResolver.forUser(BOB), QuotaCount.count(18));
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org