This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1b0bc6e1d6caa93a7a155193ac00d1fd09809db2 Author: Rene Cordier <rcord...@linagora.com> AuthorDate: Wed Apr 22 11:01:21 2020 +0700 JAMES-3138 Webadmin endpoint and guice bindings for recomputing current quotas --- .../org/apache/james/CassandraJamesServerMain.java | 2 + .../guice/cassandra-rabbitmq-guice/pom.xml | 4 ++ .../james/modules/TaskSerializationModule.java | 13 +++++ .../java/org/apache/james/JPAJamesServerMain.java | 2 + .../InconsistencyQuotasSolvingRoutesModule.java | 40 +++++++++++++++ .../james/modules/server/MailboxRoutesModule.java | 2 + ...dminServerTaskSerializationIntegrationTest.java | 22 +++++++- server/protocols/webadmin/webadmin-mailbox/pom.xml | 4 ++ .../RecomputeCurrentQuotasRequestToTask.java | 37 ++++++++++++++ .../james/webadmin/routes/UserQuotaRoutes.java | 59 +++++++++++++++++++++- .../routes/WebAdminQuotaSearchTestSystem.java | 11 +++- 11 files changed, 192 insertions(+), 4 deletions(-) diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java index 9bc756c..a7fcc7d 100644 --- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java +++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/CassandraJamesServerMain.java @@ -55,6 +55,7 @@ import org.apache.james.modules.server.DKIMMailetModule; import org.apache.james.modules.server.DLPRoutesModule; import org.apache.james.modules.server.DataRoutesModules; import org.apache.james.modules.server.ElasticSearchMetricReporterModule; +import org.apache.james.modules.server.InconsistencyQuotasSolvingRoutesModule; import org.apache.james.modules.server.JMXServerModule; import org.apache.james.modules.server.JmapTasksModule; import org.apache.james.modules.server.MailQueueRoutesModule; @@ -85,6 +86,7 @@ public class CassandraJamesServerMain implements JamesServerMain { new DataRoutesModules(), new DeletedMessageVaultRoutesModule(), new DLPRoutesModule(), + new InconsistencyQuotasSolvingRoutesModule(), new InconsistencySolvingRoutesModule(), new JmapTasksModule(), new MailboxesExportRoutesModule(), diff --git a/server/container/guice/cassandra-rabbitmq-guice/pom.xml b/server/container/guice/cassandra-rabbitmq-guice/pom.xml index 29fffab..ade5311 100644 --- a/server/container/guice/cassandra-rabbitmq-guice/pom.xml +++ b/server/container/guice/cassandra-rabbitmq-guice/pom.xml @@ -87,6 +87,10 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>blob-objectstorage</artifactId> <type>test-jar</type> <scope>test</scope> diff --git a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java index ab6b867..0e8b86f 100644 --- a/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java +++ b/server/container/guice/cassandra-rabbitmq-guice/src/main/java/org/apache/james/modules/TaskSerializationModule.java @@ -46,6 +46,9 @@ import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesT import org.apache.james.mailbox.cassandra.mail.task.SolveMessageInconsistenciesTaskDTO; import org.apache.james.mailbox.model.MailboxId; import org.apache.james.mailbox.model.MessageId; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskAdditionalInformationDTO; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTaskDTO; import org.apache.james.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; import org.apache.james.rrt.cassandra.CassandraMappingsSourcesDAO; @@ -279,6 +282,11 @@ public class TaskSerializationModule extends AbstractModule { } @ProvidesIntoSet + public TaskDTOModule<? extends Task, ? extends TaskDTO> recomputeCurrentQuotasTask(RecomputeCurrentQuotasService service) { + return RecomputeCurrentQuotasTaskDTO.module(service); + } + + @ProvidesIntoSet public TaskDTOModule<? extends Task, ? extends TaskDTO> messageIdReindexingTask(MessageIdReIndexingTask.Factory factory) { return MessageIdReindexingTaskDTO.module(factory); } @@ -399,6 +407,11 @@ public class TaskSerializationModule extends AbstractModule { } @ProvidesIntoSet + public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO> recomputeCurrentQuotasAdditionalInformation() { + return RecomputeCurrentQuotasTaskAdditionalInformationDTO.MODULE; + } + + @ProvidesIntoSet public AdditionalInformationDTOModule<? extends TaskExecutionDetails.AdditionalInformation, ? extends AdditionalInformationDTO> messageIdReindexingAdditionalInformation(MessageId.Factory messageIdFactory) { return MessageIdReindexingTaskAdditionalInformationDTO.serializationModule(messageIdFactory); } diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java index 45f6c3d..19ba467 100644 --- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java +++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/JPAJamesServerMain.java @@ -36,6 +36,7 @@ import org.apache.james.modules.protocols.SMTPServerModule; import org.apache.james.modules.server.DataRoutesModules; import org.apache.james.modules.server.DefaultProcessorsConfigurationProviderModule; import org.apache.james.modules.server.ElasticSearchMetricReporterModule; +import org.apache.james.modules.server.InconsistencyQuotasSolvingRoutesModule; import org.apache.james.modules.server.JMXServerModule; import org.apache.james.modules.server.MailQueueRoutesModule; import org.apache.james.modules.server.MailRepositoriesRoutesModule; @@ -57,6 +58,7 @@ public class JPAJamesServerMain implements JamesServerMain { public static final Module WEBADMIN = Modules.combine( new WebAdminServerModule(), new DataRoutesModules(), + new InconsistencyQuotasSolvingRoutesModule(), new MailboxRoutesModule(), new MailQueueRoutesModule(), new MailRepositoriesRoutesModule(), diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/InconsistencyQuotasSolvingRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/InconsistencyQuotasSolvingRoutesModule.java new file mode 100644 index 0000000..a5a77c0 --- /dev/null +++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/InconsistencyQuotasSolvingRoutesModule.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.modules.server; + +import static org.apache.james.webadmin.routes.UserQuotaRoutes.USER_QUOTAS_OPERATIONS_INJECTION_KEY; + +import org.apache.james.webadmin.routes.UserQuotaRoutes; +import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; + +import com.google.inject.AbstractModule; +import com.google.inject.multibindings.Multibinder; +import com.google.inject.name.Names; + +public class InconsistencyQuotasSolvingRoutesModule extends AbstractModule { + + @Override + protected void configure() { + Multibinder.newSetBinder(binder(), TaskFromRequestRegistry.TaskRegistration.class, Names.named(USER_QUOTAS_OPERATIONS_INJECTION_KEY)) + .addBinding() + .to(UserQuotaRoutes.RecomputeCurrentQuotasRequestToTask.class); + } + +} diff --git a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java index 42a7c88..6da9e2c 100644 --- a/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java +++ b/server/container/guice/protocols/webadmin-mailbox/src/main/java/org/apache/james/modules/server/MailboxRoutesModule.java @@ -23,6 +23,7 @@ import static org.apache.james.webadmin.routes.MailboxesRoutes.ALL_MAILBOXES_TAS import static org.apache.james.webadmin.routes.MailboxesRoutes.ONE_MAILBOX_TASKS; import static org.apache.james.webadmin.routes.MailboxesRoutes.ONE_MAIL_TASKS; import static org.apache.james.webadmin.routes.UserMailboxesRoutes.USER_MAILBOXES_OPERATIONS_INJECTION_KEY; +import static org.apache.james.webadmin.routes.UserQuotaRoutes.USER_QUOTAS_OPERATIONS_INJECTION_KEY; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.jackson.QuotaModule; @@ -58,5 +59,6 @@ public class MailboxRoutesModule extends AbstractModule { Multibinder.newSetBinder(binder(), TaskRegistration.class, Names.named(ALL_MAILBOXES_TASKS)); Multibinder.newSetBinder(binder(), TaskRegistration.class, Names.named(ONE_MAILBOX_TASKS)); Multibinder.newSetBinder(binder(), TaskRegistration.class, Names.named(ONE_MAIL_TASKS)); + Multibinder.newSetBinder(binder(), TaskRegistration.class, Names.named(USER_QUOTAS_OPERATIONS_INJECTION_KEY)); } } diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java index fe77c70..124c4dd 100644 --- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java +++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java @@ -82,7 +82,6 @@ import org.apache.james.webadmin.routes.MailRepositoriesRoutes; import org.apache.james.webadmin.routes.TasksRoutes; import org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRoutes; import org.apache.mailet.base.test.FakeMail; -import org.assertj.core.api.Assertions; import org.eclipse.jetty.http.HttpStatus; import org.hamcrest.Matchers; import org.junit.jupiter.api.BeforeEach; @@ -759,6 +758,27 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest { .body("additionalInformation.processedMailboxes", is(0)); } + @Test + void recomputeCurrentQuotasShouldComplete() { + String taskId = with() + .basePath("/quota/users") + .queryParam("task", "RecomputeCurrentQuotas") + .post() + .jsonPath() + .get("taskId"); + + given() + .basePath(TasksRoutes.BASE) + .when() + .get(taskId + "/await") + .then() + .body("status", is("completed")) + .body("taskId", is(taskId)) + .body("type", is("recompute-current-quotas")) + .body("additionalInformation.processedQuotaRoots", is(0)) + .body("additionalInformation.failedQuotaRoots", empty()); + } + private MailboxListener.MailboxAdded createMailboxAdded() { String uuid = "6e0dd59d-660e-4d9b-b22f-0354479f47b4"; return EventFactory.mailboxAdded() diff --git a/server/protocols/webadmin/webadmin-mailbox/pom.xml b/server/protocols/webadmin/webadmin-mailbox/pom.xml index c5e95fb..44fd413 100644 --- a/server/protocols/webadmin/webadmin-mailbox/pom.xml +++ b/server/protocols/webadmin/webadmin-mailbox/pom.xml @@ -90,6 +90,10 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>apache-james-mailbox-tools-quota-recompute</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>apache-james-backends-es</artifactId> <type>test-jar</type> <scope>test</scope> diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/RecomputeCurrentQuotasRequestToTask.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/RecomputeCurrentQuotasRequestToTask.java new file mode 100644 index 0000000..a407c77 --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/RecomputeCurrentQuotasRequestToTask.java @@ -0,0 +1,37 @@ +/**************************************************************** + * 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.routes; + +import javax.inject.Inject; + +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTask; +import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; +import org.apache.james.webadmin.tasks.TaskRegistrationKey; + +public class RecomputeCurrentQuotasRequestToTask extends TaskFromRequestRegistry.TaskRegistration { + private static final TaskRegistrationKey REGISTRATION_KEY = TaskRegistrationKey.of("RecomputeCurrentQuotas"); + + @Inject + public RecomputeCurrentQuotasRequestToTask(RecomputeCurrentQuotasService service) { + super(REGISTRATION_KEY, + request -> new RecomputeCurrentQuotasTask(service)); + } +} diff --git a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java index fda1b65..0f73118 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/main/java/org/apache/james/webadmin/routes/UserQuotaRoutes.java @@ -19,6 +19,8 @@ package org.apache.james.webadmin.routes; +import static org.apache.james.webadmin.routes.MailboxesRoutes.TASK_PARAMETER; + import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; @@ -27,8 +29,10 @@ import java.util.Set; import java.util.stream.Collectors; import javax.inject.Inject; +import javax.inject.Named; import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -37,10 +41,13 @@ import org.apache.james.core.Domain; import org.apache.james.core.Username; import org.apache.james.core.quota.QuotaCountLimit; import org.apache.james.core.quota.QuotaSizeLimit; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasService; +import org.apache.james.mailbox.quota.task.RecomputeCurrentQuotasTask; import org.apache.james.quota.search.Limit; import org.apache.james.quota.search.Offset; import org.apache.james.quota.search.QuotaBoundary; import org.apache.james.quota.search.QuotaQuery; +import org.apache.james.task.TaskManager; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; import org.apache.james.webadmin.Routes; @@ -48,6 +55,9 @@ import org.apache.james.webadmin.dto.QuotaDTO; import org.apache.james.webadmin.dto.QuotaDetailsDTO; import org.apache.james.webadmin.dto.ValidatedQuotaDTO; import org.apache.james.webadmin.service.UserQuotaService; +import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; +import org.apache.james.webadmin.tasks.TaskIdDto; +import org.apache.james.webadmin.tasks.TaskRegistrationKey; import org.apache.james.webadmin.utils.ErrorResponder; import org.apache.james.webadmin.utils.ErrorResponder.ErrorType; import org.apache.james.webadmin.utils.JsonExtractException; @@ -67,6 +77,7 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import spark.Request; +import spark.Route; import spark.Service; @Api(tags = "UserQuota") @@ -74,6 +85,16 @@ import spark.Service; @Produces("application/json") public class UserQuotaRoutes implements Routes { + public static final String USER_QUOTAS_OPERATIONS_INJECTION_KEY = "userQuotasOperations"; + + public static class RecomputeCurrentQuotasRequestToTask extends TaskFromRequestRegistry.TaskRegistration { + @Inject + public RecomputeCurrentQuotasRequestToTask(RecomputeCurrentQuotasService service) { + super(RECOMPUTE_CURRENT_QUOTAS, request -> new RecomputeCurrentQuotasTask(service)); + } + } + + private static final TaskRegistrationKey RECOMPUTE_CURRENT_QUOTAS = TaskRegistrationKey.of("RecomputeCurrentQuotas"); private static final String USER = "user"; private static final String MIN_OCCUPATION_RATIO = "minOccupationRatio"; private static final String MAX_OCCUPATION_RATIO = "maxOccupationRatio"; @@ -88,15 +109,24 @@ public class UserQuotaRoutes implements Routes { private final JsonTransformer jsonTransformer; private final JsonExtractor<QuotaDTO> jsonExtractor; private final QuotaDTOValidator quotaDTOValidator; + private final TaskManager taskManager; + private final Set<TaskFromRequestRegistry.TaskRegistration> usersQuotasTaskRegistration; private Service service; @Inject - public UserQuotaRoutes(UsersRepository usersRepository, UserQuotaService userQuotaService, JsonTransformer jsonTransformer, Set<JsonTransformerModule> modules) { + public UserQuotaRoutes(UsersRepository usersRepository, + UserQuotaService userQuotaService, + JsonTransformer jsonTransformer, + Set<JsonTransformerModule> modules, + TaskManager taskManager, + @Named(USER_QUOTAS_OPERATIONS_INJECTION_KEY) Set<TaskFromRequestRegistry.TaskRegistration> usersQuotasTaskRegistration) { this.usersRepository = usersRepository; this.userQuotaService = userQuotaService; this.jsonTransformer = jsonTransformer; this.jsonExtractor = new JsonExtractor<>(QuotaDTO.class, modules.stream().map(JsonTransformerModule::asJacksonModule).collect(Collectors.toList())); this.quotaDTOValidator = new QuotaDTOValidator(); + this.taskManager = taskManager; + this.usersQuotasTaskRegistration = usersQuotasTaskRegistration; } @Override @@ -120,6 +150,33 @@ public class UserQuotaRoutes implements Routes { defineUpdateQuota(); defineGetUsersQuota(); + definePostUsersQuota(); + definePostUsersQuota() + .ifPresent(route -> service.post(USERS_QUOTA_ENDPOINT, route, jsonTransformer)); + } + + @POST + @ApiOperation(value = "Recomputing current quotas of users") + @ApiImplicitParams({ + @ApiImplicitParam( + required = true, + name = "task", + paramType = "query parameter", + dataType = "String", + defaultValue = "none", + example = "?task=RecomputeCurrentQuotas", + value = "Compulsory. Only supported value is `RecomputeCurrentQuotas`") + }) + @ApiResponses(value = { + @ApiResponse(code = HttpStatus.CREATED_201, message = "Task is created", response = TaskIdDto.class), + @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side."), + @ApiResponse(code = HttpStatus.BAD_REQUEST_400, message = "Bad request - details in the returned error message") + }) + public Optional<Route> definePostUsersQuota() { + return TaskFromRequestRegistry.builder() + .parameterName(TASK_PARAMETER) + .registrations(usersQuotasTaskRegistration) + .buildAsRouteOptional(taskManager); } @PUT diff --git a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java index c3e622a..898d5d6 100644 --- a/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java +++ b/server/protocols/webadmin/webadmin-mailbox/src/test/java/org/apache/james/webadmin/routes/WebAdminQuotaSearchTestSystem.java @@ -20,6 +20,9 @@ package org.apache.james.webadmin.routes; import org.apache.james.quota.search.QuotaSearchTestSystem; +import org.apache.james.task.Hostname; +import org.apache.james.task.MemoryTaskManager; +import org.apache.james.task.TaskManager; import org.apache.james.webadmin.WebAdminServer; import org.apache.james.webadmin.WebAdminUtils; import org.apache.james.webadmin.jackson.QuotaModule; @@ -47,9 +50,13 @@ public class WebAdminQuotaSearchTestSystem { QuotaModule quotaModule = new QuotaModule(); JsonTransformer jsonTransformer = new JsonTransformer(quotaModule); + TaskManager taskManager = new MemoryTaskManager(new Hostname("foo")); UserQuotaRoutes userQuotaRoutes = new UserQuotaRoutes(quotaSearchTestSystem.getUsersRepository(), - userQuotaService, jsonTransformer, - ImmutableSet.of(quotaModule)); + userQuotaService, + jsonTransformer, + ImmutableSet.of(quotaModule), + taskManager, + ImmutableSet.of()); DomainQuotaRoutes domainQuotaRoutes = new DomainQuotaRoutes( quotaSearchTestSystem.getDomainList(), new DomainQuotaService(quotaSearchTestSystem.getMaxQuotaManager()), --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org