summaryrefslogtreecommitdiffstats
path: root/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java')
-rw-r--r--gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java274
1 files changed, 0 insertions, 274 deletions
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
deleted file mode 100644
index 4f811b9ee6..0000000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (C) 2014 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.gerrit.elasticsearch;
-
-import static com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.apache.commons.codec.binary.Base64.decodeBase64;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.io.CharStreams;
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.elasticsearch.ElasticMapping.MappingProperties;
-import com.google.gerrit.elasticsearch.builders.SearchSourceBuilder;
-import com.google.gerrit.elasticsearch.bulk.DeleteRequest;
-import com.google.gerrit.index.Index;
-import com.google.gerrit.index.Schema;
-import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.index.IndexUtils;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonObject;
-import com.google.gson.JsonParser;
-import com.google.gwtorm.protobuf.ProtobufCodec;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpStatus;
-import org.apache.http.entity.ContentType;
-import org.apache.http.nio.entity.NStringEntity;
-import org.elasticsearch.client.Request;
-import org.elasticsearch.client.Response;
-
-abstract class AbstractElasticIndex<K, V> implements Index<K, V> {
- protected static final String BULK = "_bulk";
- protected static final String MAPPINGS = "mappings";
- protected static final String ORDER = "order";
- protected static final String SEARCH = "_search";
- protected static final String SETTINGS = "settings";
-
- protected static <T> List<T> decodeProtos(
- JsonObject doc, String fieldName, ProtobufCodec<T> codec) {
- JsonArray field = doc.getAsJsonArray(fieldName);
- if (field == null) {
- return null;
- }
- return FluentIterable.from(field)
- .transform(i -> codec.decode(decodeBase64(i.toString())))
- .toList();
- }
-
- static String getContent(Response response) throws IOException {
- HttpEntity responseEntity = response.getEntity();
- String content = "";
- if (responseEntity != null) {
- InputStream contentStream = responseEntity.getContent();
- try (Reader reader = new InputStreamReader(contentStream, UTF_8)) {
- content = CharStreams.toString(reader);
- }
- }
- return content;
- }
-
- private final ElasticConfiguration config;
- private final Schema<V> schema;
- private final SitePaths sitePaths;
- private final String indexNameRaw;
-
- protected final String type;
- protected final ElasticRestClientProvider client;
- protected final String indexName;
- protected final Gson gson;
- protected final ElasticQueryBuilder queryBuilder;
-
- AbstractElasticIndex(
- ElasticConfiguration config,
- SitePaths sitePaths,
- Schema<V> schema,
- ElasticRestClientProvider client,
- String indexName,
- String indexType) {
- this.config = config;
- this.sitePaths = sitePaths;
- this.schema = schema;
- this.gson = new GsonBuilder().setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
- this.queryBuilder = new ElasticQueryBuilder();
- this.indexName = config.getIndexName(indexName, schema.getVersion());
- this.indexNameRaw = indexName;
- this.client = client;
- this.type = client.adapter().getType(indexType);
- }
-
- AbstractElasticIndex(
- ElasticConfiguration cfg,
- SitePaths sitePaths,
- Schema<V> schema,
- ElasticRestClientProvider client,
- String indexName) {
- this(cfg, sitePaths, schema, client, indexName, indexName);
- }
-
- @Override
- public Schema<V> getSchema() {
- return schema;
- }
-
- @Override
- public void close() {
- // Do nothing. Client is closed by the provider.
- }
-
- @Override
- public void markReady(boolean ready) throws IOException {
- IndexUtils.setReady(sitePaths, indexNameRaw, schema.getVersion(), ready);
- }
-
- @Override
- public void delete(K id) throws IOException {
- String uri = getURI(type, BULK);
- Response response = postRequest(uri, getDeleteActions(id), getRefreshParam());
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- throw new IOException(
- String.format("Failed to delete %s from index %s: %s", id, indexName, statusCode));
- }
- }
-
- @Override
- public void deleteAll() throws IOException {
- // Delete the index, if it exists.
- String endpoint = indexName + client.adapter().indicesExistParam();
- Response response = performRequest("HEAD", endpoint);
- int statusCode = response.getStatusLine().getStatusCode();
- if (statusCode == HttpStatus.SC_OK) {
- response = performRequest("DELETE", indexName);
- statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- throw new IOException(
- String.format("Failed to delete index %s: %s", indexName, statusCode));
- }
- }
-
- // Recreate the index.
- String indexCreationFields = concatJsonString(getSettings(), getMappings());
- response =
- performRequest(
- "PUT", indexName + client.adapter().includeTypeNameParam(), indexCreationFields);
- statusCode = response.getStatusLine().getStatusCode();
- if (statusCode != HttpStatus.SC_OK) {
- String error = String.format("Failed to create index %s: %s", indexName, statusCode);
- throw new IOException(error);
- }
- }
-
- protected abstract String getDeleteActions(K id);
-
- protected abstract String getMappings();
-
- private String getSettings() {
- return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config)));
- }
-
- protected abstract String getId(V v);
-
- protected String getMappingsForSingleType(String candidateType, MappingProperties properties) {
- return getMappingsFor(client.adapter().getType(candidateType), properties);
- }
-
- protected String getMappingsFor(String type, MappingProperties properties) {
- JsonObject mappingType = new JsonObject();
- mappingType.add(type, gson.toJsonTree(properties));
- JsonObject mappings = new JsonObject();
- mappings.add(MAPPINGS, gson.toJsonTree(mappingType));
- return gson.toJson(mappings);
- }
-
- protected String delete(String type, K id) {
- return new DeleteRequest(id.toString(), indexName, type, client.adapter()).toString();
- }
-
- protected void addNamedElement(String name, JsonObject element, JsonArray array) {
- JsonObject arrayElement = new JsonObject();
- arrayElement.add(name, element);
- array.add(arrayElement);
- }
-
- protected Map<String, String> getRefreshParam() {
- Map<String, String> params = new HashMap<>();
- params.put("refresh", "true");
- return params;
- }
-
- protected String getSearch(SearchSourceBuilder searchSource, JsonArray sortArray) {
- JsonObject search = new JsonParser().parse(searchSource.toString()).getAsJsonObject();
- search.add("sort", sortArray);
- return gson.toJson(search);
- }
-
- protected JsonArray getSortArray(String idFieldName) {
- JsonObject properties = new JsonObject();
- properties.addProperty(ORDER, "asc");
- client.adapter().setIgnoreUnmapped(properties);
-
- JsonArray sortArray = new JsonArray();
- addNamedElement(idFieldName, properties, sortArray);
- return sortArray;
- }
-
- protected String getURI(String type, String request) throws UnsupportedEncodingException {
- String encodedIndexName = URLEncoder.encode(indexName, UTF_8.toString());
- if (SEARCH.equals(request) && client.adapter().omitTypeFromSearch()) {
- return encodedIndexName + "/" + request;
- }
- String encodedType = URLEncoder.encode(type, UTF_8.toString());
- return encodedIndexName + "/" + encodedType + "/" + request;
- }
-
- protected Response postRequest(String uri, Object payload) throws IOException {
- return performRequest("POST", uri, payload);
- }
-
- protected Response postRequest(String uri, Object payload, Map<String, String> params)
- throws IOException {
- return performRequest("POST", uri, payload, params);
- }
-
- private String concatJsonString(String target, String addition) {
- return target.substring(0, target.length() - 1) + "," + addition.substring(1);
- }
-
- private Response performRequest(String method, String uri) throws IOException {
- return performRequest(method, uri, null);
- }
-
- private Response performRequest(String method, String uri, @Nullable Object payload)
- throws IOException {
- return performRequest(method, uri, payload, Collections.emptyMap());
- }
-
- private Response performRequest(
- String method, String uri, @Nullable Object payload, Map<String, String> params)
- throws IOException {
- Request request = new Request(method, uri.startsWith("/") ? uri : "/" + uri);
- if (payload != null) {
- String payloadStr = payload instanceof String ? (String) payload : payload.toString();
- request.setEntity(new NStringEntity(payloadStr, ContentType.APPLICATION_JSON));
- }
- for (Map.Entry<String, String> entry : params.entrySet()) {
- request.addParameter(entry.getKey(), entry.getValue());
- }
- return client.get().performRequest(request);
- }
-}