package com.github.obourgain.elasticsearch.http.handler.admin.indices;
import static com.github.obourgain.elasticsearch.http.response.ErrorHandler.HANDLES_404;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsAction;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
import org.elasticsearch.common.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.obourgain.elasticsearch.http.client.HttpIndicesAdminClient;
import com.github.obourgain.elasticsearch.http.concurrent.ListenerCompleterObserver;
import com.github.obourgain.elasticsearch.http.request.HttpRequestUtils;
import com.github.obourgain.elasticsearch.http.request.RequestUriBuilder;
import com.github.obourgain.elasticsearch.http.response.admin.indices.mapping.GetMappingsResponse;
import io.netty.buffer.ByteBuf;
import io.reactivex.netty.protocol.http.client.HttpClientRequest;
import io.reactivex.netty.protocol.http.client.HttpClientResponse;
import rx.Observable;
import rx.functions.Func1;
/**
* @author olivier bourgain
*/
public class GetMappingsActionHandler {
private static final Logger logger = LoggerFactory.getLogger(GetMappingsActionHandler.class);
private final HttpIndicesAdminClient indicesAdminClient;
public GetMappingsActionHandler(HttpIndicesAdminClient indicesAdminClient) {
this.indicesAdminClient = indicesAdminClient;
}
public GetMappingsAction getAction() {
return GetMappingsAction.INSTANCE;
}
public void execute(GetMappingsRequest request, final ActionListener<GetMappingsResponse> listener) {
// TODO tests
logger.debug("get mappings request {}", request);
try {
String indices = HttpRequestUtils.indicesOrAll(request);
RequestUriBuilder uriBuilder = new RequestUriBuilder(indices);
String types = Strings.arrayToCommaDelimitedString(request.types());
if (!types.isEmpty()) {
uriBuilder.type(types);
}
uriBuilder.addEndpoint("_mapping");
// lots of url patterns are accepted, but this one is the most practical for a generic impl
uriBuilder.addQueryParameter("master_timeout", request.masterNodeTimeout().toString());
indicesAdminClient.getHttpClient().submit(HttpClientRequest.createGet(uriBuilder.toString()))
.flatMap(HANDLES_404)
.flatMap(new Func1<HttpClientResponse<ByteBuf>, Observable<GetMappingsResponse>>() {
@Override
public Observable<GetMappingsResponse> call(HttpClientResponse<ByteBuf> response) {
return response.getContent().flatMap(new Func1<ByteBuf, Observable<GetMappingsResponse>>() {
@Override
public Observable<GetMappingsResponse> call(ByteBuf byteBuf) {
return Observable.just(new GetMappingsResponse().parse
(byteBuf));
}
});
}
})
.single()
.subscribe(new ListenerCompleterObserver<>(listener));
} catch (Exception e) {
listener.onFailure(e);
}
}
}