From 9c871fef63c0c7cff6dbd460e4e77103a67a97b5 Mon Sep 17 00:00:00 2001 From: Daniel Trebbien Date: Thu, 9 Nov 2017 08:20:39 -0600 Subject: [PATCH] JAMES-2251 Avoid creating mutableDomains in AbstractDomainList.getDomains() --- .../domainlist/lib/AbstractDomainList.java | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) 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 45820066c31..460933f4916 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 @@ 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.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 boolean containsDomain(String domain) throws DomainListException { } @Override - public List getDomains() throws DomainListException { + public ImmutableList getDomains() throws DomainListException { List domains = getDomainListInternal(); - - // create mutable copy, some subclasses return ImmutableList - ArrayList mutableDomains = new ArrayList<>(domains); - List detectedDomains = detectDomains(); - mutableDomains.addAll(detectedDomains); - mutableDomains.addAll(detectIps(mutableDomains)); + ImmutableList 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 detectedIps = detectIps(Iterables.concat(domains, detectedDomains)); + Iterable 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 detectIps(ArrayList mutableDomains) { + private ImmutableList detectIps(Iterable domains) { if (autoDetectIP) { - return getDomainsIP(mutableDomains, dns, LOGGER); + return getDomainsIP(domains, dns, LOGGER); } return ImmutableList.of(); } - private List detectDomains() { + private ImmutableList detectDomains() { if (autoDetect) { String hostName; try { @@ -197,11 +198,11 @@ private List detectDomains() { * 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 getDomainsIP(List domains, DNSService dns, Logger log) { - return domains.stream() + private static ImmutableList getDomainsIP(Iterable domains, DNSService dns, Logger log) { + return Guavate.stream(domains) .flatMap(domain -> getDomainIP(domain, dns, log).stream()) .distinct() .collect(Guavate.toImmutableList()); @@ -210,7 +211,7 @@ private static List getDomainsIP(List domains, DNSService dns, L /** * @see #getDomainsIP(List, DNSService, Logger) */ - private static List getDomainIP(String domain, DNSService dns, Logger log) { + private static ImmutableList getDomainIP(String domain, DNSService dns, Logger log) { try { return dns.getAllByName(domain).stream() .map(InetAddress::getHostAddress)