Skip to content

Commit

Permalink
[REST] Add more utilitis for source/body handling in RestAction
Browse files Browse the repository at this point in the history
  • Loading branch information
s1monw committed Apr 22, 2015
1 parent 59c5708 commit 18fec52
Show file tree
Hide file tree
Showing 13 changed files with 73 additions and 127 deletions.
6 changes: 6 additions & 0 deletions src/main/java/org/elasticsearch/rest/BaseRestHandler.java
Expand Up @@ -19,13 +19,19 @@

package org.elasticsearch.rest;

import org.elasticsearch.ElasticsearchIllegalArgumentException;
import org.elasticsearch.action.*;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.ClusterAdminClient;
import org.elasticsearch.client.FilterClient;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.common.bytes.BytesArray;
import org.elasticsearch.common.bytes.BytesReference;
import org.elasticsearch.common.component.AbstractComponent;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.action.support.RestActions;

import java.util.Set;

Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.*;
import org.elasticsearch.rest.action.support.RestActions;
import org.elasticsearch.rest.action.support.RestToXContentListener;

import java.io.IOException;
Expand Down Expand Up @@ -69,16 +70,16 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
analyzeRequest.tokenFilters(request.paramAsStringArray("token_filters", request.paramAsStringArray("filters", analyzeRequest.tokenFilters())));
analyzeRequest.charFilters(request.paramAsStringArray("char_filters", analyzeRequest.charFilters()));

if (request.hasContent() || request.hasParam("source")) {
XContentType type = contentType(request);
if (RestActions.hasBodyContent(request)) {
XContentType type = RestActions.guessBodyContentType(request);
if (type == null) {
if (text == null) {
text = bodyContent(request).toUtf8();
text = RestActions.getRestContent(request).toUtf8();
analyzeRequest.text(text);
}
} else {
// NOTE: if rest request with xcontent body has request parameters, the parameters does not override xcontent values
buildFromContent(bodyContent(request), analyzeRequest);
buildFromContent(RestActions.getRestContent(request), analyzeRequest);
}
}

Expand Down Expand Up @@ -132,27 +133,4 @@ public static void buildFromContent(BytesReference content, AnalyzeRequest analy
throw new ElasticsearchIllegalArgumentException("Failed to parse request body", e);
}
}

private XContentType contentType(final RestRequest request) {
if (request.hasContent()) {
return XContentFactory.xContentType(request.content());
} else if (request.hasParam("source")) {
return XContentFactory.xContentType(request.param("source"));
}
throw new ElasticsearchIllegalArgumentException("Can't guess contentType neither source nor content available");
}

private BytesReference bodyContent(final RestRequest request) {
if (request.hasContent()) {
return request.content();
} else if (request.hasParam("source")) {
return new BytesArray(request.param("source"));
}
throw new ElasticsearchIllegalArgumentException("Can't guess contentType neither source nor content available");
}





}
Expand Up @@ -59,17 +59,12 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
ValidateQueryRequest validateQueryRequest = new ValidateQueryRequest(Strings.splitStringByCommaToArray(request.param("index")));
validateQueryRequest.listenerThreaded(false);
validateQueryRequest.indicesOptions(IndicesOptions.fromRequest(request, validateQueryRequest.indicesOptions()));
if (request.hasContent()) {
validateQueryRequest.source(request.content());
if (RestActions.hasBodyContent(request)) {
validateQueryRequest.source(RestActions.getRestContent(request));
} else {
String source = request.param("source");
if (source != null) {
validateQueryRequest.source(source);
} else {
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
validateQueryRequest.source(querySourceBuilder);
}
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
validateQueryRequest.source(querySourceBuilder);
}
}
validateQueryRequest.types(Strings.splitStringByCommaToArray(request.param("type")));
Expand Down
Expand Up @@ -60,17 +60,12 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
CountRequest countRequest = new CountRequest(Strings.splitStringByCommaToArray(request.param("index")));
countRequest.indicesOptions(IndicesOptions.fromRequest(request, countRequest.indicesOptions()));
countRequest.listenerThreaded(false);
if (request.hasContent()) {
countRequest.source(request.content());
if (RestActions.hasBodyContent(request)) {
countRequest.source(RestActions.getRestContent(request));
} else {
String source = request.param("source");
if (source != null) {
countRequest.source(source);
} else {
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
countRequest.source(querySourceBuilder);
}
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
countRequest.source(querySourceBuilder);
}
}
countRequest.routing(request.param("routing"));
Expand Down
Expand Up @@ -54,17 +54,12 @@ public RestDeleteByQueryAction(Settings settings, RestController controller, Cli
public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) {
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(Strings.splitStringByCommaToArray(request.param("index")));
deleteByQueryRequest.listenerThreaded(false);
if (request.hasContent()) {
deleteByQueryRequest.source(request.content());
if (RestActions.hasBodyContent(request)) {
deleteByQueryRequest.source(RestActions.getRestContent(request));
} else {
String source = request.param("source");
if (source != null) {
deleteByQueryRequest.source(source);
} else {
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
deleteByQueryRequest.source(querySourceBuilder);
}
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
deleteByQueryRequest.source(querySourceBuilder);
}
}
deleteByQueryRequest.types(Strings.splitStringByCommaToArray(request.param("type")));
Expand Down
Expand Up @@ -49,17 +49,12 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
final ExistsRequest existsRequest = new ExistsRequest(Strings.splitStringByCommaToArray(request.param("index")));
existsRequest.indicesOptions(IndicesOptions.fromRequest(request, existsRequest.indicesOptions()));
existsRequest.listenerThreaded(false);
if (request.hasContent()) {
existsRequest.source(request.content());
if (RestActions.hasBodyContent(request)) {
existsRequest.source(RestActions.getRestContent(request));
} else {
String source = request.param("source");
if (source != null) {
existsRequest.source(source);
} else {
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
existsRequest.source(querySourceBuilder);
}
QuerySourceBuilder querySourceBuilder = RestActions.parseQuerySource(request);
if (querySourceBuilder != null) {
existsRequest.source(querySourceBuilder);
}
}
existsRequest.routing(request.param("routing"));
Expand Down
Expand Up @@ -35,6 +35,7 @@
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.rest.*;
import org.elasticsearch.rest.action.support.RestActions;
import org.elasticsearch.rest.action.support.RestBuilderListener;
import org.elasticsearch.search.fetch.source.FetchSourceContext;

Expand Down Expand Up @@ -63,12 +64,9 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
explainRequest.parent(request.param("parent"));
explainRequest.routing(request.param("routing"));
explainRequest.preference(request.param("preference"));
String sourceString = request.param("source");
String queryString = request.param("q");
if (request.hasContent()) {
explainRequest.source(request.content());
} else if (sourceString != null) {
explainRequest.source(new BytesArray(request.param("source")));
if (RestActions.hasBodyContent(request)) {
explainRequest.source(RestActions.getRestContent(request));
} else if (queryString != null) {
QueryStringQueryBuilder queryStringBuilder = QueryBuilders.queryStringQuery(queryString);
queryStringBuilder.defaultField(request.param("df"));
Expand Down
Expand Up @@ -57,15 +57,15 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
String scrollIds = request.param("scroll_id");
ClearScrollRequest clearRequest = new ClearScrollRequest();
clearRequest.setScrollIds(Arrays.asList(splitScrollIds(scrollIds)));
if (request.hasContent()) {
XContentType type = XContentFactory.xContentType(request.content());
if (RestActions.hasBodyContent(request)) {
XContentType type = RestActions.guessBodyContentType(request);
if (type == null) {
scrollIds = RestActions.getRestContent(request).toUtf8();
clearRequest.setScrollIds(Arrays.asList(splitScrollIds(scrollIds)));
} else {
// NOTE: if rest request with xcontent body has request parameters, these parameters does not override xcontent value
clearRequest.setScrollIds(null);
buildFromContent(request.content(), clearRequest);
buildFromContent(RestActions.getRestContent(request), clearRequest);
}
}

Expand Down
Expand Up @@ -31,6 +31,7 @@
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.rest.*;
import org.elasticsearch.rest.action.exists.RestExistsAction;
import org.elasticsearch.rest.action.support.RestActions;
import org.elasticsearch.rest.action.support.RestStatusToXContentListener;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.builder.SearchSourceBuilder;
Expand Down Expand Up @@ -87,20 +88,11 @@ public static SearchRequest parseSearchRequest(RestRequest request) {
// get the content, and put it in the body
// add content/source as template if template flag is set
boolean isTemplateRequest = request.path().endsWith("/template");
if (request.hasContent()) {
if (RestActions.hasBodyContent(request)) {
if (isTemplateRequest) {
searchRequest.templateSource(request.content());
searchRequest.templateSource(RestActions.getRestContent(request));
} else {
searchRequest.source(request.content());
}
} else {
String source = request.param("source");
if (source != null) {
if (isTemplateRequest) {
searchRequest.templateSource(source);
} else {
searchRequest.source(source);
}
searchRequest.source(RestActions.getRestContent(request));
}
}

Expand Down
Expand Up @@ -69,16 +69,16 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
searchScrollRequest.scroll(new Scroll(parseTimeValue(scroll, null)));
}

if (request.hasContent() || request.hasParam("source")) {
XContentType type = contentType(request);
if (RestActions.hasBodyContent(request)) {
XContentType type = XContentFactory.xContentType(RestActions.getRestContent(request));
if (type == null) {
if (scrollId == null) {
scrollId = bodyContent(request).toUtf8();
scrollId = RestActions.getRestContent(request).toUtf8();
searchScrollRequest.scrollId(scrollId);
}
} else {
// NOTE: if rest request with xcontent body has request parameters, these parameters override xcontent values
buildFromContent(bodyContent(request), searchScrollRequest);
buildFromContent(RestActions.getRestContent(request), searchScrollRequest);
}
}
client.searchScroll(searchScrollRequest, new RestStatusToXContentListener<SearchResponse>(channel));
Expand Down Expand Up @@ -107,24 +107,4 @@ public static void buildFromContent(BytesReference content, SearchScrollRequest
throw new ElasticsearchIllegalArgumentException("Failed to parse request body", e);
}
}

private XContentType contentType(final RestRequest request) {
if (request.hasContent()) {
return XContentFactory.xContentType(request.content());
} else if (request.hasParam("source")) {
return XContentFactory.xContentType(request.param("source"));
}
throw new ElasticsearchIllegalArgumentException("Can't guess contentType neither source nor content available");
}

private BytesReference bodyContent(final RestRequest request) {
if (request.hasContent()) {
return request.content();
} else if (request.hasParam("source")) {
return new BytesArray(request.param("source"));
}
throw new ElasticsearchIllegalArgumentException("Can't guess contentType neither source nor content available");
}


}
Expand Up @@ -38,6 +38,7 @@
import org.elasticsearch.rest.RestRequest;
import org.elasticsearch.rest.RestResponse;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.rest.action.support.RestActions;
import org.elasticsearch.rest.action.support.RestBuilderListener;
import org.elasticsearch.search.suggest.Suggest;

Expand All @@ -60,15 +61,10 @@ public void handleRequest(final RestRequest request, final RestChannel channel,
SuggestRequest suggestRequest = new SuggestRequest(Strings.splitStringByCommaToArray(request.param("index")));
suggestRequest.indicesOptions(IndicesOptions.fromRequest(request, suggestRequest.indicesOptions()));
suggestRequest.listenerThreaded(false);
if (request.hasContent()) {
suggestRequest.suggest(request.content());
if (RestActions.hasBodyContent(request)) {
suggestRequest.suggest(RestActions.getRestContent(request));
} else {
String source = request.param("source");
if (source != null) {
suggestRequest.suggest(source);
} else {
throw new ElasticsearchIllegalArgumentException("no content or source provided to execute suggestion");
}
throw new ElasticsearchIllegalArgumentException("no content or source provided to execute suggestion");
}
suggestRequest.routing(request.param("routing"));
suggestRequest.preference(request.param("preference"));
Expand Down
Expand Up @@ -28,6 +28,8 @@
import org.elasticsearch.common.lucene.uid.Versions;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentBuilderString;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.rest.RestRequest;
Expand Down Expand Up @@ -128,4 +130,24 @@ public static BytesReference getRestContent(RestRequest request) {

return content;
}

/**
* guesses the content type from either payload or source parameter
* @param request Rest request
* @return rest content type or <code>null</code> if not applicable.
*/
public static XContentType guessBodyContentType(final RestRequest request) {
final BytesReference restContent = RestActions.getRestContent(request);
if (restContent == null) {
return null;
}
return XContentFactory.xContentType(restContent);
}

/**
* Returns <code>true</code> if either payload or source parameter is present. Otherwise <code>false</code>
*/
public static boolean hasBodyContent(final RestRequest request) {
return request.hasContent() || request.hasParam("source");
}
}
Expand Up @@ -65,15 +65,9 @@ public RestTermVectorsAction(Settings settings, RestController controller, Clien
@Override
public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) throws Exception {
TermVectorsRequest termVectorsRequest = new TermVectorsRequest(request.param("index"), request.param("type"), request.param("id"));
XContentParser parser = null;
if (request.hasContent()) {
try {
parser = XContentFactory.xContent(request.content()).createParser(request.content());
if (RestActions.hasBodyContent(request)) {
try (XContentParser parser = XContentFactory.xContent(RestActions.guessBodyContentType(request)).createParser(RestActions.getRestContent(request))){
TermVectorsRequest.parseRequest(termVectorsRequest, parser);
} finally {
if (parser != null) {
parser.close();
}
}
}
readURIParameters(termVectorsRequest, request);
Expand Down

0 comments on commit 18fec52

Please sign in to comment.