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 2019/05/16 08:48:25 UTC
[james-project] 10/23: JAMES-2149 Introduce DomainAliasService
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 a0545c7102f6c618074f5c14323850dd4d9691ba
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 15 11:17:09 2019 +0700
JAMES-2149 Introduce DomainAliasService
---
.../james/webadmin/routes/DomainsRoutes.java | 75 ++++++-----------
.../james/webadmin/service/DomainAliasService.java | 98 ++++++++++++++++++++++
.../james/webadmin/routes/DomainsRoutesTest.java | 9 +-
3 files changed, 129 insertions(+), 53 deletions(-)
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
index cd047f9..de7300d 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/DomainsRoutes.java
@@ -34,24 +34,19 @@ import javax.ws.rs.Produces;
import org.apache.james.core.Domain;
import org.apache.james.domainlist.api.DomainList;
import org.apache.james.domainlist.api.DomainListException;
-import org.apache.james.rrt.api.RecipientRewriteTable;
import org.apache.james.rrt.api.RecipientRewriteTableException;
-import org.apache.james.rrt.lib.Mapping;
-import org.apache.james.rrt.lib.MappingSource;
-import org.apache.james.webadmin.Constants;
import org.apache.james.webadmin.Routes;
import org.apache.james.webadmin.dto.DomainAliasResponse;
+import org.apache.james.webadmin.service.DomainAliasService;
import org.apache.james.webadmin.utils.ErrorResponder;
import org.apache.james.webadmin.utils.ErrorResponder.ErrorType;
import org.apache.james.webadmin.utils.JsonTransformer;
+import org.apache.james.webadmin.utils.Responses;
import org.eclipse.jetty.http.HttpStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.github.fge.lambdas.Throwing;
-import com.github.steveash.guavate.Guavate;
import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import io.swagger.annotations.Api;
@@ -69,10 +64,6 @@ import spark.Service;
@Path(DomainsRoutes.DOMAINS)
@Produces("application/json")
public class DomainsRoutes implements Routes {
- @FunctionalInterface
- interface MappingOperation {
- void perform(MappingSource mappingSource, Mapping mapping) throws RecipientRewriteTableException;
- }
public static final String DOMAINS = "/domains";
private static final Logger LOGGER = LoggerFactory.getLogger(DomainsRoutes.class);
@@ -86,14 +77,14 @@ public class DomainsRoutes implements Routes {
private static final int MAXIMUM_DOMAIN_SIZE = 256;
private final DomainList domainList;
- private final RecipientRewriteTable recipientRewriteTable;
+ private final DomainAliasService domainAliasService;
private final JsonTransformer jsonTransformer;
private Service service;
@Inject
- public DomainsRoutes(DomainList domainList, RecipientRewriteTable recipientRewriteTable, JsonTransformer jsonTransformer) {
+ DomainsRoutes(DomainList domainList, DomainAliasService domainAliasService, JsonTransformer jsonTransformer) {
this.domainList = domainList;
- this.recipientRewriteTable = recipientRewriteTable;
+ this.domainAliasService = domainAliasService;
this.jsonTransformer = jsonTransformer;
}
@@ -234,26 +225,18 @@ public class DomainsRoutes implements Routes {
Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
domainList.removeDomain(domain);
- removeCorrespondingDomainAliases(domain);
+ domainAliasService.removeCorrespondingDomainAliases(domain);
} catch (DomainListException e) {
LOGGER.info("{} did not exists", request.params(DOMAIN_NAME));
}
- response.status(HttpStatus.NO_CONTENT_204);
- return Constants.EMPTY_BODY;
- }
-
- private void removeCorrespondingDomainAliases(Domain domain) throws RecipientRewriteTableException {
- MappingSource mappingSource = MappingSource.fromDomain(domain);
- recipientRewriteTable.getStoredMappings(mappingSource)
- .asStream()
- .forEach(Throwing.<Mapping>consumer(mapping -> recipientRewriteTable.removeMapping(mappingSource, mapping)).sneakyThrow());
+ return Responses.returnNoContent(response);
}
private String addDomain(Request request, Response response) {
Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
try {
addDomain(domain);
- response.status(204);
+ return Responses.returnNoContent(response);
} catch (DomainListException e) {
LOGGER.info("{} already exists", domain);
throw ErrorResponder.builder()
@@ -271,7 +254,6 @@ public class DomainsRoutes implements Routes {
.cause(e)
.haltError();
}
- return Constants.EMPTY_BODY;
}
private Domain checkValidDomain(String domainName) {
@@ -292,53 +274,48 @@ public class DomainsRoutes implements Routes {
domainList.addDomain(domain);
}
- private Response exists(Request request, Response response) throws DomainListException {
+ private String exists(Request request, Response response) throws DomainListException {
Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
if (!domainList.containsDomain(domain)) {
throw domainNotFound(domain);
} else {
- response.status(HttpStatus.NO_CONTENT_204);
- return response;
+ return Responses.returnNoContent(response);
}
}
private ImmutableSet<DomainAliasResponse> listDomainAliases(Request request, Response response) throws DomainListException, RecipientRewriteTableException {
Domain domain = checkValidDomain(request.params(DOMAIN_NAME));
- if (!hasAliases(domain)) {
+ if (!domainAliasService.hasAliases(domain)) {
throw domainHasNoAliases(domain);
} else {
- return recipientRewriteTable.listSources(Mapping.domain(domain))
- .map(DomainAliasResponse::new)
- .collect(Guavate.toImmutableSet());
+ return domainAliasService.listDomainAliases(domain);
}
}
private String addDomainAlias(Request request, Response response) throws DomainListException, RecipientRewriteTableException {
- return performOperationOnAlias(request, response, recipientRewriteTable::addMapping);
- }
+ Domain sourceDomain = checkValidDomain(request.params(SOURCE_DOMAIN));
+ Domain destinationDomain = checkValidDomain(request.params(DESTINATION_DOMAIN));
- private String removeDomainAlias(Request request, Response response) throws DomainListException, RecipientRewriteTableException {
- return performOperationOnAlias(request, response, recipientRewriteTable::removeMapping);
+ try {
+ domainAliasService.addDomainAlias(sourceDomain, destinationDomain);
+ return Responses.returnNoContent(response);
+ } catch (DomainAliasService.DomainNotFound e) {
+ throw domainNotFound(e.getDomain());
+ }
}
- private String performOperationOnAlias(Request request, Response response, MappingOperation operation) throws DomainListException, RecipientRewriteTableException {
+ private String removeDomainAlias(Request request, Response response) throws DomainListException, RecipientRewriteTableException {
Domain sourceDomain = checkValidDomain(request.params(SOURCE_DOMAIN));
Domain destinationDomain = checkValidDomain(request.params(DESTINATION_DOMAIN));
- if (!domainList.containsDomain(sourceDomain)) {
- throw domainNotFound(sourceDomain);
+ try {
+ domainAliasService.removeDomainAlias(sourceDomain, destinationDomain);
+ return Responses.returnNoContent(response);
+ } catch (DomainAliasService.DomainNotFound e) {
+ throw domainNotFound(e.getDomain());
}
-
- operation.perform(MappingSource.fromDomain(sourceDomain), Mapping.domain(destinationDomain));
- response.status(HttpStatus.NO_CONTENT_204);
- return Constants.EMPTY_BODY;
- }
-
- private boolean hasAliases(Domain domain) throws DomainListException, RecipientRewriteTableException {
- return domainList.containsDomain(domain)
- || recipientRewriteTable.listSources(Mapping.domain(domain)).findFirst().isPresent();
}
private HaltException domainNotFound(Domain domain) {
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java
new file mode 100644
index 0000000..afbc093
--- /dev/null
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/service/DomainAliasService.java
@@ -0,0 +1,98 @@
+/****************************************************************
+ * 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.service;
+
+import javax.inject.Inject;
+
+import org.apache.james.core.Domain;
+import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.domainlist.api.DomainListException;
+import org.apache.james.rrt.api.RecipientRewriteTable;
+import org.apache.james.rrt.api.RecipientRewriteTableException;
+import org.apache.james.rrt.lib.Mapping;
+import org.apache.james.rrt.lib.MappingSource;
+import org.apache.james.webadmin.dto.DomainAliasResponse;
+
+import com.github.fge.lambdas.Throwing;
+import com.github.steveash.guavate.Guavate;
+import com.google.common.collect.ImmutableSet;
+
+public class DomainAliasService {
+ public static class DomainNotFound extends RuntimeException {
+ private final Domain domain;
+
+ DomainNotFound(Domain domain) {
+ this.domain = domain;
+ }
+
+ public Domain getDomain() {
+ return domain;
+ }
+ }
+
+ @FunctionalInterface
+ interface MappingOperation {
+ void perform(MappingSource mappingSource, Mapping mapping) throws RecipientRewriteTableException;
+ }
+
+ private final RecipientRewriteTable recipientRewriteTable;
+ private final DomainList domainList;
+
+ @Inject
+ public DomainAliasService(RecipientRewriteTable recipientRewriteTable, DomainList domainList) {
+ this.recipientRewriteTable = recipientRewriteTable;
+ this.domainList = domainList;
+ }
+
+ public void removeCorrespondingDomainAliases(Domain domain) throws RecipientRewriteTableException {
+ MappingSource mappingSource = MappingSource.fromDomain(domain);
+ recipientRewriteTable.getStoredMappings(mappingSource)
+ .asStream()
+ .forEach(Throwing.<Mapping>consumer(mapping -> recipientRewriteTable.removeMapping(mappingSource, mapping)).sneakyThrow());
+ }
+
+ public ImmutableSet<DomainAliasResponse> listDomainAliases(Domain domain) throws RecipientRewriteTableException {
+ return recipientRewriteTable.listSources(Mapping.domain(domain))
+ .map(DomainAliasResponse::new)
+ .collect(Guavate.toImmutableSet());
+ }
+
+ public boolean hasAliases(Domain domain) throws DomainListException, RecipientRewriteTableException {
+ return domainList.containsDomain(domain)
+ || recipientRewriteTable.listSources(Mapping.domain(domain)).findFirst().isPresent();
+ }
+
+ public void addDomainAlias(Domain sourceDomain, Domain destinationDomain) throws DomainListException, RecipientRewriteTableException {
+ performOperationOnAlias(recipientRewriteTable::addMapping, sourceDomain, destinationDomain);
+ }
+
+ public void removeDomainAlias(Domain sourceDomain, Domain destinationDomain) throws DomainListException, RecipientRewriteTableException {
+ performOperationOnAlias(recipientRewriteTable::removeMapping, sourceDomain, destinationDomain);
+ }
+
+ private void performOperationOnAlias(MappingOperation operation, Domain sourceDomain, Domain destinationDomain) throws DomainListException, RecipientRewriteTableException {
+ if (!domainList.containsDomain(sourceDomain)) {
+ throw new DomainNotFound(sourceDomain);
+ }
+
+ operation.perform(MappingSource.fromDomain(sourceDomain), Mapping.domain(destinationDomain));
+ }
+
+}
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
index dea3fc9..01dbe7e 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/DomainsRoutesTest.java
@@ -46,6 +46,7 @@ import org.apache.james.metrics.logger.DefaultMetricFactory;
import org.apache.james.rrt.memory.MemoryRecipientRewriteTable;
import org.apache.james.webadmin.WebAdminServer;
import org.apache.james.webadmin.WebAdminUtils;
+import org.apache.james.webadmin.service.DomainAliasService;
import org.apache.james.webadmin.utils.JsonTransformer;
import org.eclipse.jetty.http.HttpStatus;
import org.junit.jupiter.api.AfterEach;
@@ -57,19 +58,19 @@ import io.restassured.RestAssured;
import io.restassured.http.ContentType;
-public class DomainsRoutesTest {
+class DomainsRoutesTest {
private static final String DOMAIN = "domain";
private static final String ALIAS_DOMAIN = "alias.domain";
private static final String ALIAS_DOMAIN_2 = "alias.domain.bis";
- public static final String EXTERNAL_DOMAIN = "external.domain.tld";
- public static final String DOMAIN_2 = "domain2";
+ private static final String EXTERNAL_DOMAIN = "external.domain.tld";
private WebAdminServer webAdminServer;
private void createServer(DomainList domainList) throws Exception {
+ DomainAliasService domainAliasService = new DomainAliasService(new MemoryRecipientRewriteTable(), domainList);
webAdminServer = WebAdminUtils.createWebAdminServer(
new DefaultMetricFactory(),
- new DomainsRoutes(domainList, new MemoryRecipientRewriteTable(), new JsonTransformer()));
+ new DomainsRoutes(domainList, domainAliasService, new JsonTransformer()));
webAdminServer.configure(NO_CONFIGURATION);
webAdminServer.await();
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org