/*
* 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.work.impl;
import org.elasticsearch.client.Response;
import org.hibernate.search.elasticsearch.client.impl.ElasticsearchRequest;
import org.hibernate.search.elasticsearch.client.impl.URLEncodedString;
import org.hibernate.search.elasticsearch.gson.impl.GsonProvider;
import org.hibernate.search.elasticsearch.settings.impl.model.IndexSettings;
import org.hibernate.search.elasticsearch.util.impl.ElasticsearchClientUtils;
import org.hibernate.search.elasticsearch.work.impl.builder.CreateIndexWorkBuilder;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
/**
* @author Yoann Rodiere
*/
public class CreateIndexWork extends SimpleElasticsearchWork<CreateIndexResult> {
protected CreateIndexWork(Builder builder) {
super( builder );
}
@Override
protected CreateIndexResult generateResult(ElasticsearchWorkExecutionContext context, Response response, JsonObject parsedResponseBody) {
int statusCode = response.getStatusLine().getStatusCode();
if ( ElasticsearchClientUtils.isSuccessCode( statusCode ) ) {
return CreateIndexResult.CREATED;
}
else {
// Can only happen if ignoreExisting() was called on the builder
return CreateIndexResult.ALREADY_EXISTS;
}
}
public static class Builder
extends SimpleElasticsearchWork.Builder<Builder>
implements CreateIndexWorkBuilder {
private final GsonProvider gsonProvider;
private final URLEncodedString indexName;
private JsonObject payload;
public Builder(GsonProvider gsonProvider, URLEncodedString indexName) {
super( null, DefaultElasticsearchRequestSuccessAssessor.INSTANCE );
this.gsonProvider = gsonProvider;
this.indexName = indexName;
}
@Override
public Builder settings(IndexSettings settings) {
if ( settings != null ) {
/*
* Serializing nulls is really not a good idea here, it triggers NPEs in Elasticsearch
* We better not include the null fields.
*/
Gson gson = gsonProvider.getGsonNoSerializeNulls();
this.payload = gson.toJsonTree( settings ).getAsJsonObject();
}
return this;
}
@Override
public Builder ignoreExisting() {
this.resultAssessor = DefaultElasticsearchRequestSuccessAssessor.builder()
.ignoreErrorTypes( "index_already_exists_exception" )
.build();
return this;
}
@Override
protected ElasticsearchRequest buildRequest() {
ElasticsearchRequest.Builder builder =
ElasticsearchRequest.put()
.pathComponent( indexName );
if ( payload != null ) {
builder.body( payload );
}
return builder.build();
}
@Override
public CreateIndexWork build() {
return new CreateIndexWork( this );
}
}
}