Merge branch 'stable-3.0' into stable-3.1

* stable-3.0:
  AbstractElasticIndex: Add helper method to invoke base64 decode
  Elasticsearch: Don't use JsonElement.toString
  ElasticChangeIndex: Consistently use static imported Base64.decodeBase64
  MergeValidationListener: Add missing Javadoc

Change-Id: I1e676fca98ec50e3bf7abd418d29532aa4d0c2ae
diff --git a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index fbdc383..864839a 100644
--- a/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -87,6 +87,10 @@
   protected static final String SEARCH = "_search";
   protected static final String SETTINGS = "settings";
 
+  protected static byte[] decodeBase64(String base64String) {
+    return Base64.decodeBase64(base64String);
+  }
+
   protected static <T> List<T> decodeProtos(
       JsonObject doc, String fieldName, ProtoConverter<?, T> converter) {
     JsonArray field = doc.getAsJsonArray(fieldName);
@@ -94,8 +98,8 @@
       return null;
     }
     return Streams.stream(field)
-        .map(JsonElement::toString)
-        .map(Base64::decodeBase64)
+        .map(JsonElement::getAsString)
+        .map(AbstractElasticIndex::decodeBase64)
         .map(bytes -> parseProtoFrom(bytes, converter))
         .collect(toImmutableList());
   }
diff --git a/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
index 6151de2..37184cc 100644
--- a/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
+++ b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
@@ -18,7 +18,6 @@
 import static com.google.gerrit.server.index.change.ChangeIndexRewriter.OPEN_STATUSES;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Objects.requireNonNull;
-import static org.apache.commons.codec.binary.Base64.decodeBase64;
 
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableListMultimap;
@@ -65,7 +64,6 @@
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.codec.binary.Base64;
 import org.apache.http.HttpStatus;
 import org.elasticsearch.client.Response;
 
@@ -219,7 +217,7 @@
 
     ChangeData cd =
         changeDataFactory.create(
-            parseProtoFrom(Base64.decodeBase64(c.getAsString()), ChangeProtoConverter.INSTANCE));
+            parseProtoFrom(decodeBase64(c.getAsString()), ChangeProtoConverter.INSTANCE));
 
     // Any decoding that is done here must also be done in {@link LuceneChangeIndex}.
 
@@ -403,7 +401,7 @@
   private Iterable<byte[]> getByteArray(JsonObject source, String name) {
     JsonElement element = source.get(name);
     return element != null
-        ? Iterables.transform(element.getAsJsonArray(), e -> Base64.decodeBase64(e.getAsString()))
+        ? Iterables.transform(element.getAsJsonArray(), e -> decodeBase64(e.getAsString()))
         : Collections.emptyList();
   }
 
@@ -415,7 +413,7 @@
     }
     ChangeField.parseSubmitRecords(
         FluentIterable.from(records)
-            .transform(i -> new String(decodeBase64(i.toString()), UTF_8))
+            .transform(i -> new String(decodeBase64(i.getAsString()), UTF_8))
             .toList(),
         opts,
         out);