Merge branch 'stable-2.14' into stable-2.15

* stable-2.14:
  Setup: Replace 'multiply' with 'repeat' in init step
  Setup: Add jgroups skipInterface configuration step
  Setup: Add jgroups protocolStack configuration step
  Configuration: Remove unnecessary usage of 'this'
  Setup: Remove duplication of default auto reindex value
  Setup: Add healthCheck configuration init step
  Setup: Add synchronize event configuration init step
  Setup: Add synchronize configuration step to forwarding sections
  Setup: Call proper method for null subsection cases
  Setup: Remove unused subsection method parameter
  Setup: Add cache pattern configuration init step

Change-Id: Ibac3c328748f374e7d8435728ee3e31df663ee4a
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
index 0ad64e5..e813bb6 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
@@ -182,10 +182,12 @@
   }
 
   public static class AutoReindex {
+
     static final String AUTO_REINDEX_SECTION = "autoReindex";
     static final String ENABLED = "enabled";
     static final String DELAY = "delay";
     static final String POLL_INTERVAL = "pollInterval";
+    static final boolean DEFAULT_AUTO_REINDEX = false;
     static final long DEFAULT_DELAY = 10L;
     static final long DEFAULT_POLL_INTERVAL = 0L;
 
@@ -194,11 +196,11 @@
     private final long pollSec;
 
     public AutoReindex(Config cfg) {
-      this.enabled = cfg.getBoolean(AUTO_REINDEX_SECTION, ENABLED, false);
-      this.delaySec =
+      enabled = cfg.getBoolean(AUTO_REINDEX_SECTION, ENABLED, DEFAULT_AUTO_REINDEX);
+      delaySec =
           ConfigUtil.getTimeUnit(
               cfg, AUTO_REINDEX_SECTION, null, DELAY, DEFAULT_DELAY, TimeUnit.SECONDS);
-      this.pollSec =
+      pollSec =
           ConfigUtil.getTimeUnit(
               cfg,
               AUTO_REINDEX_SECTION,
@@ -458,7 +460,7 @@
 
     private Websession(Config cfg) {
       super(cfg, WEBSESSION_SECTION);
-      this.cleanupInterval =
+      cleanupInterval =
           ConfigUtil.getTimeUnit(
               Strings.nullToEmpty(cfg.getString(WEBSESSION_SECTION, null, CLEANUP_INTERVAL_KEY)),
               DEFAULT_CLEANUP_INTERVAL_MS,
diff --git a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Setup.java b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Setup.java
index 217e644..e58f62f 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Setup.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Setup.java
@@ -15,13 +15,21 @@
 package com.ericsson.gerrit.plugins.highavailability;
 
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.AUTO_REINDEX_SECTION;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.DEFAULT_AUTO_REINDEX;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.DEFAULT_DELAY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.DEFAULT_POLL_INTERVAL;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.DELAY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.ENABLED;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.AutoReindex.POLL_INTERVAL;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Cache.CACHE_SECTION;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.Cache.PATTERN_KEY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.DEFAULT_THREAD_POOL_SIZE;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.Event.EVENT_SECTION;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.Forwarding.DEFAULT_SYNCHRONIZE;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.Forwarding.SYNCHRONIZE_KEY;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.HealthCheck.DEFAULT_HEALTH_CHECK_ENABLED;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.HealthCheck.ENABLE_KEY;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.HealthCheck.HEALTH_CHECK_SECTION;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Http.CONNECTION_TIMEOUT_KEY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Http.DEFAULT_MAX_TRIES;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Http.DEFAULT_RETRY_INTERVAL;
@@ -35,6 +43,8 @@
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Index.INDEX_SECTION;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.JGroups.CLUSTER_NAME_KEY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.JGroups.DEFAULT_CLUSTER_NAME;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.JGroups.PROTOCOL_STACK_KEY;
+import static com.ericsson.gerrit.plugins.highavailability.Configuration.JGroups.SKIP_INTERFACE_KEY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Main.DEFAULT_SHARED_DIRECTORY;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Main.MAIN_SECTION;
 import static com.ericsson.gerrit.plugins.highavailability.Configuration.Main.SHARED_DIRECTORY_KEY;
@@ -103,8 +113,10 @@
       configureAutoReindexSection();
       configureHttpSection();
       configureCacheSection();
+      configureEventSection();
       configureIndexSection();
       configureWebsessionsSection();
+      configureHealthCheckSection();
       if (!createHAReplicaSite(config)) {
         configureMainSection();
         configurePeerInfoSection();
@@ -117,19 +129,17 @@
   private void configureAutoReindexSection() {
     ui.header("AutoReindex section");
     Boolean autoReindex =
-        promptAndSetBoolean("Auto reindex", AUTO_REINDEX_SECTION, null, ENABLED, false);
+        promptAndSetBoolean("Auto reindex", AUTO_REINDEX_SECTION, ENABLED, DEFAULT_AUTO_REINDEX);
     config.setBoolean(AUTO_REINDEX_SECTION, null, ENABLED, autoReindex);
 
     String delay =
-        promptAndSetString(
-            "Delay", AUTO_REINDEX_SECTION, null, DELAY, numberToString(DEFAULT_DELAY));
+        promptAndSetString("Delay", AUTO_REINDEX_SECTION, DELAY, numberToString(DEFAULT_DELAY));
     config.setLong(AUTO_REINDEX_SECTION, null, DELAY, Long.valueOf(delay));
 
     String pollInterval =
         promptAndSetString(
             "Poll interval",
             AUTO_REINDEX_SECTION,
-            null,
             POLL_INTERVAL,
             numberToString(DEFAULT_POLL_INTERVAL));
     config.setLong(AUTO_REINDEX_SECTION, null, POLL_INTERVAL, Long.valueOf(pollInterval));
@@ -162,6 +172,18 @@
           JGROUPS_SUBSECTION,
           CLUSTER_NAME_KEY,
           DEFAULT_CLUSTER_NAME);
+      promptAndSetString(
+          "Protocol stack (optional)",
+          PEER_INFO_SECTION,
+          JGROUPS_SUBSECTION,
+          PROTOCOL_STACK_KEY,
+          null);
+      promptAndSetString(
+          titleForOptionalWithNote("Skip interface", "interfaces"),
+          PEER_INFO_SECTION,
+          JGROUPS_SUBSECTION,
+          SKIP_INTERFACE_KEY,
+          null);
     }
   }
 
@@ -193,15 +215,24 @@
 
   private void configureCacheSection() {
     ui.header("Cache section");
+    promptAndSetSynchronize("Cache", CACHE_SECTION);
     promptAndSetString(
         "Cache thread pool size",
         CACHE_SECTION,
         THREAD_POOL_SIZE_KEY,
         numberToString(DEFAULT_THREAD_POOL_SIZE));
+    promptAndSetString(
+        titleForOptionalWithNote("Cache pattern", "patterns"), CACHE_SECTION, PATTERN_KEY, null);
+  }
+
+  private void configureEventSection() {
+    ui.header("Event section");
+    promptAndSetSynchronize("Event", EVENT_SECTION);
   }
 
   private void configureIndexSection() {
     ui.header("Index section");
+    promptAndSetSynchronize("Index", INDEX_SECTION);
     promptAndSetString(
         "Index thread pool size",
         INDEX_SECTION,
@@ -211,16 +242,31 @@
 
   private void configureWebsessionsSection() {
     ui.header("Websession section");
+    promptAndSetSynchronize("Websession", WEBSESSION_SECTION);
     promptAndSetString(
         "Cleanup interval", WEBSESSION_SECTION, CLEANUP_INTERVAL_KEY, DEFAULT_CLEANUP_INTERVAL);
   }
 
+  private void configureHealthCheckSection() {
+    ui.header("HealthCheck section");
+    Boolean healthCheck =
+        promptAndSetBoolean(
+            "Health check", HEALTH_CHECK_SECTION, ENABLE_KEY, DEFAULT_HEALTH_CHECK_ENABLED);
+    config.setBoolean(HEALTH_CHECK_SECTION, null, ENABLE_KEY, healthCheck);
+  }
+
+  private void promptAndSetSynchronize(String sectionTitle, String section) {
+    String titleSuffix = ": synchronize?";
+    String title = sectionTitle + titleSuffix;
+    promptAndSetBoolean(title, section, SYNCHRONIZE_KEY, DEFAULT_SYNCHRONIZE);
+  }
+
   private Boolean promptAndSetBoolean(
-      String title, String section, String subsection, String name, Boolean defaultValue) {
-    Boolean oldValue = config.getBoolean(section, subsection, name, defaultValue);
+      String title, String section, String name, Boolean defaultValue) {
+    Boolean oldValue = config.getBoolean(section, null, name, defaultValue);
     Boolean newValue = Boolean.parseBoolean(ui.readString(String.valueOf(oldValue), title));
     if (!Objects.equals(oldValue, newValue)) {
-      config.setBoolean(section, subsection, name, newValue);
+      config.setBoolean(section, null, name, newValue);
     }
     return newValue;
   }
@@ -244,6 +290,10 @@
     return newValue;
   }
 
+  private static String titleForOptionalWithNote(String prefix, String suffix) {
+    return prefix + " (optional); manually repeat this line to configure more " + suffix;
+  }
+
   private static String numberToString(int number) {
     return Integer.toString(number);
   }