Merge branch 'stable-2.15'

* stable-2.15:
  ElasticConfiguration: Log configured Elasticsearch hostnames as info
  ElasticRestClientProvider: Store hosts as List instead of native array
  ElasticConfiguration: Remove unused maxConnectionIdleUnit
  Assume correct relative or absolute URL from Weblink provider

Change-Id: Id4f5ce62828a61017a3e0f0518d63a9519ecbf6c
diff --git a/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
index 4184ec0..20c3427 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.java
@@ -16,6 +16,7 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -29,19 +30,20 @@
 
 @Singleton
 class ElasticConfiguration {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   private static final String DEFAULT_HOST = "localhost";
   private static final String DEFAULT_PORT = "9200";
   private static final String DEFAULT_PROTOCOL = "http";
 
   private final Config cfg;
 
-  final List<HttpHost> urls;
+  final List<HttpHost> hosts;
   final String username;
   final String password;
   final boolean requestCompression;
   final long connectionTimeout;
   final long maxConnectionIdleTime;
-  final TimeUnit maxConnectionIdleUnit = TimeUnit.MILLISECONDS;
   final int maxTotalConnection;
   final int readTimeout;
   final String prefix;
@@ -66,18 +68,20 @@
     if (subsections.isEmpty()) {
       HttpHost httpHost =
           new HttpHost(DEFAULT_HOST, Integer.valueOf(DEFAULT_PORT), DEFAULT_PROTOCOL);
-      this.urls = Collections.singletonList(httpHost);
+      this.hosts = Collections.singletonList(httpHost);
     } else {
-      this.urls = new ArrayList<>(subsections.size());
+      this.hosts = new ArrayList<>(subsections.size());
       for (String subsection : subsections) {
         String port = getString(cfg, subsection, "port", DEFAULT_PORT);
         String host = getString(cfg, subsection, "hostname", DEFAULT_HOST);
         String protocol = getString(cfg, subsection, "protocol", DEFAULT_PROTOCOL);
 
         HttpHost httpHost = new HttpHost(host, Integer.valueOf(port), protocol);
-        this.urls.add(httpHost);
+        this.hosts.add(httpHost);
       }
     }
+
+    logger.atInfo().log("Elasticsearch hosts: %s", hosts);
   }
 
   Config getConfig() {
diff --git a/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
index c2c4548..e318d61 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
@@ -22,6 +22,7 @@
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import java.io.IOException;
+import java.util.List;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpStatus;
 import org.apache.http.StatusLine;
@@ -38,7 +39,7 @@
 class ElasticRestClientProvider implements Provider<RestClient>, LifecycleListener {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
-  private final HttpHost[] hosts;
+  private final List<HttpHost> hosts;
   private final String username;
   private final String password;
 
@@ -47,7 +48,7 @@
 
   @Inject
   ElasticRestClientProvider(ElasticConfiguration cfg) {
-    hosts = cfg.urls.toArray(new HttpHost[cfg.urls.size()]);
+    hosts = cfg.hosts;
     username = cfg.username;
     password = cfg.password;
   }
@@ -131,7 +132,7 @@
   }
 
   private RestClient build() {
-    RestClientBuilder builder = RestClient.builder(hosts);
+    RestClientBuilder builder = RestClient.builder(hosts.toArray(new HttpHost[hosts.size()]));
     setConfiguredCredentialsIfAny(builder);
     return builder.build();
   }