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 34c1a44a95d301b2e005e3c219c5f2c7e3bbc315
Author: Benoit Tellier <[email protected]>
AuthorDate: Tue Aug 27 13:49:29 2019 +0700

    JAMES-2513 AbstractDomainList can return duplicates
    
    A domain both added and detected will be returned as duplicated.
---
 .../james/domainlist/lib/AbstractDomainList.java   | 27 ++++++++++++----------
 .../lib/AbstractDomainListPrivateMethodsTest.java  | 24 +++++++++++++++++++
 2 files changed, 39 insertions(+), 12 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 3db1408..8d532e9 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,6 +21,7 @@ package org.apache.james.domainlist.lib;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.util.Collection;
 import java.util.List;
 import java.util.stream.Stream;
 
@@ -39,7 +40,7 @@ import com.github.steveash.guavate.Guavate;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
+import com.google.common.collect.ImmutableSet;
 
 /**
  * All implementations of the DomainList interface should extends this abstract
@@ -155,13 +156,15 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
     public ImmutableList<Domain> getDomains() throws DomainListException {
         List<Domain> domains = getDomainListInternal();
         ImmutableList<Domain> 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.
-        Iterable<Domain> domainsWithoutIp = Iterables.concat(domains, 
detectedDomains);
-        ImmutableList<Domain> detectedIps = detectIps(domainsWithoutIp);
-        ImmutableList<Domain> allDomains = 
ImmutableList.copyOf(Iterables.concat(domainsWithoutIp, detectedIps));
+
+        ImmutableList<Domain> domainsWithoutIp = 
ImmutableList.<Domain>builder()
+            .addAll(domains)
+            .addAll(detectedDomains)
+            .build();
+        ImmutableSet<Domain> allDomains = ImmutableSet.<Domain>builder()
+            .addAll(domainsWithoutIp)
+            .addAll(detectIps(domainsWithoutIp))
+            .build();
 
         if (LOGGER.isDebugEnabled()) {
             for (Domain domain : allDomains) {
@@ -169,10 +172,10 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
             }
         }
 
-        return allDomains;
+        return ImmutableList.copyOf(allDomains);
     }
 
-    private ImmutableList<Domain> detectIps(Iterable<Domain> domains) {
+    private ImmutableList<Domain> detectIps(Collection<Domain> domains) {
         if (autoDetectIP) {
             return getDomainsIpStream(domains, dns, LOGGER)
                 .collect(Guavate.toImmutableList());
@@ -204,8 +207,8 @@ public abstract class AbstractDomainList implements 
DomainList, Configurable {
      *            Iterable of domains
      * @return Stream of ipaddress for domains
      */
-    private static Stream<Domain> getDomainsIpStream(Iterable<Domain> domains, 
DNSService dns, Logger log) {
-        return Guavate.stream(domains)
+    private static Stream<Domain> getDomainsIpStream(Collection<Domain> 
domains, DNSService dns, Logger log) {
+        return domains.stream()
             .flatMap(domain -> getDomainIpStream(domain, dns, log))
             .distinct();
     }
diff --git 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
index 96a59ae..c711436 100644
--- 
a/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
+++ 
b/server/data/data-library/src/test/java/org/apache/james/domainlist/lib/AbstractDomainListPrivateMethodsTest.java
@@ -208,6 +208,30 @@ public class AbstractDomainListPrivateMethodsTest {
     }
 
     @Test
+    public void getDomainsShouldNotReturnDuplicates() throws Exception {
+        domainList.configure(DomainListConfiguration.builder()
+            .autoDetect(true)
+            .autoDetectIp(true));
+
+        String added = "added.tld";
+        String detected = "detected.tld";
+        String ip = "148.25.32.1";
+
+        
when(dnsService.getLocalHost()).thenReturn(InetAddress.getByName("127.0.0.1"));
+        
when(dnsService.getHostName(any(InetAddress.class))).thenReturn(detected);
+        InetAddress address = mock(InetAddress.class);
+        when(address.getHostAddress()).thenReturn(ip);
+        
when(dnsService.getAllByName(any())).thenReturn(ImmutableList.of(address));
+
+        domainList.addDomain(Domain.of(added));
+        domainList.addDomain(Domain.of(ip));
+
+        assertThat(domainList.getDomains())
+            .extracting(Domain::name)
+            .containsOnlyOnce(added, detected, ip);
+    }
+
+    @Test
     public void getDomainsShouldListAddedDomain() throws Exception {
         Domain defaultDomain = Domain.of("default.tld");
         Domain domain = Domain.of("added.tld");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to