/*
* 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.client.impl;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.apache.http.HttpEntity;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.ResponseException;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.sniff.Sniffer;
import org.hibernate.search.elasticsearch.dialect.impl.DialectIndependentGsonProvider;
import org.hibernate.search.elasticsearch.gson.impl.GsonProvider;
import org.hibernate.search.elasticsearch.logging.impl.ElasticsearchLogCategories;
import org.hibernate.search.elasticsearch.logging.impl.Log;
import org.hibernate.search.elasticsearch.util.impl.ElasticsearchClientUtils;
import org.hibernate.search.util.logging.impl.LoggerFactory;
import com.google.gson.Gson;
/**
* @author Yoann Rodiere
*/
public class DefaultElasticsearchClient implements ElasticsearchClientImplementor {
private static final Log requestLog = LoggerFactory.make( Log.class, ElasticsearchLogCategories.REQUEST );
private final RestClient restClient;
private final Sniffer sniffer;
private volatile GsonProvider gsonProvider;
public DefaultElasticsearchClient(RestClient restClient, Sniffer sniffer) {
this.restClient = restClient;
this.sniffer = sniffer;
this.gsonProvider = DialectIndependentGsonProvider.INSTANCE;
}
@Override
public void init(GsonProvider gsonProvider) {
this.gsonProvider = gsonProvider;
}
@Override
public Response execute(ElasticsearchRequest request) throws IOException {
Gson gson = gsonProvider.getGson();
HttpEntity entity = ElasticsearchClientUtils.toEntity( gson, request );
long start = System.nanoTime();
try {
return restClient.performRequest(
request.getMethod(),
request.getPath(),
request.getParameters(),
entity
);
}
catch (ResponseException e) {
requestLog.debug( "ES client issued a ResponseException - not necessarily a problem", e );
/*
* The client tries to guess what's an error and what's not, but it's too naive.
* A 404 on DELETE is not always important to us, for instance.
* Thus we ignore the exception and do our own checks afterwards.
*/
return e.getResponse();
}
finally {
long executionTime = System.nanoTime() - start;
requestLog.executedRequest( request.getPath(), request.getParameters(), TimeUnit.NANOSECONDS.toMillis( executionTime ) );
}
}
@Override
public void close() throws IOException {
try ( RestClient restClient = this.restClient;
Sniffer sniffer = this.sniffer; ) {
/*
* Nothing to do: we simply take advantage of Java's auto-closing,
* which adds suppressed exceptions as needed and always tries
* to close every resource.
*/
}
}
}