package org.xbib.elasticsearch.rest.action.langdetect;
import org.elasticsearch.client.node.NodeClient;
import org.elasticsearch.common.CheckedConsumer;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.BaseRestHandler;
import org.elasticsearch.rest.RestController;
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.action.RestStatusToXContentListener;
import org.xbib.elasticsearch.action.langdetect.LangdetectAction;
import org.xbib.elasticsearch.action.langdetect.LangdetectRequest;
import java.io.IOException;
import static org.elasticsearch.rest.RestRequest.Method.GET;
import static org.elasticsearch.rest.RestRequest.Method.POST;
/**
*
*/
public class RestLangdetectAction extends BaseRestHandler {
@Inject
public RestLangdetectAction(Settings settings, RestController controller) {
super(settings);
controller.registerHandler(GET, "/_langdetect", this);
controller.registerHandler(GET, "/_langdetect/{profile}", this);
controller.registerHandler(POST, "/_langdetect", this);
controller.registerHandler(POST, "/_langdetect/{profile}", this);
}
@Override
protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException {
final LangdetectRequest langdetectRequest = new LangdetectRequest();
langdetectRequest.setText(request.param("text"));
langdetectRequest.setProfile(request.param("profile", ""));
withContent(request, parser -> {
if (parser != null) {
XContentParser.Token token;
while ((token = parser.nextToken()) != null) {
if (token == XContentParser.Token.VALUE_STRING) {
if ("text".equals(parser.currentName())) {
langdetectRequest.setText(parser.text());
} else if ("profile".equals(parser.currentName())) {
langdetectRequest.setProfile(parser.text());
}
}
}
}
});
return channel -> client.execute(LangdetectAction.INSTANCE, langdetectRequest,
new RestStatusToXContentListener<>(channel));
}
private void withContent(RestRequest restRequest, CheckedConsumer<XContentParser, IOException> withParser)
throws IOException {
BytesReference content = restRequest.content();
XContentType xContentType = XContentType.JSON;
if (content.length() > 0) {
try (XContentParser parser = xContentType.xContent().createParser(restRequest.getXContentRegistry(), content)) {
withParser.accept(parser);
}
} else {
withParser.accept(null);
}
}
}