/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.elasticsearch.util.impl; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.StatusLine; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.elasticsearch.client.Response; import org.hibernate.search.elasticsearch.client.impl.ElasticsearchRequest; import org.hibernate.search.elasticsearch.gson.impl.GsonProvider; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; /** * @author Yoann Rodiere */ public class ElasticsearchClientUtils { private static final ContentType JSON_CONTENT_TYPE = ContentType.APPLICATION_JSON.withCharset("utf-8"); private ElasticsearchClientUtils() { // Private constructor } public static boolean isSuccessCode(int code) { return 200 <= code && code < 300; } public static HttpEntity toEntity(Gson gson, ElasticsearchRequest request) { List<JsonObject> bodyParts = request.getBodyParts(); if ( bodyParts.isEmpty() ) { return null; } StringBuilder builder = new StringBuilder(); for ( JsonObject bodyPart : bodyParts ) { gson.toJson( bodyPart, builder ); builder.append("\n"); } return new StringEntity( builder.toString(), JSON_CONTENT_TYPE ); } public static JsonObject parseJsonResponse(GsonProvider gsonProvider, Response response) throws IOException { HttpEntity entity = response.getEntity(); if ( entity == null ) { return null; } Gson gson = gsonProvider.getGson(); ContentType contentType = ContentType.get( entity ); try ( InputStream inputStream = entity.getContent(); Reader reader = new InputStreamReader( inputStream, contentType.getCharset() ) ) { return gson.fromJson( reader, JsonObject.class ); } } public static String formatRequest(GsonProvider gsonProvider, ElasticsearchRequest request) { StringBuilder sb = new StringBuilder(); sb.append( "Method: " ).append( request.getMethod() ).append( "\n" ); sb.append( "Path: " ).append( request.getPath() ).append( "\n" ); sb.append( "Data:\n" ); sb.append( formatRequestData( gsonProvider, request ) ); sb.append( "\n" ); return sb.toString(); } public static String formatRequestData(GsonProvider gsonProvider, ElasticsearchRequest request) { List<JsonObject> bodyParts = request.getBodyParts(); Gson gson = gsonProvider.getGsonPrettyPrinting(); StringBuilder builder = new StringBuilder(); for ( JsonObject bodyPart : bodyParts ) { gson.toJson( bodyPart, builder ); builder.append("\n"); } return builder.toString(); } public static String formatRequestData(GsonProvider gsonProvider, JsonObject body) { Gson gson = gsonProvider.getGsonPrettyPrinting(); return gson.toJson( body ); } public static String formatResponse(GsonProvider gsonProvider, Response response, JsonObject parsedResponse) { if ( response == null ) { return null; } StringBuilder sb = new StringBuilder(); StatusLine statusLine = response.getStatusLine(); sb.append( "Status: " ).append( statusLine.getStatusCode() ).append( " " ).append( statusLine.getReasonPhrase() ).append( "\n" ); sb.append( "Error message: " ).append( propertyAsString( parsedResponse, "error" ) ).append( "\n" ); sb.append( "Cluster name: " ).append( propertyAsString( parsedResponse, "cluster_name" ) ).append( "\n" ); sb.append( "Cluster status: " ).append( propertyAsString( parsedResponse, "status" ) ).append( "\n" ); sb.append( "\n" ); JsonElement items = property( parsedResponse, "items" ); if ( items != null && items.isJsonArray() ) { for ( JsonElement item : items.getAsJsonArray() ) { for ( Map.Entry<String, JsonElement> entry : item.getAsJsonObject().entrySet() ) { sb.append( "Operation: " ).append( entry.getKey() ).append( "\n" ); JsonElement value = entry.getValue(); sb.append( " Index: " ).append( propertyAsString( value, "_index" ) ).append( "\n" ); sb.append( " Type: " ).append( propertyAsString( value, "_type" ) ).append( "\n" ); sb.append( " Id: " ).append( propertyAsString( value, "_id" ) ).append( "\n" ); sb.append( " Status: " ).append( propertyAsString( value, "status" ) ).append( "\n" ); sb.append( " Error: " ).append( propertyAsString( value, "error" ) ).append( "\n" ); } } } return sb.toString(); } private static JsonElement property(JsonObject parent, String name) { if ( parent == null ) { return null; } return parent.get( name ); } private static String propertyAsString(JsonElement parent, String name) { if ( parent == null || !parent.isJsonObject() ) { return null; } JsonElement propretyValue = property( parent.getAsJsonObject(), name ); if ( propretyValue == null ) { return null; } return propretyValue.toString(); // Also support non-string properties } }