package io.searchbox.core;
import com.google.common.base.Joiner;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
import io.searchbox.action.AbstractAction;
import io.searchbox.action.AbstractMultiIndexActionBuilder;
import io.searchbox.action.AbstractMultiTypeActionBuilder;
/**
* @author Bartosz Polnik
*/
public class Cat extends AbstractAction<CatResult> {
private final static String PATH_TO_RESULT = "result";
private final String operationPath;
protected <T extends AbstractAction.Builder<Cat, ? extends Builder> & CatBuilder> Cat(T builder) {
super(builder);
this.operationPath = builder.operationPath();
setURI(buildURI());
}
@Override
protected String buildURI() {
String uriSuffix = super.buildURI();
return "_cat/" + this.operationPath + (uriSuffix.isEmpty() ? "" : "/") + uriSuffix;
}
@Override
public String getRestMethodName() {
return "GET";
}
@Override
public String getPathToResult() {
return PATH_TO_RESULT;
}
@Override
public CatResult createNewElasticSearchResult(String responseBody, int statusCode, String reasonPhrase, Gson gson) {
return createNewElasticSearchResult(new CatResult(gson), responseBody, statusCode, reasonPhrase, gson);
}
@Override
protected JsonObject parseResponseBody(String responseBody) {
if (responseBody == null || responseBody.trim().isEmpty()) {
return new JsonObject();
}
JsonElement parsed = new JsonParser().parse(responseBody);
if (parsed.isJsonArray()) {
JsonObject result = new JsonObject();
result.add(PATH_TO_RESULT, parsed.getAsJsonArray());
return result;
} else {
throw new JsonSyntaxException("Cat response did not contain a JSON Array");
}
}
public static class IndicesBuilder extends AbstractMultiTypeActionBuilder<Cat, IndicesBuilder> implements CatBuilder {
private static final String operationPath = "indices";
public IndicesBuilder() {
setHeader("accept", "application/json");
setHeader("content-type", "application/json");
}
@Override
public Cat build() {
return new Cat(this);
}
@Override
public String operationPath() {
return operationPath;
}
}
public static class AliasesBuilder extends AbstractMultiIndexActionBuilder<Cat, AliasesBuilder> implements CatBuilder {
private static final String operationPath = "aliases";
public AliasesBuilder() {
setHeader("accept", "application/json");
setHeader("content-type", "application/json");
}
@Override
public Cat build() {
return new Cat(this);
}
@Override
public String operationPath() {
return operationPath;
}
}
public static class ShardsBuilder extends AbstractMultiIndexActionBuilder<Cat, ShardsBuilder> implements CatBuilder {
private static final String operationPath = "shards";
public ShardsBuilder() {
setHeader("accept", "application/json");
setHeader("content-type", "application/json");
}
@Override
public Cat build() {
return new Cat(this);
}
@Override
public String operationPath() {
return operationPath;
}
@Override
public String getJoinedIndices() {
if (indexNames.size() > 0) {
return Joiner.on(',').join(indexNames);
} else {
return null;
}
}
}
public static class SegmentsBuilder extends AbstractMultiIndexActionBuilder<Cat, SegmentsBuilder> implements CatBuilder {
private static final String operationPath = "segments";
public SegmentsBuilder() {
setHeader("accept", "application/json");
setHeader("content-type", "application/json");
}
@Override
public Cat build() {
return new Cat(this);
}
@Override
public String operationPath() {
return operationPath;
}
@Override
public String getJoinedIndices() {
return indexNames.size() > 0 ? Joiner.on(',').join(indexNames) : null;
}
}
public static class NodesBuilder extends AbstractAction.Builder<Cat, NodesBuilder> implements CatBuilder {
private static final String operationPath = "nodes";
public NodesBuilder() {
setHeader("accept", "application/json");
setHeader("content-type", "application/json");
}
@Override
public Cat build() {
return new Cat(this);
}
@Override
public String operationPath() {
return operationPath;
}
}
protected interface CatBuilder {
String operationPath();
}
}