/* * 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.dialect.impl; import java.io.IOException; import java.util.Properties; import org.elasticsearch.client.Response; import org.hibernate.search.elasticsearch.client.impl.ElasticsearchClient; import org.hibernate.search.elasticsearch.client.impl.ElasticsearchRequest; import org.hibernate.search.elasticsearch.dialect.impl.es2.Elasticsearch2Dialect; import org.hibernate.search.elasticsearch.dialect.impl.es5.Elasticsearch5Dialect; import org.hibernate.search.elasticsearch.gson.impl.GsonProvider; import org.hibernate.search.elasticsearch.gson.impl.JsonAccessor; import org.hibernate.search.elasticsearch.logging.impl.Log; import org.hibernate.search.elasticsearch.util.impl.ElasticsearchClientUtils; import org.hibernate.search.exception.SearchException; import org.hibernate.search.util.logging.impl.LoggerFactory; import com.google.gson.JsonObject; /** * @author Yoann Rodiere */ public class DefaultElasticsearchDialectFactory implements ElasticsearchDialectFactory { private static final Log log = LoggerFactory.make( Log.class ); private static final JsonAccessor VERSION_ACCESSOR = JsonAccessor.root().property( "version" ).property( "number" ); @Override public ElasticsearchDialect createDialect(ElasticsearchClient client, Properties properties) { String version; try { version = getVersion( client ); } catch (RuntimeException e) { throw log.failedToDetectElasticsearchVersion( e ); } if ( version.startsWith( "2." ) ) { return new Elasticsearch2Dialect(); } else if ( version.startsWith( "5." ) ) { return new Elasticsearch5Dialect(); } else { throw log.unexpectedElasticsearchVersion( version ); } } private String getVersion(ElasticsearchClient client) { ElasticsearchRequest request = ElasticsearchRequest.get().build(); GsonProvider gsonProvider = DialectIndependentGsonProvider.INSTANCE; Response response = null; JsonObject responseAsJsonObject = null; try { response = client.execute( request ); responseAsJsonObject = ElasticsearchClientUtils.parseJsonResponse( gsonProvider, response ); if ( !ElasticsearchClientUtils.isSuccessCode( response.getStatusLine().getStatusCode() ) ) { throw log.elasticsearchRequestFailed( ElasticsearchClientUtils.formatRequest( gsonProvider, request ), ElasticsearchClientUtils.formatResponse( gsonProvider, response, responseAsJsonObject ), null ); } return VERSION_ACCESSOR.get( responseAsJsonObject ).getAsString(); } catch (SearchException e) { throw e; // Do not add context for those: we expect SearchExceptions to be self-explanatory } catch (IOException | RuntimeException e) { throw log.elasticsearchRequestFailed( ElasticsearchClientUtils.formatRequest( gsonProvider, request ), ElasticsearchClientUtils.formatResponse( gsonProvider, response, responseAsJsonObject ), e ); } } }