Merge branch 'stable-3.10'

* stable-3.10:
  ElasticContainer: remove unused private constant
  ElasticContainer: suppress unclosed resource warning
  Replace use of deprecated Changes#id(int) method
  Suppress unused parameter warning
  AbstractElasticIndex: remove redundant type arguments
  Replace deprecated JsonParser constructor and parse method
  Update testcontainers to latest release 1.20.2
  Fix version check regexes and allow any 7.x and 8.x versions

Change-Id: I68a8afd371eb6d6df41d5bb5a586d511e477c059
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index ea71773..c32388c 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -8,19 +8,19 @@
     )
 
     # Ensure artifacts compatibility by selecting them from the Bill Of Materials
-    # https://search.maven.org/artifact/org.testcontainers/testcontainers/1.19.7/pom
-    TESTCONTAINERS_VERSION = "1.19.7"
+    # https://search.maven.org/artifact/org.testcontainers/testcontainers/1.20.2/pom
+    TESTCONTAINERS_VERSION = "1.20.2"
 
     maven_jar(
         name = "testcontainers",
         artifact = "org.testcontainers:testcontainers:" + TESTCONTAINERS_VERSION,
-        sha1 = "2dd7b1497fc444755582b0efc88636c4d299601f",
+        sha1 = "3b693fb878f88974ee07bd149fb0b75b0f2b5cf0",
     )
 
     maven_jar(
         name = "testcontainers-elasticsearch",
         artifact = "org.testcontainers:elasticsearch:" + TESTCONTAINERS_VERSION,
-        sha1 = "8cd9f4ae67c9299143eb718541ff544b66273283",
+        sha1 = "e148d6ad75011012363388855f121fe6d6dae092",
     )
 
     maven_jar(
@@ -29,28 +29,28 @@
         sha1 = "92edc22a9ab2f3e17c9bf700aaee377d50e8b530",
     )
 
-    DOCKER_JAVA_VERS = "3.3.6"
+    DOCKER_JAVA_VERS = "3.4.0"
 
     maven_jar(
         name = "docker-java-api",
         artifact = "com.github.docker-java:docker-java-api:" + DOCKER_JAVA_VERS,
-        sha1 = "8e152880bfe595c81a25501e21a6d7b1d4df97be",
+        sha1 = "9ef23dcc93693f15e69b64632be096c38e31bc44",
     )
 
     maven_jar(
         name = "docker-java-transport",
         artifact = "com.github.docker-java:docker-java-transport:" + DOCKER_JAVA_VERS,
-        sha1 = "0d536d16a297f9139b833955390a3d581e336e67",
+        sha1 = "c058705684d782effc4b2edfdef1a87544ba4af8",
     )
 
     maven_jar(
         name = "docker-java-transport-zerodep",
         artifact = "com.github.docker-java:docker-java-transport-zerodep:" + DOCKER_JAVA_VERS,
-        sha1 = "c9cde0239ce03376f6dfd0465bd461853af22196",
+        sha1 = "c4ce6d8695cfdb0027872f99cc20f8f679f8a969",
     )
 
     # Match version used in docker-java-transport
-    # https://search.maven.org/artifact/com.github.docker-java/docker-java-transport/3.3.6/pom
+    # https://search.maven.org/artifact/com.github.docker-java/docker-java-transport/3.4.0/pom
     maven_jar(
         name = "jna",
         artifact = "net.java.dev.jna:jna:5.13.0",
@@ -58,7 +58,7 @@
     )
 
     # Match jackson.version from docker-java
-    # https://search.maven.org/artifact/com.github.docker-java/docker-java-parent/3.3.6/pom
+    # https://search.maven.org/artifact/com.github.docker-java/docker-java-parent/3.4.0/pom
     maven_jar(
         name = "jackson-annotations",
         artifact = "com.fasterxml.jackson.core:jackson-annotations:2.10.3",
diff --git a/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 85ce166..dfa719c 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -312,7 +312,7 @@
           contentType.toString().equalsIgnoreCase(ContentType.APPLICATION_JSON.toString()),
           String.format("Expected %s, but was: %s", ContentType.APPLICATION_JSON, contentType));
       String responseStr = EntityUtils.toString(response.getEntity());
-      JsonObject responseJson = (JsonObject) new JsonParser().parse(responseStr);
+      JsonObject responseJson = JsonParser.parseString(responseStr).getAsJsonObject();
       boolean hasErrors = responseJson.get("errors").getAsBoolean();
       if (hasErrors) {
         logger.atSevere().log("Response with errors: %s", responseJson);
@@ -341,7 +341,7 @@
   }
 
   protected String getSearch(SearchSourceBuilder searchSource, JsonArray sortArray) {
-    JsonObject search = new JsonParser().parse(searchSource.toString()).getAsJsonObject();
+    JsonObject search = JsonParser.parseString(searchSource.toString()).getAsJsonObject();
     search.add("sort", sortArray);
     return gson.toJson(search);
   }
@@ -455,7 +455,7 @@
         if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
           String content = getContent(response);
           JsonObject obj =
-              new JsonParser().parse(content).getAsJsonObject().getAsJsonObject("hits");
+              JsonParser.parseString(content).getAsJsonObject().getAsJsonObject("hits");
           if (obj.get("hits") != null) {
             JsonArray json = obj.getAsJsonArray("hits");
             ImmutableList.Builder<T> results = ImmutableList.builderWithExpectedSize(json.size());
@@ -471,7 +471,7 @@
               searchAfter = hit.getAsJsonArray("sort");
             }
             JsonArray finalSearchAfter = searchAfter;
-            return new ListResultSet<T>(results.build()) {
+            return new ListResultSet<>(results.build()) {
               @Override
               public Object searchAfter() {
                 return finalSearchAfter;
diff --git a/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java b/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
index 4217f45..9e670ee 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/ElasticIndexVersionDiscovery.java
@@ -53,9 +53,9 @@
       throw new IOException(message);
     }
 
-    return new JsonParser()
-        .parse(AbstractElasticIndex.getContent(response)).getAsJsonObject().entrySet().stream()
-            .map(e -> e.getKey().replace(name, ""))
-            .collect(toList());
+    return JsonParser.parseString(AbstractElasticIndex.getContent(response)).getAsJsonObject()
+        .entrySet().stream()
+        .map(e -> e.getKey().replace(name, ""))
+        .collect(toList());
   }
 }
diff --git a/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java b/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
index 9caa14d..180d135 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
@@ -116,8 +116,7 @@
         throw new FailedToGetVersion(statusLine);
       }
       String version =
-          new JsonParser()
-              .parse(AbstractElasticIndex.getContent(response))
+          JsonParser.parseString(AbstractElasticIndex.getContent(response))
               .getAsJsonObject()
               .get("version")
               .getAsJsonObject()
@@ -163,5 +162,6 @@
     }
   }
 
-  protected void configureHttpClientBuilder(HttpAsyncClientBuilder httpClientBuilder) {}
+  protected void configureHttpClientBuilder(
+      @SuppressWarnings("unused") HttpAsyncClientBuilder httpClientBuilder) {}
 }
diff --git a/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java
index 43cee5a..1427e05 100644
--- a/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java
+++ b/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java
@@ -18,8 +18,8 @@
 import java.util.regex.Pattern;
 
 public enum ElasticVersion {
-  V7_17("7.17.*"),
-  V8_15("8.15.*");
+  V7("7\\.\\d+\\.\\d+.*"),
+  V8("8\\.\\d+\\.\\d+.*");
 
   private final String version;
   private final Pattern pattern;
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticAbstractQueryChangesTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticAbstractQueryChangesTest.java
index 8a0af62..3182325 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticAbstractQueryChangesTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticAbstractQueryChangesTest.java
@@ -90,11 +90,13 @@
     Project.NameKey project = Project.nameKey("repo");
     TestRepository<Repository> repo = createAndOpenProject(project);
     Change c = insert(project, newChangeWithStatus(repo, Change.Status.NEW));
-    gApi.changes().id(c.getChangeId()).index();
+    gApi.changes().id(c.getProject().get(), c.getChangeId()).index();
 
     ElasticTestUtils.closeIndex(client, container, testName);
     StorageException thrown =
-        assertThrows(StorageException.class, () -> gApi.changes().id(c.getChangeId()).index());
+        assertThrows(
+            StorageException.class,
+            () -> gApi.changes().id(c.getProject().get(), c.getChangeId()).index());
     assertThat(thrown).hasMessageThat().contains("Failed to reindex change");
   }
 
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
index 68dca7f..36f91cc 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
@@ -27,9 +27,9 @@
 /* Helper class for running ES integration tests in docker container */
 public class ElasticContainer extends ElasticsearchContainer {
   private static FluentLogger logger = FluentLogger.forEnclosingClass();
-  private static final int ELASTICSEARCH_DEFAULT_PORT = 9200;
 
   public static ElasticContainer createAndStart(ElasticVersion version) {
+    @SuppressWarnings("resource")
     ElasticContainer container = new ElasticContainer(version);
     try {
       Path certs = Path.of("/usr/share/elasticsearch/config/certs");
@@ -89,9 +89,9 @@
   private static DockerImageName getImageName(ElasticVersion version) {
     DockerImageName image = DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch");
     switch (version) {
-      case V7_17:
+      case V7:
         return image.withTag("7.17.24");
-      case V8_15:
+      case V8:
         return image.withTag("8.15.2");
     }
     throw new IllegalStateException("No tests for version: " + version.name());
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
index 5e35b11..eb16af5 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryAccountsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV7QueryAccountsTest extends ElasticAbstractQueryAccountsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V7_17);
+    startIndexService(ElasticVersion.V7);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
index 3ce57a1..a319bfe 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryChangesTest.java
@@ -19,6 +19,6 @@
 public class ElasticV7QueryChangesTest extends ElasticAbstractQueryChangesTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V7_17);
+    startIndexService(ElasticVersion.V7);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
index 54c2b12..fd77ea7 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryGroupsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV7QueryGroupsTest extends ElasticAbstractQueryGroupsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V7_17);
+    startIndexService(ElasticVersion.V7);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
index db9f1d0..dd2e8b0 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV7QueryProjectsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV7QueryProjectsTest extends ElasticAbstractQueryProjectsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V7_17);
+    startIndexService(ElasticVersion.V7);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryAccountsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryAccountsTest.java
index d3874b8..4ea1b06 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryAccountsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryAccountsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV8QueryAccountsTest extends ElasticAbstractQueryAccountsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V8_15);
+    startIndexService(ElasticVersion.V8);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryChangesTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryChangesTest.java
index 6f8d4b0..c4622fd 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryChangesTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryChangesTest.java
@@ -19,6 +19,6 @@
 public class ElasticV8QueryChangesTest extends ElasticAbstractQueryChangesTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V8_15);
+    startIndexService(ElasticVersion.V8);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryGroupsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryGroupsTest.java
index a8dfc7e..e18e07a 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryGroupsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryGroupsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV8QueryGroupsTest extends ElasticAbstractQueryGroupsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V8_15);
+    startIndexService(ElasticVersion.V8);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryProjectsTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryProjectsTest.java
index 1a5e3c7..9277b4b 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryProjectsTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticV8QueryProjectsTest.java
@@ -19,6 +19,6 @@
 public class ElasticV8QueryProjectsTest extends ElasticAbstractQueryProjectsTest {
   @BeforeClass
   public static void startIndexService() {
-    startIndexService(ElasticVersion.V8_15);
+    startIndexService(ElasticVersion.V8);
   }
 }
diff --git a/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java b/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java
index a0c0ba1..aa5fb72 100644
--- a/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java
+++ b/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java
@@ -22,12 +22,25 @@
 public class ElasticVersionTest {
   @Test
   public void supportedVersion() throws Exception {
-    assertThat(ElasticVersion.forVersion("7.17.0")).isEqualTo(ElasticVersion.V7_17);
-    assertThat(ElasticVersion.forVersion("7.17.1")).isEqualTo(ElasticVersion.V7_17);
+    assertThat(ElasticVersion.forVersion("7.0.0-alpha1")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.0.0-beta1")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.0.0-rc2")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.0.10")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.16.0")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.16.1")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.17.0")).isEqualTo(ElasticVersion.V7);
+    assertThat(ElasticVersion.forVersion("7.17.1")).isEqualTo(ElasticVersion.V7);
 
-    assertThat(ElasticVersion.forVersion("8.15.0")).isEqualTo(ElasticVersion.V8_15);
-    assertThat(ElasticVersion.forVersion("8.15.1")).isEqualTo(ElasticVersion.V8_15);
-    assertThat(ElasticVersion.forVersion("8.15.2")).isEqualTo(ElasticVersion.V8_15);
+    assertThat(ElasticVersion.forVersion("8.0.0-alpha1")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.0.0-beta1")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.0.0-rc2")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.0.10")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.9.0")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.9.1")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.9.2")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.15.0")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.15.1")).isEqualTo(ElasticVersion.V8);
+    assertThat(ElasticVersion.forVersion("8.15.2")).isEqualTo(ElasticVersion.V8);
   }
 
   @Test