Configuration: Gracefully handle invalid integer values

If an invalid value is configured, log an error message and
fall back to the default value.

Change-Id: Ic4047b94ece39e2472bc7b954a1ea93cc83ad65c
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 bd1caea..30d035c 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/highavailability/Configuration.java
@@ -14,6 +14,9 @@
 
 package com.ericsson.gerrit.plugins.highavailability;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.common.base.CharMatcher;
 import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
@@ -24,6 +27,8 @@
 
 @Singleton
 public class Configuration {
+  private static final Logger log = LoggerFactory.getLogger(Configuration.class);
+
   private static final int DEFAULT_TIMEOUT_MS = 5000;
   private static final int DEFAULT_MAX_TRIES = 5;
   private static final int DEFAULT_RETRY_INTERVAL = 1000;
@@ -46,14 +51,24 @@
     url = Strings.nullToEmpty(cfg.getString("url"));
     user = Strings.nullToEmpty(cfg.getString("user"));
     password = Strings.nullToEmpty(cfg.getString("password"));
-    connectionTimeout = cfg.getInt("connectionTimeout", DEFAULT_TIMEOUT_MS);
-    socketTimeout = cfg.getInt("socketTimeout", DEFAULT_TIMEOUT_MS);
-    maxTries = cfg.getInt("maxTries", DEFAULT_MAX_TRIES);
-    retryInterval = cfg.getInt("retryInterval", DEFAULT_RETRY_INTERVAL);
+    connectionTimeout = getInt(cfg, "connectionTimeout", DEFAULT_TIMEOUT_MS);
+    socketTimeout = getInt(cfg, "socketTimeout", DEFAULT_TIMEOUT_MS);
+    maxTries = getInt(cfg, "maxTries", DEFAULT_MAX_TRIES);
+    retryInterval = getInt(cfg, "retryInterval", DEFAULT_RETRY_INTERVAL);
     indexThreadPoolSize =
-        cfg.getInt("indexThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+        getInt(cfg, "indexThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
     eventThreadPoolSize =
-        cfg.getInt("eventThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+        getInt(cfg, "eventThreadPoolSize", DEFAULT_THREAD_POOL_SIZE);
+  }
+
+  private int getInt(PluginConfig cfg, String name, int defaultValue) {
+    try {
+      return cfg.getInt(name, defaultValue);
+    } catch (IllegalArgumentException e) {
+      log.error(String.format(
+          "invalid value for %s; using default value %d", name, defaultValue));
+      return defaultValue;
+    }
   }
 
   public int getConnectionTimeout() {
diff --git a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
index 10b4211..22f9792 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/highavailability/ConfigurationTest.java
@@ -15,13 +15,13 @@
 package com.ericsson.gerrit.plugins.highavailability;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.when;
 
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 
-import com.ericsson.gerrit.plugins.highavailability.Configuration;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -93,6 +93,20 @@
     assertThat(configuration.getUrl()).isEqualTo(URL);
   }
 
+  @Test
+  public void testIllegalArgumentExceptionReturnDefaultValue() throws Exception {
+    when(configMock.getInt(anyString(), anyInt()))
+        .thenThrow(new IllegalArgumentException("some message"));
+
+    configuration = new Configuration(cfgFactoryMock, pluginName);
+    assertThat(configuration.getConnectionTimeout()).isEqualTo(5000);
+    assertThat(configuration.getSocketTimeout()).isEqualTo(5000);
+    assertThat(configuration.getMaxTries()).isEqualTo(5);
+    assertThat(configuration.getRetryInterval()).isEqualTo(1000);
+    assertThat(configuration.getIndexThreadPoolSize()).isEqualTo(1);
+    assertThat(configuration.getEventThreadPoolSize()).isEqualTo(1);
+  }
+
   private void buildMocks(boolean values) {
     when(configMock.getString("url")).thenReturn(values ? URL : null);
     when(configMock.getString("user")).thenReturn(values ? USER : null);