JAMES-2251 Avoid creating mutableDomains in AbstractDomainList.getDomains()
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/9c871fef Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/9c871fef Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/9c871fef Branch: refs/heads/master Commit: 9c871fef63c0c7cff6dbd460e4e77103a67a97b5 Parents: f4b6276 Author: Daniel Trebbien <dtrebb...@gmail.com> Authored: Thu Nov 9 08:20:39 2017 -0600 Committer: Antoine Duprat <adup...@linagora.com> Committed: Tue Dec 12 09:47:37 2017 +0100 ---------------------------------------------------------------------- .../domainlist/lib/AbstractDomainList.java | 35 ++++++++++---------- 1 file changed, 18 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/9c871fef/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java ---------------------------------------------------------------------- diff --git a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java index 4582006..460933f 100644 --- a/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java +++ b/server/data/data-library/src/main/java/org/apache/james/domainlist/lib/AbstractDomainList.java @@ -21,7 +21,6 @@ package org.apache.james.domainlist.lib; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -40,6 +39,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Strings; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; /** * All implementations of the DomainList interface should extends this abstract @@ -151,32 +151,33 @@ public abstract class AbstractDomainList implements DomainList, Configurable { } @Override - public List<String> getDomains() throws DomainListException { + public ImmutableList<String> getDomains() throws DomainListException { List<String> domains = getDomainListInternal(); - - // create mutable copy, some subclasses return ImmutableList - ArrayList<String> mutableDomains = new ArrayList<>(domains); - List<String> detectedDomains = detectDomains(); - mutableDomains.addAll(detectedDomains); - mutableDomains.addAll(detectIps(mutableDomains)); + ImmutableList<String> detectedDomains = detectDomains(); + // Guava does not support concatenating ImmutableLists at this time: + // https://stackoverflow.com/questions/37919648/concatenating-immutablelists + // A work-around is to use Iterables.concat() until something like + // https://github.com/google/guava/issues/1029 is implemented. + ImmutableList<String> detectedIps = detectIps(Iterables.concat(domains, detectedDomains)); + Iterable<String> allDomains = Iterables.concat(domains, detectedDomains, detectedIps); if (LOGGER.isDebugEnabled()) { - for (String domain : mutableDomains) { + for (String domain : allDomains) { LOGGER.debug("Handling mail for: " + domain); } } - return ImmutableList.copyOf(mutableDomains); + return ImmutableList.copyOf(allDomains); } - private List<String> detectIps(ArrayList<String> mutableDomains) { + private ImmutableList<String> detectIps(Iterable<String> domains) { if (autoDetectIP) { - return getDomainsIP(mutableDomains, dns, LOGGER); + return getDomainsIP(domains, dns, LOGGER); } return ImmutableList.of(); } - private List<String> detectDomains() { + private ImmutableList<String> detectDomains() { if (autoDetect) { String hostName; try { @@ -197,11 +198,11 @@ public abstract class AbstractDomainList implements DomainList, Configurable { * Return a List which holds all ipAddress of the domains in the given List * * @param domains - * List of domains + * Iterable of domains * @return domainIP List of ipaddress for domains */ - private static List<String> getDomainsIP(List<String> domains, DNSService dns, Logger log) { - return domains.stream() + private static ImmutableList<String> getDomainsIP(Iterable<String> domains, DNSService dns, Logger log) { + return Guavate.stream(domains) .flatMap(domain -> getDomainIP(domain, dns, log).stream()) .distinct() .collect(Guavate.toImmutableList()); @@ -210,7 +211,7 @@ public abstract class AbstractDomainList implements DomainList, Configurable { /** * @see #getDomainsIP(List, DNSService, Logger) */ - private static List<String> getDomainIP(String domain, DNSService dns, Logger log) { + private static ImmutableList<String> getDomainIP(String domain, DNSService dns, Logger log) { try { return dns.getAllByName(domain).stream() .map(InetAddress::getHostAddress) --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org