/*
* 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.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.JsonObject;
/**
* @author Yoann Rodiere
*/
public final class ElasticsearchRequest {
public static Builder put() {
return new Builder( "PUT" );
}
public static Builder get() {
return new Builder( "GET" );
}
public static Builder post() {
return new Builder( "POST" );
}
public static Builder delete() {
return new Builder( "DELETE" );
}
public static Builder head() {
return new Builder( "HEAD" );
}
private final String method;
private final String path;
private final Map<String, String> parameters;
private final List<JsonObject> bodyParts;
private ElasticsearchRequest(Builder builder) {
this.method = builder.method;
this.path = builder.pathBuilder.toString();
this.parameters = builder.parameters == null ? Collections.emptyMap() : Collections.unmodifiableMap( builder.parameters );
this.bodyParts = builder.bodyParts == null ? Collections.emptyList() : Collections.unmodifiableList( builder.bodyParts );
}
public String getMethod() {
return method;
}
public String getPath() {
return path;
}
public Map<String, String> getParameters() {
return parameters;
}
public List<JsonObject> getBodyParts() {
return bodyParts;
}
public static final class Builder {
private static final String PATH_SEPARATOR = "/";
private final String method;
private final StringBuilder pathBuilder = new StringBuilder( PATH_SEPARATOR );
private Map<String, String> parameters;
private List<JsonObject> bodyParts;
private Builder(String method) {
super();
this.method = method;
}
public Builder pathComponent(URLEncodedString pathComponent) {
pathBuilder.append( pathComponent.encoded ).append( PATH_SEPARATOR );
return this;
}
public Builder multiValuedPathComponent(Iterable<URLEncodedString> indexNames) {
boolean first = true;
for ( URLEncodedString name : indexNames ) {
if ( !first ) {
pathBuilder.append( ',' );
}
else {
first = false;
}
pathBuilder.append( name.encoded );
}
pathBuilder.append( PATH_SEPARATOR );
return this;
}
public Builder param(String name, String value) {
if ( parameters == null ) {
parameters = new LinkedHashMap<>();
}
parameters.put( name, value );
return this;
}
public Builder param(String name, int value) {
return param( name, String.valueOf( value ) );
}
public Builder param(String name, boolean value) {
return param( name, String.valueOf( value ) );
}
public Builder body(JsonObject object) {
if ( bodyParts == null ) {
bodyParts = new ArrayList<>();
}
bodyParts.add( object );
return this;
}
public ElasticsearchRequest build() {
return new ElasticsearchRequest( this );
}
}
}