From bbb82fef0fe7577e14410db170f4468cfb8a5d04 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 2 Apr 2018 12:39:50 -0400 Subject: [PATCH 01/20] Low level client --- .../elasticsearch/client/ClusterClient.java | 4 +- .../{Request.java => HighLevelRequests.java} | 44 +--- .../elasticsearch/client/IndicesClient.java | 90 ++++----- .../client/RestHighLevelClient.java | 66 +++--- ...Tests.java => HighLevelRequestsTests.java} | 189 ++++++++---------- .../client/RestHighLevelClientTests.java | 4 +- .../org/elasticsearch/client/Request.java | 144 +++++++++++++ .../org/elasticsearch/client/RestClient.java | 147 +++++++++++--- .../elasticsearch/client/RequestTests.java | 69 +++++++ .../elasticsearch/client/RestClientTests.java | 2 +- 10 files changed, 503 insertions(+), 256 deletions(-) rename client/rest-high-level/src/main/java/org/elasticsearch/client/{Request.java => HighLevelRequests.java} (97%) rename client/rest-high-level/src/test/java/org/elasticsearch/client/{RequestTests.java => HighLevelRequestsTests.java} (90%) create mode 100644 client/rest/src/main/java/org/elasticsearch/client/Request.java create mode 100644 client/rest/src/test/java/org/elasticsearch/client/RequestTests.java diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java index 177e33d727010..8a5728cf966fe 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java @@ -48,7 +48,7 @@ public final class ClusterClient { */ public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, Request::clusterPutSettings, + return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, HighLevelRequests::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, emptySet(), headers); } @@ -60,7 +60,7 @@ public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest cl */ public void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, Request::clusterPutSettings, + restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, HighLevelRequests::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, listener, emptySet(), headers); } } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java similarity index 97% rename from client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java rename to client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java index 802b1492be092..0c75e6ae6ab5c 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java @@ -86,49 +86,13 @@ import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.Objects; import java.util.StringJoiner; -public final class Request { - +final class HighLevelRequests { static final XContentType REQUEST_BODY_CONTENT_TYPE = XContentType.JSON; - private final String method; - private final String endpoint; - private final Map parameters; - private final HttpEntity entity; - - public Request(String method, String endpoint, Map parameters, HttpEntity entity) { - this.method = Objects.requireNonNull(method, "method cannot be null"); - this.endpoint = Objects.requireNonNull(endpoint, "endpoint cannot be null"); - this.parameters = Objects.requireNonNull(parameters, "parameters cannot be null"); - this.entity = entity; - } - - public String getMethod() { - return method; - } - - public String getEndpoint() { - return endpoint; - } - - public Map getParameters() { - return parameters; - } - - public HttpEntity getEntity() { - return entity; - } - - @Override - public String toString() { - return "Request{" + - "method='" + method + '\'' + - ", endpoint='" + endpoint + '\'' + - ", params=" + parameters + - ", hasBody=" + (entity != null) + - '}'; + private HighLevelRequests() { + // Contains only status utility methods } static Request delete(DeleteRequest deleteRequest) { @@ -385,7 +349,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { static Request exists(GetRequest getRequest) { Request request = get(getRequest); - return new Request(HttpHead.METHOD_NAME, request.endpoint, request.parameters, null); + return new Request(HttpHead.METHOD_NAME, request.getEndpoint(), request.getParameters(), null); } static Request get(GetRequest getRequest) { diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java index f5b46a6a53192..a49ce4488a1b9 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java @@ -72,8 +72,8 @@ public final class IndicesClient { * Delete Index API on elastic.co */ public DeleteIndexResponse delete(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(deleteIndexRequest, HighLevelRequests::deleteIndex, + DeleteIndexResponse::fromXContent, emptySet(), headers); } /** @@ -83,8 +83,8 @@ public DeleteIndexResponse delete(DeleteIndexRequest deleteIndexRequest, Header. * Delete Index API on elastic.co */ public void deleteAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(deleteIndexRequest, HighLevelRequests::deleteIndex, + DeleteIndexResponse::fromXContent, listener, emptySet(), headers); } /** @@ -94,8 +94,8 @@ public void deleteAsync(DeleteIndexRequest deleteIndexRequest, ActionListener */ public CreateIndexResponse create(CreateIndexRequest createIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(createIndexRequest, Request::createIndex, CreateIndexResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(createIndexRequest, HighLevelRequests::createIndex, + CreateIndexResponse::fromXContent, emptySet(), headers); } /** @@ -105,8 +105,8 @@ public CreateIndexResponse create(CreateIndexRequest createIndexRequest, Header. * Create Index API on elastic.co */ public void createAsync(CreateIndexRequest createIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(createIndexRequest, Request::createIndex, CreateIndexResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(createIndexRequest, HighLevelRequests::createIndex, + CreateIndexResponse::fromXContent, listener, emptySet(), headers); } /** @@ -116,8 +116,8 @@ public void createAsync(CreateIndexRequest createIndexRequest, ActionListener */ public PutMappingResponse putMapping(PutMappingRequest putMappingRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(putMappingRequest, Request::putMapping, PutMappingResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(putMappingRequest, HighLevelRequests::putMapping, + PutMappingResponse::fromXContent, emptySet(), headers); } /** @@ -128,8 +128,8 @@ public PutMappingResponse putMapping(PutMappingRequest putMappingRequest, Header */ public void putMappingAsync(PutMappingRequest putMappingRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(putMappingRequest, Request::putMapping, PutMappingResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(putMappingRequest, HighLevelRequests::putMapping, + PutMappingResponse::fromXContent, listener, emptySet(), headers); } /** @@ -140,7 +140,7 @@ public void putMappingAsync(PutMappingRequest putMappingRequest, ActionListener< * Index Aliases API on elastic.co */ public IndicesAliasesResponse updateAliases(IndicesAliasesRequest indicesAliasesRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(indicesAliasesRequest, Request::updateAliases, + return restHighLevelClient.performRequestAndParseEntity(indicesAliasesRequest, HighLevelRequests::updateAliases, IndicesAliasesResponse::fromXContent, emptySet(), headers); } @@ -153,7 +153,7 @@ public IndicesAliasesResponse updateAliases(IndicesAliasesRequest indicesAliases */ public void updateAliasesAsync(IndicesAliasesRequest indicesAliasesRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(indicesAliasesRequest, Request::updateAliases, + restHighLevelClient.performRequestAsyncAndParseEntity(indicesAliasesRequest, HighLevelRequests::updateAliases, IndicesAliasesResponse::fromXContent, listener, emptySet(), headers); } @@ -164,8 +164,8 @@ public void updateAliasesAsync(IndicesAliasesRequest indicesAliasesRequest, Acti * Open Index API on elastic.co */ public OpenIndexResponse open(OpenIndexRequest openIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(openIndexRequest, Request::openIndex, OpenIndexResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(openIndexRequest, HighLevelRequests::openIndex, + OpenIndexResponse::fromXContent, emptySet(), headers); } /** @@ -175,8 +175,8 @@ public OpenIndexResponse open(OpenIndexRequest openIndexRequest, Header... heade * Open Index API on elastic.co */ public void openAsync(OpenIndexRequest openIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(openIndexRequest, Request::openIndex, OpenIndexResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(openIndexRequest, HighLevelRequests::openIndex, + OpenIndexResponse::fromXContent, listener, emptySet(), headers); } /** @@ -186,8 +186,8 @@ public void openAsync(OpenIndexRequest openIndexRequest, ActionListener */ public CloseIndexResponse close(CloseIndexRequest closeIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(closeIndexRequest, Request::closeIndex, CloseIndexResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(closeIndexRequest, HighLevelRequests::closeIndex, + CloseIndexResponse::fromXContent, emptySet(), headers); } /** @@ -197,8 +197,8 @@ public CloseIndexResponse close(CloseIndexRequest closeIndexRequest, Header... h * Close Index API on elastic.co */ public void closeAsync(CloseIndexRequest closeIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(closeIndexRequest, Request::closeIndex, CloseIndexResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(closeIndexRequest, HighLevelRequests::closeIndex, + CloseIndexResponse::fromXContent, listener, emptySet(), headers); } /** @@ -208,8 +208,8 @@ public void closeAsync(CloseIndexRequest closeIndexRequest, ActionListener */ public boolean existsAlias(GetAliasesRequest getAliasesRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequest(getAliasesRequest, Request::existsAlias, RestHighLevelClient::convertExistsResponse, - emptySet(), headers); + return restHighLevelClient.performRequest(getAliasesRequest, HighLevelRequests::existsAlias, + RestHighLevelClient::convertExistsResponse, emptySet(), headers); } /** @@ -219,8 +219,8 @@ public boolean existsAlias(GetAliasesRequest getAliasesRequest, Header... header * Indices Aliases API on elastic.co */ public void existsAliasAsync(GetAliasesRequest getAliasesRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsync(getAliasesRequest, Request::existsAlias, RestHighLevelClient::convertExistsResponse, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsync(getAliasesRequest, HighLevelRequests::existsAlias, + RestHighLevelClient::convertExistsResponse, listener, emptySet(), headers); } /** @@ -229,7 +229,7 @@ public void existsAliasAsync(GetAliasesRequest getAliasesRequest, ActionListener * See Refresh API on elastic.co */ public RefreshResponse refresh(RefreshRequest refreshRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(refreshRequest, Request::refresh, RefreshResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(refreshRequest, HighLevelRequests::refresh, RefreshResponse::fromXContent, emptySet(), headers); } @@ -239,7 +239,7 @@ public RefreshResponse refresh(RefreshRequest refreshRequest, Header... headers) * See Refresh API on elastic.co */ public void refreshAsync(RefreshRequest refreshRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(refreshRequest, Request::refresh, RefreshResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(refreshRequest, HighLevelRequests::refresh, RefreshResponse::fromXContent, listener, emptySet(), headers); } @@ -249,7 +249,7 @@ public void refreshAsync(RefreshRequest refreshRequest, ActionListener Flush API on elastic.co */ public FlushResponse flush(FlushRequest flushRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(flushRequest, Request::flush, FlushResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(flushRequest, HighLevelRequests::flush, FlushResponse::fromXContent, emptySet(), headers); } @@ -259,7 +259,7 @@ public FlushResponse flush(FlushRequest flushRequest, Header... headers) throws * See Flush API on elastic.co */ public void flushAsync(FlushRequest flushRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(flushRequest, Request::flush, FlushResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(flushRequest, HighLevelRequests::flush, FlushResponse::fromXContent, listener, emptySet(), headers); } @@ -270,8 +270,8 @@ public void flushAsync(FlushRequest flushRequest, ActionListener * Force Merge API on elastic.co */ public ForceMergeResponse forceMerge(ForceMergeRequest forceMergeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(forceMergeRequest, Request::forceMerge, ForceMergeResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(forceMergeRequest, HighLevelRequests::forceMerge, + ForceMergeResponse::fromXContent, emptySet(), headers); } /** @@ -281,8 +281,8 @@ public ForceMergeResponse forceMerge(ForceMergeRequest forceMergeRequest, Header * Force Merge API on elastic.co */ public void forceMergeAsync(ForceMergeRequest forceMergeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(forceMergeRequest, Request::forceMerge, ForceMergeResponse::fromXContent, - listener, emptySet(), headers); + restHighLevelClient.performRequestAsyncAndParseEntity(forceMergeRequest, HighLevelRequests::forceMerge, + ForceMergeResponse::fromXContent, listener, emptySet(), headers); } /** @@ -292,7 +292,7 @@ public void forceMergeAsync(ForceMergeRequest forceMergeRequest, ActionListener< * Clear Cache API on elastic.co */ public ClearIndicesCacheResponse clearCache(ClearIndicesCacheRequest clearIndicesCacheRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(clearIndicesCacheRequest, Request::clearCache, + return restHighLevelClient.performRequestAndParseEntity(clearIndicesCacheRequest, HighLevelRequests::clearCache, ClearIndicesCacheResponse::fromXContent, emptySet(), headers); } @@ -304,7 +304,7 @@ public ClearIndicesCacheResponse clearCache(ClearIndicesCacheRequest clearIndice */ public void clearCacheAsync(ClearIndicesCacheRequest clearIndicesCacheRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(clearIndicesCacheRequest, Request::clearCache, + restHighLevelClient.performRequestAsyncAndParseEntity(clearIndicesCacheRequest, HighLevelRequests::clearCache, ClearIndicesCacheResponse::fromXContent, listener, emptySet(), headers); } @@ -317,7 +317,7 @@ public void clearCacheAsync(ClearIndicesCacheRequest clearIndicesCacheRequest, A public boolean exists(GetIndexRequest request, Header... headers) throws IOException { return restHighLevelClient.performRequest( request, - Request::indicesExist, + HighLevelRequests::indicesExist, RestHighLevelClient::convertExistsResponse, Collections.emptySet(), headers @@ -333,7 +333,7 @@ public boolean exists(GetIndexRequest request, Header... headers) throws IOExcep public void existsAsync(GetIndexRequest request, ActionListener listener, Header... headers) { restHighLevelClient.performRequestAsync( request, - Request::indicesExist, + HighLevelRequests::indicesExist, RestHighLevelClient::convertExistsResponse, listener, Collections.emptySet(), @@ -348,7 +348,7 @@ public void existsAsync(GetIndexRequest request, ActionListener listene * Shrink Index API on elastic.co */ public ResizeResponse shrink(ResizeRequest resizeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(resizeRequest, Request::shrink, ResizeResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(resizeRequest, HighLevelRequests::shrink, ResizeResponse::fromXContent, emptySet(), headers); } @@ -359,7 +359,7 @@ public ResizeResponse shrink(ResizeRequest resizeRequest, Header... headers) thr * Shrink Index API on elastic.co */ public void shrinkAsync(ResizeRequest resizeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, Request::shrink, ResizeResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, HighLevelRequests::shrink, ResizeResponse::fromXContent, listener, emptySet(), headers); } @@ -370,7 +370,7 @@ public void shrinkAsync(ResizeRequest resizeRequest, ActionListener */ public ResizeResponse split(ResizeRequest resizeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(resizeRequest, Request::split, ResizeResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(resizeRequest, HighLevelRequests::split, ResizeResponse::fromXContent, emptySet(), headers); } @@ -381,7 +381,7 @@ public ResizeResponse split(ResizeRequest resizeRequest, Header... headers) thro * Split Index API on elastic.co */ public void splitAsync(ResizeRequest resizeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, Request::split, ResizeResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, HighLevelRequests::split, ResizeResponse::fromXContent, listener, emptySet(), headers); } @@ -392,8 +392,8 @@ public void splitAsync(ResizeRequest resizeRequest, ActionListener */ public RolloverResponse rollover(RolloverRequest rolloverRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(rolloverRequest, Request::rollover, RolloverResponse::fromXContent, - emptySet(), headers); + return restHighLevelClient.performRequestAndParseEntity(rolloverRequest, HighLevelRequests::rollover, + RolloverResponse::fromXContent, emptySet(), headers); } /** @@ -403,7 +403,7 @@ public RolloverResponse rollover(RolloverRequest rolloverRequest, Header... head * Rollover Index API on elastic.co */ public void rolloverAsync(RolloverRequest rolloverRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(rolloverRequest, Request::rollover, RolloverResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(rolloverRequest, HighLevelRequests::rollover, RolloverResponse::fromXContent, listener, emptySet(), headers); } } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index bf80aa7720741..2655aa103510b 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -256,7 +256,7 @@ public final ClusterClient cluster() { * See Bulk API on elastic.co */ public final BulkResponse bulk(BulkRequest bulkRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(bulkRequest, Request::bulk, BulkResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(bulkRequest, HighLevelRequests::bulk, BulkResponse::fromXContent, emptySet(), headers); } /** @@ -265,14 +265,14 @@ public final BulkResponse bulk(BulkRequest bulkRequest, Header... headers) throw * See Bulk API on elastic.co */ public final void bulkAsync(BulkRequest bulkRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(bulkRequest, Request::bulk, BulkResponse::fromXContent, listener, emptySet(), headers); + performRequestAsyncAndParseEntity(bulkRequest, HighLevelRequests::bulk, BulkResponse::fromXContent, listener, emptySet(), headers); } /** * Pings the remote Elasticsearch cluster and returns true if the ping succeeded, false otherwise */ public final boolean ping(Header... headers) throws IOException { - return performRequest(new MainRequest(), (request) -> Request.ping(), RestHighLevelClient::convertExistsResponse, + return performRequest(new MainRequest(), (request) -> HighLevelRequests.ping(), RestHighLevelClient::convertExistsResponse, emptySet(), headers); } @@ -280,8 +280,8 @@ public final boolean ping(Header... headers) throws IOException { * Get the cluster info otherwise provided when sending an HTTP request to port 9200 */ public final MainResponse info(Header... headers) throws IOException { - return performRequestAndParseEntity(new MainRequest(), (request) -> Request.info(), MainResponse::fromXContent, emptySet(), - headers); + return performRequestAndParseEntity(new MainRequest(), (request) -> HighLevelRequests.info(), + MainResponse::fromXContent, emptySet(), headers); } /** @@ -290,7 +290,7 @@ public final MainResponse info(Header... headers) throws IOException { * See Get API on elastic.co */ public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(getRequest, Request::get, GetResponse::fromXContent, singleton(404), headers); + return performRequestAndParseEntity(getRequest, HighLevelRequests::get, GetResponse::fromXContent, singleton(404), headers); } /** @@ -299,7 +299,8 @@ public final GetResponse get(GetRequest getRequest, Header... headers) throws IO * See Get API on elastic.co */ public final void getAsync(GetRequest getRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(getRequest, Request::get, GetResponse::fromXContent, listener, singleton(404), headers); + performRequestAsyncAndParseEntity(getRequest, HighLevelRequests::get, GetResponse::fromXContent, listener, + singleton(404), headers); } /** @@ -308,7 +309,8 @@ public final void getAsync(GetRequest getRequest, ActionListener li * See Multi Get API on elastic.co */ public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(multiGetRequest, Request::multiGet, MultiGetResponse::fromXContent, singleton(404), headers); + return performRequestAndParseEntity(multiGetRequest, HighLevelRequests::multiGet, MultiGetResponse::fromXContent, + singleton(404), headers); } /** @@ -317,7 +319,7 @@ public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header.. * See Multi Get API on elastic.co */ public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(multiGetRequest, Request::multiGet, MultiGetResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(multiGetRequest, HighLevelRequests::multiGet, MultiGetResponse::fromXContent, listener, singleton(404), headers); } @@ -327,7 +329,7 @@ public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener< * See Get API on elastic.co */ public final boolean exists(GetRequest getRequest, Header... headers) throws IOException { - return performRequest(getRequest, Request::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers); + return performRequest(getRequest, HighLevelRequests::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers); } /** @@ -336,7 +338,8 @@ public final boolean exists(GetRequest getRequest, Header... headers) throws IOE * See Get API on elastic.co */ public final void existsAsync(GetRequest getRequest, ActionListener listener, Header... headers) { - performRequestAsync(getRequest, Request::exists, RestHighLevelClient::convertExistsResponse, listener, emptySet(), headers); + performRequestAsync(getRequest, HighLevelRequests::exists, RestHighLevelClient::convertExistsResponse, listener, + emptySet(), headers); } /** @@ -345,7 +348,7 @@ public final void existsAsync(GetRequest getRequest, ActionListener lis * See Index API on elastic.co */ public final IndexResponse index(IndexRequest indexRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(indexRequest, Request::index, IndexResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(indexRequest, HighLevelRequests::index, IndexResponse::fromXContent, emptySet(), headers); } /** @@ -354,7 +357,8 @@ public final IndexResponse index(IndexRequest indexRequest, Header... headers) t * See Index API on elastic.co */ public final void indexAsync(IndexRequest indexRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(indexRequest, Request::index, IndexResponse::fromXContent, listener, emptySet(), headers); + performRequestAsyncAndParseEntity(indexRequest, HighLevelRequests::index, IndexResponse::fromXContent, listener, + emptySet(), headers); } /** @@ -363,7 +367,7 @@ public final void indexAsync(IndexRequest indexRequest, ActionListenerUpdate API on elastic.co */ public final UpdateResponse update(UpdateRequest updateRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(updateRequest, Request::update, UpdateResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(updateRequest, HighLevelRequests::update, UpdateResponse::fromXContent, emptySet(), headers); } /** @@ -372,7 +376,8 @@ public final UpdateResponse update(UpdateRequest updateRequest, Header... header * See Update API on elastic.co */ public final void updateAsync(UpdateRequest updateRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(updateRequest, Request::update, UpdateResponse::fromXContent, listener, emptySet(), headers); + performRequestAsyncAndParseEntity(updateRequest, HighLevelRequests::update, UpdateResponse::fromXContent, listener, + emptySet(), headers); } /** @@ -381,8 +386,8 @@ public final void updateAsync(UpdateRequest updateRequest, ActionListenerDelete API on elastic.co */ public final DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(deleteRequest, Request::delete, DeleteResponse::fromXContent, Collections.singleton(404), - headers); + return performRequestAndParseEntity(deleteRequest, HighLevelRequests::delete, DeleteResponse::fromXContent, + singleton(404), headers); } /** @@ -391,7 +396,7 @@ public final DeleteResponse delete(DeleteRequest deleteRequest, Header... header * See Delete API on elastic.co */ public final void deleteAsync(DeleteRequest deleteRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(deleteRequest, Request::delete, DeleteResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(deleteRequest, HighLevelRequests::delete, DeleteResponse::fromXContent, listener, Collections.singleton(404), headers); } @@ -401,7 +406,7 @@ public final void deleteAsync(DeleteRequest deleteRequest, ActionListenerSearch API on elastic.co */ public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(searchRequest, HighLevelRequests::search, SearchResponse::fromXContent, emptySet(), headers); } /** @@ -410,7 +415,8 @@ public final SearchResponse search(SearchRequest searchRequest, Header... header * See Search API on elastic.co */ public final void searchAsync(SearchRequest searchRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchRequest, Request::search, SearchResponse::fromXContent, listener, emptySet(), headers); + performRequestAsyncAndParseEntity(searchRequest, HighLevelRequests::search, SearchResponse::fromXContent, listener, + emptySet(), headers); } /** @@ -420,7 +426,7 @@ public final void searchAsync(SearchRequest searchRequest, ActionListener */ public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(multiSearchRequest, Request::multiSearch, MultiSearchResponse::fromXContext, + return performRequestAndParseEntity(multiSearchRequest, HighLevelRequests::multiSearch, MultiSearchResponse::fromXContext, emptySet(), headers); } @@ -431,7 +437,7 @@ public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchReque * elastic.co */ public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchRequest, Request::multiSearch, MultiSearchResponse::fromXContext, listener, + performRequestAsyncAndParseEntity(searchRequest, HighLevelRequests::multiSearch, MultiSearchResponse::fromXContext, listener, emptySet(), headers); } @@ -442,7 +448,8 @@ public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListe * API on elastic.co */ public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(searchScrollRequest, Request::searchScroll, SearchResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(searchScrollRequest, HighLevelRequests::searchScroll, SearchResponse::fromXContent, + emptySet(), headers); } /** @@ -453,7 +460,7 @@ public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest */ public final void searchScrollAsync(SearchScrollRequest searchScrollRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchScrollRequest, Request::searchScroll, SearchResponse::fromXContent, + performRequestAsyncAndParseEntity(searchScrollRequest, HighLevelRequests::searchScroll, SearchResponse::fromXContent, listener, emptySet(), headers); } @@ -464,7 +471,7 @@ public final void searchScrollAsync(SearchScrollRequest searchScrollRequest, * Clear Scroll API on elastic.co */ public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(clearScrollRequest, Request::clearScroll, ClearScrollResponse::fromXContent, + return performRequestAndParseEntity(clearScrollRequest, HighLevelRequests::clearScroll, ClearScrollResponse::fromXContent, emptySet(), headers); } @@ -476,7 +483,7 @@ public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollReque */ public final void clearScrollAsync(ClearScrollRequest clearScrollRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(clearScrollRequest, Request::clearScroll, ClearScrollResponse::fromXContent, + performRequestAsyncAndParseEntity(clearScrollRequest, HighLevelRequests::clearScroll, ClearScrollResponse::fromXContent, listener, emptySet(), headers); } @@ -487,7 +494,8 @@ public final void clearScrollAsync(ClearScrollRequest clearScrollRequest, * on elastic.co */ public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(rankEvalRequest, Request::rankEval, RankEvalResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(rankEvalRequest, HighLevelRequests::rankEval, RankEvalResponse::fromXContent, + emptySet(), headers); } /** @@ -497,8 +505,8 @@ public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header.. * on elastic.co */ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(rankEvalRequest, Request::rankEval, RankEvalResponse::fromXContent, listener, emptySet(), - headers); + performRequestAsyncAndParseEntity(rankEvalRequest, HighLevelRequests::rankEval, RankEvalResponse::fromXContent, listener, + emptySet(), headers); } protected final Resp performRequestAndParseEntity(Req request, diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java similarity index 90% rename from client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java rename to client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java index 75ac543fbb4ce..2d27452c9c7b2 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java @@ -80,6 +80,8 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.client.HighLevelRequests.EndpointBuilder; +import org.elasticsearch.client.HighLevelRequests.Params; import org.elasticsearch.index.RandomCreateIndexGenerator; import org.elasticsearch.index.VersionType; import org.elasticsearch.index.query.TermQueryBuilder; @@ -118,8 +120,8 @@ import java.util.function.Supplier; import static java.util.Collections.singletonMap; -import static org.elasticsearch.client.Request.REQUEST_BODY_CONTENT_TYPE; -import static org.elasticsearch.client.Request.enforceSameContentType; +import static org.elasticsearch.client.HighLevelRequests.REQUEST_BODY_CONTENT_TYPE; +import static org.elasticsearch.client.HighLevelRequests.enforceSameContentType; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomAliases; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomCreateIndexRequest; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomIndexSettings; @@ -129,40 +131,9 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.nullValue; -public class RequestTests extends ESTestCase { - - public void testConstructor() { - final String method = randomFrom("GET", "PUT", "POST", "HEAD", "DELETE"); - final String endpoint = randomAlphaOfLengthBetween(1, 10); - final Map parameters = singletonMap(randomAlphaOfLength(5), randomAlphaOfLength(5)); - final HttpEntity entity = randomBoolean() ? new StringEntity(randomAlphaOfLengthBetween(1, 100), ContentType.TEXT_PLAIN) : null; - - NullPointerException e = expectThrows(NullPointerException.class, () -> new Request(null, endpoint, parameters, entity)); - assertEquals("method cannot be null", e.getMessage()); - - e = expectThrows(NullPointerException.class, () -> new Request(method, null, parameters, entity)); - assertEquals("endpoint cannot be null", e.getMessage()); - - e = expectThrows(NullPointerException.class, () -> new Request(method, endpoint, null, entity)); - assertEquals("parameters cannot be null", e.getMessage()); - - final Request request = new Request(method, endpoint, parameters, entity); - assertEquals(method, request.getMethod()); - assertEquals(endpoint, request.getEndpoint()); - assertEquals(parameters, request.getParameters()); - assertEquals(entity, request.getEntity()); - - final Constructor[] constructors = Request.class.getConstructors(); - assertEquals("Expected only 1 constructor", 1, constructors.length); - assertTrue("Request constructor is not public", Modifier.isPublic(constructors[0].getModifiers())); - } - - public void testClassVisibility() { - assertTrue("Request class is not public", Modifier.isPublic(Request.class.getModifiers())); - } - +public class HighLevelRequestsTests extends ESTestCase { public void testPing() { - Request request = Request.ping(); + Request request = HighLevelRequests.ping(); assertEquals("/", request.getEndpoint()); assertEquals(0, request.getParameters().size()); assertNull(request.getEntity()); @@ -170,7 +141,7 @@ public void testPing() { } public void testInfo() { - Request request = Request.info(); + Request request = HighLevelRequests.info(); assertEquals("/", request.getEndpoint()); assertEquals(0, request.getParameters().size()); assertNull(request.getEntity()); @@ -178,7 +149,7 @@ public void testInfo() { } public void testGet() { - getAndExistsTest(Request::get, HttpGet.METHOD_NAME); + getAndExistsTest(HighLevelRequests::get, HttpGet.METHOD_NAME); } public void testMultiGet() throws IOException { @@ -227,7 +198,7 @@ public void testMultiGet() throws IOException { multiGetRequest.add(item); } - Request request = Request.multiGet(multiGetRequest); + Request request = HighLevelRequests.multiGet(multiGetRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_mget", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); @@ -260,7 +231,7 @@ public void testDelete() { } } - Request request = Request.delete(deleteRequest); + Request request = HighLevelRequests.delete(deleteRequest); assertEquals("/" + index + "/" + type + "/" + id, request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); @@ -268,7 +239,7 @@ public void testDelete() { } public void testExists() { - getAndExistsTest(Request::exists, HttpHead.METHOD_NAME); + getAndExistsTest(HighLevelRequests::exists, HttpHead.METHOD_NAME); } public void testIndicesExist() { @@ -283,7 +254,7 @@ public void testIndicesExist() { setRandomHumanReadable(getIndexRequest, expectedParams); setRandomIncludeDefaults(getIndexRequest, expectedParams); - final Request request = Request.indicesExist(getIndexRequest); + final Request request = HighLevelRequests.indicesExist(getIndexRequest); assertEquals(HttpHead.METHOD_NAME, request.getMethod()); assertEquals("/" + String.join(",", indices), request.getEndpoint()); @@ -292,8 +263,8 @@ public void testIndicesExist() { } public void testIndicesExistEmptyIndices() { - expectThrows(IllegalArgumentException.class, () -> Request.indicesExist(new GetIndexRequest())); - expectThrows(IllegalArgumentException.class, () -> Request.indicesExist(new GetIndexRequest().indices((String[])null))); + expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.indicesExist(new GetIndexRequest())); + expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.indicesExist(new GetIndexRequest().indices((String[])null))); } private static void getAndExistsTest(Function requestConverter, String method) { @@ -362,7 +333,7 @@ public void testCreateIndex() throws IOException { setRandomMasterTimeout(createIndexRequest, expectedParams); setRandomWaitForActiveShards(createIndexRequest::waitForActiveShards, expectedParams); - Request request = Request.createIndex(createIndexRequest); + Request request = HighLevelRequests.createIndex(createIndexRequest); assertEquals("/" + createIndexRequest.index(), request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPut.METHOD_NAME, request.getMethod()); @@ -383,7 +354,7 @@ public void testUpdateAliases() throws IOException { setRandomTimeout(indicesAliasesRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); setRandomMasterTimeout(indicesAliasesRequest, expectedParams); - Request request = Request.updateAliases(indicesAliasesRequest); + Request request = HighLevelRequests.updateAliases(indicesAliasesRequest); assertEquals("/_aliases", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertToXContentBody(indicesAliasesRequest, request.getEntity()); @@ -403,7 +374,7 @@ public void testPutMapping() throws IOException { setRandomTimeout(putMappingRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); setRandomMasterTimeout(putMappingRequest, expectedParams); - Request request = Request.putMapping(putMappingRequest); + Request request = HighLevelRequests.putMapping(putMappingRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -428,7 +399,7 @@ public void testDeleteIndex() { setRandomIndicesOptions(deleteIndexRequest::indicesOptions, deleteIndexRequest::indicesOptions, expectedParams); - Request request = Request.deleteIndex(deleteIndexRequest); + Request request = HighLevelRequests.deleteIndex(deleteIndexRequest); assertEquals("/" + String.join(",", indices), request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); @@ -452,7 +423,7 @@ public void testOpenIndex() { setRandomIndicesOptions(openIndexRequest::indicesOptions, openIndexRequest::indicesOptions, expectedParams); setRandomWaitForActiveShards(openIndexRequest::waitForActiveShards, expectedParams); - Request request = Request.openIndex(openIndexRequest); + Request request = HighLevelRequests.openIndex(openIndexRequest); StringJoiner endpoint = new StringJoiner("/", "/", "").add(String.join(",", indices)).add("_open"); assertThat(endpoint.toString(), equalTo(request.getEndpoint())); assertThat(expectedParams, equalTo(request.getParameters())); @@ -475,7 +446,7 @@ public void testCloseIndex() { setRandomMasterTimeout(closeIndexRequest, expectedParams); setRandomIndicesOptions(closeIndexRequest::indicesOptions, closeIndexRequest::indicesOptions, expectedParams); - Request request = Request.closeIndex(closeIndexRequest); + Request request = HighLevelRequests.closeIndex(closeIndexRequest); StringJoiner endpoint = new StringJoiner("/", "/", "").add(String.join(",", indices)).add("_close"); assertThat(endpoint.toString(), equalTo(request.getEndpoint())); assertThat(expectedParams, equalTo(request.getParameters())); @@ -548,7 +519,7 @@ public void testIndex() throws IOException { indexRequest.source(builder); } - Request request = Request.index(indexRequest); + Request request = HighLevelRequests.index(indexRequest); if (indexRequest.opType() == DocWriteRequest.OpType.CREATE) { assertEquals("/" + index + "/" + type + "/" + id + "/_create", request.getEndpoint()); } else if (id != null) { @@ -578,7 +549,7 @@ public void testRefresh() { } Map expectedParams = new HashMap<>(); setRandomIndicesOptions(refreshRequest::indicesOptions, refreshRequest::indicesOptions, expectedParams); - Request request = Request.refresh(refreshRequest); + Request request = HighLevelRequests.refresh(refreshRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -610,7 +581,7 @@ public void testFlush() { } expectedParams.put("wait_if_ongoing", Boolean.toString(flushRequest.waitIfOngoing())); - Request request = Request.flush(flushRequest); + Request request = HighLevelRequests.flush(flushRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -647,7 +618,7 @@ public void testForceMerge() { } expectedParams.put("flush", Boolean.toString(forceMergeRequest.flush())); - Request request = Request.forceMerge(forceMergeRequest); + Request request = HighLevelRequests.forceMerge(forceMergeRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -687,7 +658,7 @@ public void testClearCache() { expectedParams.put("fields", String.join(",", clearIndicesCacheRequest.fields())); } - Request request = Request.clearCache(clearIndicesCacheRequest); + Request request = HighLevelRequests.clearCache(clearIndicesCacheRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -765,7 +736,7 @@ public void testUpdate() throws IOException { randomizeFetchSourceContextParams(updateRequest::fetchSource, expectedParams); } - Request request = Request.update(updateRequest); + Request request = HighLevelRequests.update(updateRequest); assertEquals("/" + index + "/" + type + "/" + id + "/_update", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); @@ -802,7 +773,7 @@ public void testUpdateWithDifferentContentTypes() { UpdateRequest updateRequest = new UpdateRequest(); updateRequest.doc(new IndexRequest().source(singletonMap("field", "doc"), XContentType.JSON)); updateRequest.upsert(new IndexRequest().source(singletonMap("field", "upsert"), XContentType.YAML)); - Request.update(updateRequest); + HighLevelRequests.update(updateRequest); }); assertEquals("Update request cannot have different content types for doc [JSON] and upsert [YAML] documents", exception.getMessage()); @@ -879,7 +850,7 @@ public void testBulk() throws IOException { bulkRequest.add(docWriteRequest); } - Request request = Request.bulk(bulkRequest); + Request request = HighLevelRequests.bulk(bulkRequest); assertEquals("/_bulk", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); @@ -935,7 +906,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new UpdateRequest("index", "type", "1").script(mockScript("test"))); bulkRequest.add(new DeleteRequest("index", "type", "2")); - Request request = Request.bulk(bulkRequest); + Request request = HighLevelRequests.bulk(bulkRequest); assertEquals(XContentType.JSON.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { @@ -945,7 +916,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new IndexRequest("index", "type", "0").source(singletonMap("field", "value"), xContentType)); bulkRequest.add(new DeleteRequest("index", "type", "2")); - Request request = Request.bulk(bulkRequest); + Request request = HighLevelRequests.bulk(bulkRequest); assertEquals(xContentType.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { @@ -957,14 +928,14 @@ public void testBulkWithDifferentContentTypes() throws IOException { updateRequest.upsert(new IndexRequest().source(singletonMap("field", "value"), xContentType)); } - Request request = Request.bulk(new BulkRequest().add(updateRequest)); + Request request = HighLevelRequests.bulk(new BulkRequest().add(updateRequest)); assertEquals(xContentType.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new IndexRequest("index", "type", "0").source(singletonMap("field", "value"), XContentType.SMILE)); bulkRequest.add(new IndexRequest("index", "type", "1").source(singletonMap("field", "value"), XContentType.JSON)); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> Request.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); assertEquals("Mismatching content-type found for request with content-type [JSON], " + "previous requests have content-type [SMILE]", exception.getMessage()); } @@ -978,7 +949,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { .doc(new IndexRequest().source(singletonMap("field", "value"), XContentType.JSON)) .upsert(new IndexRequest().source(singletonMap("field", "value"), XContentType.SMILE)) ); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> Request.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); assertEquals("Mismatching content-type found for request with content-type [SMILE], " + "previous requests have content-type [JSON]", exception.getMessage()); } @@ -991,7 +962,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new DeleteRequest("index", "type", "3")); bulkRequest.add(new IndexRequest("index", "type", "4").source(singletonMap("field", "value"), XContentType.JSON)); bulkRequest.add(new IndexRequest("index", "type", "1").source(singletonMap("field", "value"), xContentType)); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> Request.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); assertEquals("Unsupported content-type found for request with content-type [" + xContentType + "], only JSON and SMILE are supported", exception.getMessage()); } @@ -999,7 +970,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { public void testSearchNullSource() throws IOException { SearchRequest searchRequest = new SearchRequest(); - Request request = Request.search(searchRequest); + Request request = HighLevelRequests.search(searchRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_search", request.getEndpoint()); assertNull(request.getEntity()); @@ -1094,7 +1065,7 @@ public void testSearch() throws Exception { searchRequest.source(searchSourceBuilder); } - Request request = Request.search(searchRequest); + Request request = HighLevelRequests.search(searchRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -1148,7 +1119,7 @@ public void testMultiSearch() throws IOException { expectedParams.put("max_concurrent_searches", Integer.toString(multiSearchRequest.maxConcurrentSearchRequests())); } - Request request = Request.multiSearch(multiSearchRequest); + Request request = HighLevelRequests.multiSearch(multiSearchRequest); assertEquals("/_msearch", request.getEndpoint()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals(expectedParams, request.getParameters()); @@ -1173,7 +1144,7 @@ public void testSearchScroll() throws IOException { if (randomBoolean()) { searchScrollRequest.scroll(randomPositiveTimeValue()); } - Request request = Request.searchScroll(searchScrollRequest); + Request request = HighLevelRequests.searchScroll(searchScrollRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_search/scroll", request.getEndpoint()); assertEquals(0, request.getParameters().size()); @@ -1187,7 +1158,7 @@ public void testClearScroll() throws IOException { for (int i = 0; i < numScrolls; i++) { clearScrollRequest.addScrollId(randomAlphaOfLengthBetween(5, 10)); } - Request request = Request.clearScroll(clearScrollRequest); + Request request = HighLevelRequests.clearScroll(clearScrollRequest); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); assertEquals("/_search/scroll", request.getEndpoint()); assertEquals(0, request.getParameters().size()); @@ -1212,7 +1183,7 @@ public void testExistsAlias() { setRandomLocal(getAliasesRequest, expectedParams); setRandomIndicesOptions(getAliasesRequest::indicesOptions, getAliasesRequest::indicesOptions, expectedParams); - Request request = Request.existsAlias(getAliasesRequest); + Request request = HighLevelRequests.existsAlias(getAliasesRequest); StringJoiner expectedEndpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { expectedEndpoint.add(String.join(",", indices)); @@ -1230,13 +1201,15 @@ public void testExistsAlias() { public void testExistsAliasNoAliasNoIndex() { { GetAliasesRequest getAliasesRequest = new GetAliasesRequest(); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> Request.existsAlias(getAliasesRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> + HighLevelRequests.existsAlias(getAliasesRequest)); assertEquals("existsAlias requires at least an alias or an index", iae.getMessage()); } { GetAliasesRequest getAliasesRequest = new GetAliasesRequest((String[])null); getAliasesRequest.indices((String[])null); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> Request.existsAlias(getAliasesRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> + HighLevelRequests.existsAlias(getAliasesRequest)); assertEquals("existsAlias requires at least an alias or an index", iae.getMessage()); } } @@ -1248,7 +1221,7 @@ public void testRankEval() throws Exception { String[] indices = randomIndicesNames(0, 5); RankEvalRequest rankEvalRequest = new RankEvalRequest(spec, indices); - Request request = Request.rankEval(rankEvalRequest); + Request request = HighLevelRequests.rankEval(rankEvalRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -1261,25 +1234,25 @@ public void testRankEval() throws Exception { } public void testSplit() throws IOException { - resizeTest(ResizeType.SPLIT, Request::split); + resizeTest(ResizeType.SPLIT, HighLevelRequests::split); } public void testSplitWrongResizeType() { ResizeRequest resizeRequest = new ResizeRequest("target", "source"); resizeRequest.setResizeType(ResizeType.SHRINK); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> Request.split(resizeRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.split(resizeRequest)); assertEquals("Wrong resize type [SHRINK] for indices split request", iae.getMessage()); } public void testShrinkWrongResizeType() { ResizeRequest resizeRequest = new ResizeRequest("target", "source"); resizeRequest.setResizeType(ResizeType.SPLIT); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> Request.shrink(resizeRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.shrink(resizeRequest)); assertEquals("Wrong resize type [SPLIT] for indices shrink request", iae.getMessage()); } public void testShrink() throws IOException { - resizeTest(ResizeType.SHRINK, Request::shrink); + resizeTest(ResizeType.SHRINK, HighLevelRequests::shrink); } private static void resizeTest(ResizeType resizeType, CheckedFunction function) @@ -1319,7 +1292,7 @@ public void testClusterPutSettings() throws IOException { setRandomMasterTimeout(request, expectedParams); setRandomTimeout(request::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); - Request expectedRequest = Request.clusterPutSettings(request); + Request expectedRequest = HighLevelRequests.clusterPutSettings(request); assertEquals("/_cluster/settings", expectedRequest.getEndpoint()); assertEquals(HttpPut.METHOD_NAME, expectedRequest.getMethod()); assertEquals(expectedParams, expectedRequest.getParameters()); @@ -1352,7 +1325,7 @@ public void testRollover() throws IOException { } setRandomWaitForActiveShards(rolloverRequest.getCreateIndexRequest()::waitForActiveShards, expectedParams); - Request request = Request.rollover(rolloverRequest); + Request request = HighLevelRequests.rollover(rolloverRequest); if (rolloverRequest.getNewIndexName() == null) { assertEquals("/" + rolloverRequest.getAlias() + "/_rollover", request.getEndpoint()); } else { @@ -1371,7 +1344,7 @@ private static void assertToXContentBody(ToXContent expectedBody, HttpEntity act public void testParams() { final int nbParams = randomIntBetween(0, 10); - Request.Params params = Request.Params.builder(); + Params params = Params.builder(); Map expectedParams = new HashMap<>(); for (int i = 0; i < nbParams; i++) { String paramName = "p_" + i; @@ -1386,7 +1359,7 @@ public void testParams() { } public void testParamsNoDuplicates() { - Request.Params params = Request.Params.builder(); + Params params = Params.builder(); params.putParam("test", "1"); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> params.putParam("test", "2")); @@ -1399,113 +1372,113 @@ public void testParamsNoDuplicates() { public void testEndpointBuilder() { { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder(); + EndpointBuilder endpointBuilder = new EndpointBuilder(); assertEquals("/", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart(Strings.EMPTY_ARRAY); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart(Strings.EMPTY_ARRAY); assertEquals("/", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart(""); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart(""); assertEquals("/", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("a", "b"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("a", "b"); assertEquals("/a/b", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("a").addPathPart("b") + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("a").addPathPart("b") .addPathPartAsIs("_create"); assertEquals("/a/b/_create", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("a", "b", "c") + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("a", "b", "c") .addPathPartAsIs("_create"); assertEquals("/a/b/c/_create", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("a").addPathPartAsIs("_create"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("a").addPathPartAsIs("_create"); assertEquals("/a/_create", endpointBuilder.build()); } } public void testEndpointBuilderEncodeParts() { { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("-#index1,index#2", "type", "id"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("-#index1,index#2", "type", "id"); assertEquals("/-%23index1,index%232/type/id", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("index", "type#2", "id"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("index", "type#2", "id"); assertEquals("/index/type%232/id", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("index", "type", "this/is/the/id"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("index", "type", "this/is/the/id"); assertEquals("/index/type/this%2Fis%2Fthe%2Fid", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("index", "type", "this|is|the|id"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("index", "type", "this|is|the|id"); assertEquals("/index/type/this%7Cis%7Cthe%7Cid", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("index", "type", "id#1"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("index", "type", "id#1"); assertEquals("/index/type/id%231", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("", "_search"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("", "_search"); assertEquals("/%3Clogstash-%7Bnow%2FM%7D%3E/_search", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("中文"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("中文"); assertEquals("/中文", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("foo bar"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("foo bar"); assertEquals("/foo%20bar", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("foo+bar"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("foo+bar"); assertEquals("/foo+bar", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("foo+bar"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("foo+bar"); assertEquals("/foo+bar", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("foo/bar"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("foo/bar"); assertEquals("/foo%2Fbar", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("foo^bar"); + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("foo^bar"); assertEquals("/foo%5Ebar", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder().addPathPart("cluster1:index1,index2") + EndpointBuilder endpointBuilder = new EndpointBuilder().addPathPart("cluster1:index1,index2") .addPathPartAsIs("_search"); assertEquals("/cluster1:index1,index2/_search", endpointBuilder.build()); } { - Request.EndpointBuilder endpointBuilder = new Request.EndpointBuilder() + EndpointBuilder endpointBuilder = new EndpointBuilder() .addCommaSeparatedPathParts(new String[]{"index1", "index2"}).addPathPartAsIs("cache/clear"); assertEquals("/index1,index2/cache/clear", endpointBuilder.build()); } } public void testEndpoint() { - assertEquals("/index/type/id", Request.endpoint("index", "type", "id")); - assertEquals("/index/type/id/_endpoint", Request.endpoint("index", "type", "id", "_endpoint")); - assertEquals("/index1,index2", Request.endpoint(new String[]{"index1", "index2"})); - assertEquals("/index1,index2/_endpoint", Request.endpoint(new String[]{"index1", "index2"}, "_endpoint")); - assertEquals("/index1,index2/type1,type2/_endpoint", Request.endpoint(new String[]{"index1", "index2"}, + assertEquals("/index/type/id", HighLevelRequests.endpoint("index", "type", "id")); + assertEquals("/index/type/id/_endpoint", HighLevelRequests.endpoint("index", "type", "id", "_endpoint")); + assertEquals("/index1,index2", HighLevelRequests.endpoint(new String[]{"index1", "index2"})); + assertEquals("/index1,index2/_endpoint", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, "_endpoint")); + assertEquals("/index1,index2/type1,type2/_endpoint", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, new String[]{"type1", "type2"}, "_endpoint")); - assertEquals("/index1,index2/_endpoint/suffix1,suffix2", Request.endpoint(new String[]{"index1", "index2"}, + assertEquals("/index1,index2/_endpoint/suffix1,suffix2", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, "_endpoint", new String[]{"suffix1", "suffix2"})); } public void testCreateContentType() { final XContentType xContentType = randomFrom(XContentType.values()); - assertEquals(xContentType.mediaTypeWithoutParameters(), Request.createContentType(xContentType).getMimeType()); + assertEquals(xContentType.mediaTypeWithoutParameters(), HighLevelRequests.createContentType(xContentType).getMimeType()); } public void testEnforceSameContentType() { diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java index b8315bd59fa43..2ed1f38ea2b46 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java @@ -204,8 +204,8 @@ public void testClearScroll() throws IOException { private void mockResponse(ToXContent toXContent) throws IOException { Response response = mock(Response.class); - ContentType contentType = ContentType.parse(Request.REQUEST_BODY_CONTENT_TYPE.mediaType()); - String requestBody = toXContent(toXContent, Request.REQUEST_BODY_CONTENT_TYPE, false).utf8ToString(); + ContentType contentType = ContentType.parse(HighLevelRequests.REQUEST_BODY_CONTENT_TYPE.mediaType()); + String requestBody = toXContent(toXContent, HighLevelRequests.REQUEST_BODY_CONTENT_TYPE, false).utf8ToString(); when(response.getEntity()).thenReturn(new NStringEntity(requestBody, contentType)); when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), anyObject(), anyVararg())).thenReturn(response); diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java new file mode 100644 index 0000000000000..0de250f251c1c --- /dev/null +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -0,0 +1,144 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client; + +import org.apache.http.Header; +import org.apache.http.HttpEntity; + +import java.util.Collections; +import java.util.Map; +import java.util.Objects; + +public final class Request { + private final String method; + private final String endpoint; + + private Map parameters = Collections.emptyMap(); + private HttpEntity entity; + private Header[] headers; + private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory = + HttpAsyncResponseConsumerFactory.DEFAULT; + + public Request(String method, String endpoint, Map parameters, HttpEntity entity) { + this(method, endpoint); + this.parameters = Objects.requireNonNull(parameters, "parameters cannot be null"); + this.entity = entity; + // TODO drop this ctor + } + + /** + * Create the {@linkplain Request}. + * @param method the HTTP method + * @param endpoint the path of the request (without scheme, host, port, or prefix) + */ + public Request(String method, String endpoint) { + this.method = Objects.requireNonNull(method, "method cannot be null"); + this.endpoint = Objects.requireNonNull(endpoint, "endpoint cannot be null"); + } + + /** + * The HTTP method. + */ + public String getMethod() { + return method; + } + + /** + * The path of the request (without scheme, host, port, or prefix). + */ + public String getEndpoint() { + return endpoint; + } + + /** + * Set the query string parameters. Polite users will not manipulate the + * Map after setting it. + */ + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + /** + * Query string parameters. + */ + public Map getParameters() { + return parameters; + } + + /** + * Set the body of the request. If not set or set to {@code null} then no + * body is sent with the request. + */ + public void setEntity(HttpEntity entity) { + this.entity = entity; + } + + /** + * The body of the request. If {@code null} then no body + * is sent with the request. + */ + public HttpEntity getEntity() { + return entity; + } + + /** + * Set the headers to attach to the request. + */ + public void setHeaders(Header... headers) { + this.headers = headers; + } + + /** + * Headers to attach to the request. + */ + public Header[] getHeaders() { + return headers; + } + + /** + * set the {@link HttpAsyncResponseConsumerFactory} used to create one + * {@link HttpAsyncResponseConsumer} callback per retry. Controls how the + * response body gets streamed from a non-blocking HTTP connection on the + * client side. + */ + public void setHttpAsyncResponseConsumerFactory(HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory) { + this.httpAsyncResponseConsumerFactory = httpAsyncResponseConsumerFactory; + } + + /** + * The {@link HttpAsyncResponseConsumerFactory} used to create one + * {@link HttpAsyncResponseConsumer} callback per retry. Controls how the + * response body gets streamed from a non-blocking HTTP connection on the + * client side. + */ + public HttpAsyncResponseConsumerFactory getHttpAsyncResponseConsumerFactory() { + return httpAsyncResponseConsumerFactory; + } + + @Override + public String toString() { + return "Request{" + + "method='" + method + '\'' + + ", endpoint='" + endpoint + '\'' + + ", params=" + parameters + + ", hasBody=" + (entity != null) + + '}'; + } +} diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index 48349c3858938..3060c46af7ec0 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -143,6 +143,61 @@ public synchronized void setHosts(HttpHost... hosts) { this.blacklist.clear(); } + /** + * Sends a request to the Elasticsearch cluster that the client points to. + * Blocks until the request is completed and returns its response or fails + * by throwing an exception. Selects a host out of the provided ones in a + * round-robin fashion. Failing hosts are marked dead and retried after a + * certain amount of time (minimum 1 minute, maximum 30 minutes), depending + * on how many times they previously failed (the more failures, the later + * they will be retried). In case of failures all of the alive nodes (or + * dead nodes that deserve a retry) are retried until one responds or none + * of them does, in which case an {@link IOException} will be thrown. + * + * This method works by performing an asynchronous call and waiting + * for the result. If the asynchronous call throws an exception we wrap + * it and rethrow it so that the stack trace attached to the exception + * contains the call site. While we attempt to preserve the original + * exception this isn't always possible and likely haven't covered all of + * the cases. You can get the original exception from + * {@link Exception#getCause()}. + * + * @param request the request to perform + * @return the response returned by Elasticsearch + * @throws IOException in case of a problem or the connection was aborted + * @throws ClientProtocolException in case of an http protocol error + * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error + */ + public Response performRequest(Request request) throws IOException { + SyncResponseListener listener = new SyncResponseListener(maxRetryTimeoutMillis); + performRequestAsyncNoCatch(request, listener); + return listener.get(); + } + + /** + * Sends a request to the Elasticsearch cluster that the client points to. + * The request is executed asynchronously and the provided + * {@link ResponseListener} gets notified upon request completion or + * failure. Selects a host out of the provided ones in a round-robin + * fashion. Failing hosts are marked dead and retried after a certain + * amount of time (minimum 1 minute, maximum 30 minutes), depending on how + * many times they previously failed (the more failures, the later they + * will be retried). In case of failures all of the alive nodes (or dead + * nodes that deserve a retry) are retried until one responds or none of + * them does, in which case an {@link IOException} will be thrown. + * + * @param request the request to perform + * @param responseListener the {@link ResponseListener} to notify when the + * request is completed or fails + */ + public void performRequestAsync(Request request, ResponseListener responseListener) { + try { + performRequestAsyncNoCatch(request, responseListener); + } catch (Exception e) { + responseListener.onFailure(e); + } + } + /** * Sends a request to the Elasticsearch cluster that the client points to and waits for the corresponding response * to be returned. Shortcut to {@link #performRequest(String, String, Map, HttpEntity, Header...)} but without parameters @@ -155,9 +210,13 @@ public synchronized void setHosts(HttpHost... hosts) { * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error + * @deprecated Prefer {@link #performRequest(Request)} */ + @Deprecated public Response performRequest(String method, String endpoint, Header... headers) throws IOException { - return performRequest(method, endpoint, Collections.emptyMap(), null, headers); + Request request = new Request(method, endpoint); + request.setHeaders(headers); + return performRequest(request); } /** @@ -172,9 +231,14 @@ public Response performRequest(String method, String endpoint, Header... headers * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error + * @deprecated Prefer {@link #performRequest(Request)} */ + @Deprecated public Response performRequest(String method, String endpoint, Map params, Header... headers) throws IOException { - return performRequest(method, endpoint, params, (HttpEntity)null, headers); + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setHeaders(headers); + return performRequest(request); } /** @@ -192,10 +256,16 @@ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, Header... headers) throws IOException { - return performRequest(method, endpoint, params, entity, HttpAsyncResponseConsumerFactory.DEFAULT, headers); + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHeaders(headers); + return performRequest(request); } /** @@ -225,14 +295,18 @@ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, Header... headers) throws IOException { - SyncResponseListener listener = new SyncResponseListener(maxRetryTimeoutMillis); - performRequestAsyncNoCatch(method, endpoint, params, entity, httpAsyncResponseConsumerFactory, - listener, headers); - return listener.get(); + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHttpAsyncResponseConsumerFactory(httpAsyncResponseConsumerFactory); + request.setHeaders(headers); + return performRequest(request); } /** @@ -244,9 +318,13 @@ public Response performRequest(String method, String endpoint, MapemptyMap(), null, responseListener, headers); + Request request = new Request(method, endpoint); + request.setHeaders(headers); + performRequestAsync(request, responseListener); } /** @@ -259,10 +337,15 @@ public void performRequestAsync(String method, String endpoint, ResponseListener * @param params the query_string parameters * @param responseListener the {@link ResponseListener} to notify when the request is completed or fails * @param headers the optional request headers + * @deprecated Prefere {@link #performRequestAsync(Request, ResponseListener)} */ + @Deprecated public void performRequestAsync(String method, String endpoint, Map params, ResponseListener responseListener, Header... headers) { - performRequestAsync(method, endpoint, params, null, responseListener, headers); + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setHeaders(headers); + performRequestAsync(request, responseListener); } /** @@ -278,10 +361,16 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, ResponseListener responseListener, Header... headers) { - performRequestAsync(method, endpoint, params, entity, HttpAsyncResponseConsumerFactory.DEFAULT, responseListener, headers); + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHeaders(headers); + performRequestAsync(request, responseListener); } /** @@ -301,28 +390,28 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, ResponseListener responseListener, Header... headers) { - try { - performRequestAsyncNoCatch(method, endpoint, params, entity, httpAsyncResponseConsumerFactory, - responseListener, headers); - } catch (Exception e) { - responseListener.onFailure(e); - } + Request request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHttpAsyncResponseConsumerFactory(httpAsyncResponseConsumerFactory); + request.setHeaders(headers); + performRequestAsync(request, responseListener); } - void performRequestAsyncNoCatch(String method, String endpoint, Map params, - HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, - ResponseListener responseListener, Header... headers) { - Objects.requireNonNull(params, "params must not be null"); - Map requestParams = new HashMap<>(params); + void performRequestAsyncNoCatch(Request request, ResponseListener listener) { + Objects.requireNonNull(request.getParameters(), "params must not be null"); + Map requestParams = new HashMap<>(request.getParameters()); //ignore is a special parameter supported by the clients, shouldn't be sent to es String ignoreString = requestParams.remove("ignore"); Set ignoreErrorCodes; if (ignoreString == null) { - if (HttpHead.METHOD_NAME.equals(method)) { + if (HttpHead.METHOD_NAME.equals(request.getMethod())) { //404 never causes error if returned for a HEAD request ignoreErrorCodes = Collections.singleton(404); } else { @@ -331,7 +420,7 @@ void performRequestAsyncNoCatch(String method, String endpoint, Map(); - if (HttpHead.METHOD_NAME.equals(method)) { + if (HttpHead.METHOD_NAME.equals(request.getMethod())) { //404 never causes error if returned for a HEAD request ignoreErrorCodes.add(404); } @@ -343,13 +432,13 @@ void performRequestAsyncNoCatch(String method, String endpoint, Map> hostTuple, final HttpRequestBase request, diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java new file mode 100644 index 0000000000000..86d1bf1a50b2e --- /dev/null +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java @@ -0,0 +1,69 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.client; + +import static java.util.Collections.singletonMap; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.util.Map; + +import org.apache.http.HttpEntity; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; + +public class RequestTests extends RestClientTestCase { + + public void testConstructor() { + final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); + final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); + final Map parameters = singletonMap(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5)); + final HttpEntity entity = + randomBoolean() ? new StringEntity(randomAsciiLettersOfLengthBetween(1, 100), ContentType.TEXT_PLAIN) : null; + + try { + new Request(null, endpoint, parameters, entity); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("method cannot be null", e.getMessage()); + } + + try { + new Request(method, null, parameters, entity); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("endpoint cannot be null", e.getMessage()); + } + + try { + new Request(method, endpoint, null, entity); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("parameters cannot be null", e.getMessage()); + } + + final Request request = new Request(method, endpoint, parameters, entity); + assertEquals(method, request.getMethod()); + assertEquals(endpoint, request.getEndpoint()); + assertEquals(parameters, request.getParameters()); + assertEquals(entity, request.getEntity()); + } + +} diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java index ee6dbf449bd56..ba119e0d8b236 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java @@ -182,7 +182,7 @@ public void testNullPath() throws IOException { restClient.performRequest(method, null); fail("path set to null should fail!"); } catch (NullPointerException e) { - assertEquals("path must not be null", e.getMessage()); + assertEquals("endpoint cannot be null", e.getMessage()); } } } From 1cf984ffd2d372b77d9b4e8ebd6ad0be1193d512 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 2 Apr 2018 13:24:52 -0400 Subject: [PATCH 02/20] WIP --- .../client/RestHighLevelClient.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 2655aa103510b..73b8fb92ff3e8 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -162,6 +162,7 @@ import java.util.Objects; import java.util.ServiceLoader; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -361,6 +362,24 @@ public final void indexAsync(IndexRequest indexRequest, ActionListener + * See Update API on elastic.co + */ + public final UpdateResponse update(UpdateRequest updateRequest) throws IOException { + return update(updateRequest, (Consumer) null); + } + + /** + * Updates a document using the Update API + *

+ * See Update API on elastic.co + */ + public final UpdateResponse update(UpdateRequest updateRequest, Consumer customizer) throws IOException { + return performRequestAndParseEntity(updateRequest, HighLevelRequests::update, customizer, UpdateResponse::fromXContent, emptySet()); + } + /** * Updates a document using the Update API *

@@ -509,6 +528,16 @@ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener< emptySet(), headers); } + protected final Resp performRequestAndParseEntity(Req request, + CheckedFunction requestConverter, Consumer requestCustomizer, + CheckedFunction entityParser, Set ignores) throws IOException { + return performRequest(request, requestConverter, requestCustomizer, (response) -> parseEntity(response.getEntity(), entityParser), ignores); + } + + /** + * @deprecated Prefer {@link #performRequestAndParseEntity(ActionRequest, CheckedFunction, Consumer, CheckedFunction, Set)} + */ + @Deprecated protected final Resp performRequestAndParseEntity(Req request, CheckedFunction requestConverter, CheckedFunction entityParser, @@ -516,18 +545,31 @@ protected final Resp performRequestAndParseEnt return performRequest(request, requestConverter, (response) -> parseEntity(response.getEntity(), entityParser), ignores, headers); } + /** + * @deprecated Prefer {@link #performRequest(ActionRequest, CheckedFunction, Consumer, CheckedFunction, Set)} + */ + @Deprecated protected final Resp performRequest(Req request, CheckedFunction requestConverter, CheckedFunction responseConverter, Set ignores, Header... headers) throws IOException { + Consumer requestCustomizer = r -> r.setHeaders(headers); + return performRequest(request, requestConverter, requestCustomizer, responseConverter, ignores); + } + + protected final Resp performRequest(Req request, + CheckedFunction requestConverter, Consumer requestCustomizer, + CheckedFunction responseConverter, + Set ignores) throws IOException { ActionRequestValidationException validationException = request.validate(); if (validationException != null) { throw validationException; } Request req = requestConverter.apply(request); + requestCustomizer.accept(req); Response response; try { - response = client.performRequest(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), headers); + response = client.performRequest(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), req.getHeaders()); } catch (ResponseException e) { if (ignores.contains(e.getResponse().getStatusLine().getStatusCode())) { try { From 10987311b1b4d25ca369cfc6e1a6065f6cacfd31 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Tue, 3 Apr 2018 11:40:31 -0400 Subject: [PATCH 03/20] Revert "WIP" This reverts commit 1cf984ffd2d372b77d9b4e8ebd6ad0be1193d512. --- .../client/RestHighLevelClient.java | 44 +------------------ 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 73b8fb92ff3e8..2655aa103510b 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -162,7 +162,6 @@ import java.util.Objects; import java.util.ServiceLoader; import java.util.Set; -import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -362,24 +361,6 @@ public final void indexAsync(IndexRequest indexRequest, ActionListener - * See Update API on elastic.co - */ - public final UpdateResponse update(UpdateRequest updateRequest) throws IOException { - return update(updateRequest, (Consumer) null); - } - - /** - * Updates a document using the Update API - *

- * See Update API on elastic.co - */ - public final UpdateResponse update(UpdateRequest updateRequest, Consumer customizer) throws IOException { - return performRequestAndParseEntity(updateRequest, HighLevelRequests::update, customizer, UpdateResponse::fromXContent, emptySet()); - } - /** * Updates a document using the Update API *

@@ -528,16 +509,6 @@ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener< emptySet(), headers); } - protected final Resp performRequestAndParseEntity(Req request, - CheckedFunction requestConverter, Consumer requestCustomizer, - CheckedFunction entityParser, Set ignores) throws IOException { - return performRequest(request, requestConverter, requestCustomizer, (response) -> parseEntity(response.getEntity(), entityParser), ignores); - } - - /** - * @deprecated Prefer {@link #performRequestAndParseEntity(ActionRequest, CheckedFunction, Consumer, CheckedFunction, Set)} - */ - @Deprecated protected final Resp performRequestAndParseEntity(Req request, CheckedFunction requestConverter, CheckedFunction entityParser, @@ -545,31 +516,18 @@ protected final Resp performRequestAndParseEnt return performRequest(request, requestConverter, (response) -> parseEntity(response.getEntity(), entityParser), ignores, headers); } - /** - * @deprecated Prefer {@link #performRequest(ActionRequest, CheckedFunction, Consumer, CheckedFunction, Set)} - */ - @Deprecated protected final Resp performRequest(Req request, CheckedFunction requestConverter, CheckedFunction responseConverter, Set ignores, Header... headers) throws IOException { - Consumer requestCustomizer = r -> r.setHeaders(headers); - return performRequest(request, requestConverter, requestCustomizer, responseConverter, ignores); - } - - protected final Resp performRequest(Req request, - CheckedFunction requestConverter, Consumer requestCustomizer, - CheckedFunction responseConverter, - Set ignores) throws IOException { ActionRequestValidationException validationException = request.validate(); if (validationException != null) { throw validationException; } Request req = requestConverter.apply(request); - requestCustomizer.accept(req); Response response; try { - response = client.performRequest(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), req.getHeaders()); + response = client.performRequest(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), headers); } catch (ResponseException e) { if (ignores.contains(e.getResponse().getStatusLine().getStatusCode())) { try { From fa4f20468d83667852c5f78932f730ac3da04993 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 19 Apr 2018 11:22:02 -0400 Subject: [PATCH 04/20] Update --- .../src/main/java/org/elasticsearch/client/IndicesClient.java | 4 ++-- .../java/org/elasticsearch/client/HighLevelRequestsTests.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java index e0f966bea5a8b..82ce1a7128d40 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java @@ -416,7 +416,7 @@ public void rolloverAsync(RolloverRequest rolloverRequest, ActionListener */ public UpdateSettingsResponse putSettings(UpdateSettingsRequest updateSettingsRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(updateSettingsRequest, Request::indexPutSettings, + return restHighLevelClient.performRequestAndParseEntity(updateSettingsRequest, HighLevelRequests::indexPutSettings, UpdateSettingsResponse::fromXContent, emptySet(), headers); } @@ -428,7 +428,7 @@ public UpdateSettingsResponse putSettings(UpdateSettingsRequest updateSettingsRe */ public void putSettingsAsync(UpdateSettingsRequest updateSettingsRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(updateSettingsRequest, Request::indexPutSettings, + restHighLevelClient.performRequestAsyncAndParseEntity(updateSettingsRequest, HighLevelRequests::indexPutSettings, UpdateSettingsResponse::fromXContent, listener, emptySet(), headers); } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java index 678d2ed9c95b1..e4b171fa318e4 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java @@ -1325,7 +1325,7 @@ public void testIndexPutSettings() throws IOException { } } - Request request = Request.indexPutSettings(updateSettingsRequest); + Request request = HighLevelRequests.indexPutSettings(updateSettingsRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); From 16191b3330d7b89e8faac161c7439903a5d09b67 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 19 Apr 2018 13:03:48 -0400 Subject: [PATCH 05/20] Remove deprecateds --- .../org/elasticsearch/client/Request.java | 16 ++-- .../org/elasticsearch/client/RestClient.java | 54 ++++++++---- .../elasticsearch/client/RequestTests.java | 72 ++++++++++++--- .../client/RestClientSingleHostTests.java | 87 +++++++++++-------- .../elasticsearch/client/RestClientTests.java | 68 ++++++++++++++- 5 files changed, 221 insertions(+), 76 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 0de250f251c1c..539611438fe09 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -26,6 +26,9 @@ import java.util.Map; import java.util.Objects; +/** + * Request to Elasticsearch. + */ public final class Request { private final String method; private final String endpoint; @@ -36,13 +39,6 @@ public final class Request { private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory = HttpAsyncResponseConsumerFactory.DEFAULT; - public Request(String method, String endpoint, Map parameters, HttpEntity entity) { - this(method, endpoint); - this.parameters = Objects.requireNonNull(parameters, "parameters cannot be null"); - this.entity = entity; - // TODO drop this ctor - } - /** * Create the {@linkplain Request}. * @param method the HTTP method @@ -72,7 +68,7 @@ public String getEndpoint() { * Map after setting it. */ public void setParameters(Map parameters) { - this.parameters = parameters; + this.parameters = Objects.requireNonNull(parameters, "parameters cannot be null");; } /** @@ -102,6 +98,10 @@ public HttpEntity getEntity() { * Set the headers to attach to the request. */ public void setHeaders(Header... headers) { + Objects.requireNonNull(headers, "headers cannot be null"); + for (Header header : headers) { + Objects.requireNonNull(header, "header cannot be null"); + } this.headers = headers; } diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index 3060c46af7ec0..805baf8051285 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -322,8 +322,14 @@ public Response performRequest(String method, String endpoint, Map params, ResponseListener responseListener, Header... headers) { - Request request = new Request(method, endpoint); - request.setParameters(params); - request.setHeaders(headers); + Request request; + try { + request = new Request(method, endpoint); + request.setParameters(params); + request.setHeaders(headers); + } catch (Exception e) { + responseListener.onFailure(e); + return; + } performRequestAsync(request, responseListener); } @@ -366,10 +378,16 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, ResponseListener responseListener, Header... headers) { - Request request = new Request(method, endpoint); - request.setParameters(params); - request.setEntity(entity); - request.setHeaders(headers); + Request request; + try { + request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHeaders(headers); + } catch (Exception e) { + responseListener.onFailure(e); + return; + } performRequestAsync(request, responseListener); } @@ -396,11 +414,17 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, ResponseListener responseListener, Header... headers) { - Request request = new Request(method, endpoint); - request.setParameters(params); - request.setEntity(entity); - request.setHttpAsyncResponseConsumerFactory(httpAsyncResponseConsumerFactory); - request.setHeaders(headers); + Request request; + try { + request = new Request(method, endpoint); + request.setParameters(params); + request.setEntity(entity); + request.setHttpAsyncResponseConsumerFactory(httpAsyncResponseConsumerFactory); + request.setHeaders(headers); + } catch (Exception e) { + responseListener.onFailure(e); + return; + } performRequestAsync(request, responseListener); } @@ -517,11 +541,9 @@ public void cancelled() { } private void setHeaders(HttpRequest httpRequest, Header[] requestHeaders) { - Objects.requireNonNull(requestHeaders, "request headers must not be null"); // request headers override default headers, so we don't add default headers if they exist as request headers final Set requestNames = new HashSet<>(requestHeaders.length); for (Header requestHeader : requestHeaders) { - Objects.requireNonNull(requestHeader, "request header must not be null"); httpRequest.addHeader(requestHeader); requestNames.add(requestHeader.getName()); } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java index 86d1bf1a50b2e..f24e40cadeb65 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java @@ -19,51 +19,95 @@ package org.elasticsearch.client; -import static java.util.Collections.singletonMap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; - import java.util.Map; +import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; +import org.apache.http.message.BasicHeader; -public class RequestTests extends RestClientTestCase { +import static java.util.Collections.singletonMap; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +public class RequestTests extends RestClientTestCase { public void testConstructor() { final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); - final Map parameters = singletonMap(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5)); - final HttpEntity entity = - randomBoolean() ? new StringEntity(randomAsciiLettersOfLengthBetween(1, 100), ContentType.TEXT_PLAIN) : null; try { - new Request(null, endpoint, parameters, entity); + new Request(null, endpoint); fail("expected failure"); } catch (NullPointerException e) { assertEquals("method cannot be null", e.getMessage()); } try { - new Request(method, null, parameters, entity); + new Request(method, null); fail("expected failure"); } catch (NullPointerException e) { assertEquals("endpoint cannot be null", e.getMessage()); } + final Request request = new Request(method, endpoint); + assertEquals(method, request.getMethod()); + assertEquals(endpoint, request.getEndpoint()); + } + + public void testSetParameters() { + final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); + final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); + final Map parameters = singletonMap(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5)); + + Request request = new Request(method, endpoint); try { - new Request(method, endpoint, null, entity); + request.setParameters(null); fail("expected failure"); } catch (NullPointerException e) { assertEquals("parameters cannot be null", e.getMessage()); } - final Request request = new Request(method, endpoint, parameters, entity); - assertEquals(method, request.getMethod()); - assertEquals(endpoint, request.getEndpoint()); + request.setParameters(parameters); assertEquals(parameters, request.getParameters()); + } + + public void testSetEntity() { + final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); + final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); + final HttpEntity entity = + randomBoolean() ? new StringEntity(randomAsciiLettersOfLengthBetween(1, 100), ContentType.TEXT_PLAIN) : null; + Request request = new Request(method, endpoint); + + request.setEntity(entity); assertEquals(entity, request.getEntity()); } + public void testSetHeaders() { + final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); + final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); + Request request = new Request(method, endpoint); + + try { + request.setHeaders((Header[]) null); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("headers cannot be null", e.getMessage()); + } + + try { + request.setHeaders(new Header [] {null}); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("header cannot be null", e.getMessage()); + } + + Header[] headers = new Header[between(0, 5)]; + for (int i = 0; i < headers.length; i++) { + headers[i] = new BasicHeader(randomAsciiAlphanumOfLength(3), randomAsciiAlphanumOfLength(3)); + } + request.setHeaders(headers); + assertArrayEquals(headers, request.getHeaders()); + } } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java index 7786eefb97f01..9b69c41ca7392 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java @@ -280,13 +280,17 @@ public void testBody() throws IOException { StringEntity entity = new StringEntity(body, ContentType.APPLICATION_JSON); for (String method : Arrays.asList("DELETE", "GET", "PATCH", "POST", "PUT")) { for (int okStatusCode : getOkStatusCodes()) { - Response response = restClient.performRequest(method, "/" + okStatusCode, Collections.emptyMap(), entity); + Request request = new Request(method, "/" + okStatusCode); + request.setEntity(entity); + Response response = restClient.performRequest(request); assertThat(response.getStatusLine().getStatusCode(), equalTo(okStatusCode)); assertThat(EntityUtils.toString(response.getEntity()), equalTo(body)); } for (int errorStatusCode : getAllErrorStatusCodes()) { + Request request = new Request(method, "/" + errorStatusCode); + request.setEntity(entity); try { - restClient.performRequest(method, "/" + errorStatusCode, Collections.emptyMap(), entity); + restClient.performRequest(request); fail("request should have failed"); } catch(ResponseException e) { Response response = e.getResponse(); @@ -297,8 +301,10 @@ public void testBody() throws IOException { } } for (String method : Arrays.asList("HEAD", "OPTIONS", "TRACE")) { + Request request = new Request(method, "/" + randomStatusCode(getRandom())); + request.setEntity(entity); try { - restClient.performRequest(method, "/" + randomStatusCode(getRandom()), Collections.emptyMap(), entity); + restClient.performRequest(request); fail("request should have failed"); } catch(UnsupportedOperationException e) { assertThat(e.getMessage(), equalTo(method + " with body is not supported")); @@ -306,7 +312,11 @@ public void testBody() throws IOException { } } - public void testNullHeaders() throws IOException { + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testSetHeaders()}. + */ + @Deprecated + public void tesPerformRequestOldStyleNullHeaders() throws IOException { String method = randomHttpMethod(getRandom()); int statusCode = randomStatusCode(getRandom()); try { @@ -323,7 +333,11 @@ public void testNullHeaders() throws IOException { } } - public void testNullParams() throws IOException { + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testSetParameters()}. + */ + @Deprecated + public void testPerformRequestNullParams() throws IOException { String method = randomHttpMethod(getRandom()); int statusCode = randomStatusCode(getRandom()); try { @@ -348,9 +362,11 @@ public void testHeaders() throws IOException { for (String method : getHttpMethods()) { final Header[] requestHeaders = RestClientTestUtil.randomHeaders(getRandom(), "Header"); final int statusCode = randomStatusCode(getRandom()); + Request request = new Request(method, "/" + statusCode); + request.setHeaders(requestHeaders); Response esResponse; try { - esResponse = restClient.performRequest(method, "/" + statusCode, requestHeaders); + esResponse = restClient.performRequest(request); } catch(ResponseException e) { esResponse = e.getResponse(); } @@ -361,14 +377,15 @@ public void testHeaders() throws IOException { private HttpUriRequest performRandomRequest(String method) throws Exception { String uriAsString = "/" + randomStatusCode(getRandom()); + Request request = new Request(method, uriAsString); URIBuilder uriBuilder = new URIBuilder(uriAsString); - final Map params = new HashMap<>(); + Map params = new HashMap<>(); boolean hasParams = randomBoolean(); if (hasParams) { int numParams = randomIntBetween(1, 3); for (int i = 0; i < numParams; i++) { String paramKey = "param-" + i; - String paramValue = randomAsciiOfLengthBetween(3, 10); + String paramValue = randomAsciiAlphanumOfLengthBetween(3, 10); params.put(paramKey, paramValue); uriBuilder.addParameter(paramKey, paramValue); } @@ -381,79 +398,81 @@ private HttpUriRequest performRandomRequest(String method) throws Exception { } params.put("ignore", ignore); } + request.setParameters(params); URI uri = uriBuilder.build(); - HttpUriRequest request; + HttpUriRequest expectedRequest; switch(method) { case "DELETE": - request = new HttpDeleteWithEntity(uri); + expectedRequest = new HttpDeleteWithEntity(uri); break; case "GET": - request = new HttpGetWithEntity(uri); + expectedRequest = new HttpGetWithEntity(uri); break; case "HEAD": - request = new HttpHead(uri); + expectedRequest = new HttpHead(uri); break; case "OPTIONS": - request = new HttpOptions(uri); + expectedRequest = new HttpOptions(uri); break; case "PATCH": - request = new HttpPatch(uri); + expectedRequest = new HttpPatch(uri); break; case "POST": - request = new HttpPost(uri); + expectedRequest = new HttpPost(uri); break; case "PUT": - request = new HttpPut(uri); + expectedRequest = new HttpPut(uri); break; case "TRACE": - request = new HttpTrace(uri); + expectedRequest = new HttpTrace(uri); break; default: throw new UnsupportedOperationException("method not supported: " + method); } - HttpEntity entity = null; - boolean hasBody = request instanceof HttpEntityEnclosingRequest && getRandom().nextBoolean(); - if (hasBody) { - entity = new StringEntity(randomAsciiOfLengthBetween(10, 100), ContentType.APPLICATION_JSON); - ((HttpEntityEnclosingRequest) request).setEntity(entity); + if (expectedRequest instanceof HttpEntityEnclosingRequest && getRandom().nextBoolean()) { + HttpEntity entity = new StringEntity(randomAsciiAlphanumOfLengthBetween(10, 100), ContentType.APPLICATION_JSON); + ((HttpEntityEnclosingRequest) expectedRequest).setEntity(entity); + request.setEntity(entity); } - Header[] headers = new Header[0]; final Set uniqueNames = new HashSet<>(); if (randomBoolean()) { - headers = RestClientTestUtil.randomHeaders(getRandom(), "Header"); + Header[] headers = RestClientTestUtil.randomHeaders(getRandom(), "Header"); + request.setHeaders(headers); for (Header header : headers) { - request.addHeader(header); + expectedRequest.addHeader(header); uniqueNames.add(header.getName()); } } for (Header defaultHeader : defaultHeaders) { // request level headers override default headers if (uniqueNames.contains(defaultHeader.getName()) == false) { - request.addHeader(defaultHeader); + expectedRequest.addHeader(defaultHeader); } } try { - if (hasParams == false && hasBody == false && randomBoolean()) { - restClient.performRequest(method, uriAsString, headers); - } else if (hasBody == false && randomBoolean()) { - restClient.performRequest(method, uriAsString, params, headers); - } else { - restClient.performRequest(method, uriAsString, params, entity, headers); - } + restClient.performRequest(request); } catch(ResponseException e) { //all good } - return request; + return expectedRequest; } + /** + * @deprecated prefer {@link RestClient#performRequest(Request)}. + */ + @Deprecated private Response performRequest(String method, String endpoint, Header... headers) throws IOException { return performRequest(method, endpoint, Collections.emptyMap(), headers); } + /** + * @deprecated prefer {@link RestClient#performRequest(Request)}. + */ + @Deprecated private Response performRequest(String method, String endpoint, Map params, Header... headers) throws IOException { int methodSelector; if (params.isEmpty()) { diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java index ba119e0d8b236..872b327954b02 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientTests.java @@ -52,6 +52,30 @@ public void testCloseIsIdempotent() throws IOException { } public void testPerformAsyncWithUnsupportedMethod() throws Exception { + final CountDownLatch latch = new CountDownLatch(1); + try (RestClient restClient = createRestClient()) { + restClient.performRequestAsync(new Request("unsupported", randomAsciiLettersOfLength(5)), new ResponseListener() { + @Override + public void onSuccess(Response response) { + fail("should have failed because of unsupported method"); + } + + @Override + public void onFailure(Exception exception) { + assertThat(exception, instanceOf(UnsupportedOperationException.class)); + assertEquals("http method not supported: unsupported", exception.getMessage()); + latch.countDown(); + } + }); + latch.await(); + } + } + + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link #testPerformAsyncWithUnsupportedMethod()}. + */ + @Deprecated + public void testPerformAsyncOldStyleWithUnsupportedMethod() throws Exception { final CountDownLatch latch = new CountDownLatch(1); try (RestClient restClient = createRestClient()) { restClient.performRequestAsync("unsupported", randomAsciiLettersOfLength(5), new ResponseListener() { @@ -71,7 +95,11 @@ public void onFailure(Exception exception) { } } - public void testPerformAsyncWithNullParams() throws Exception { + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testSetParameters()}. + */ + @Deprecated + public void testPerformOldStyleAsyncWithNullParams() throws Exception { final CountDownLatch latch = new CountDownLatch(1); try (RestClient restClient = createRestClient()) { restClient.performRequestAsync(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5), null, new ResponseListener() { @@ -83,7 +111,7 @@ public void onSuccess(Response response) { @Override public void onFailure(Exception exception) { assertThat(exception, instanceOf(NullPointerException.class)); - assertEquals("params must not be null", exception.getMessage()); + assertEquals("parameters cannot be null", exception.getMessage()); latch.countDown(); } }); @@ -91,7 +119,11 @@ public void onFailure(Exception exception) { } } - public void testPerformAsyncWithNullHeaders() throws Exception { + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testSetHeaders()}. + */ + @Deprecated + public void testPerformOldStyleAsyncWithNullHeaders() throws Exception { final CountDownLatch latch = new CountDownLatch(1); try (RestClient restClient = createRestClient()) { ResponseListener listener = new ResponseListener() { @@ -103,7 +135,7 @@ public void onSuccess(Response response) { @Override public void onFailure(Exception exception) { assertThat(exception, instanceOf(NullPointerException.class)); - assertEquals("request header must not be null", exception.getMessage()); + assertEquals("header cannot be null", exception.getMessage()); latch.countDown(); } }; @@ -113,6 +145,30 @@ public void onFailure(Exception exception) { } public void testPerformAsyncWithWrongEndpoint() throws Exception { + final CountDownLatch latch = new CountDownLatch(1); + try (RestClient restClient = createRestClient()) { + restClient.performRequestAsync(new Request("GET", "::http:///"), new ResponseListener() { + @Override + public void onSuccess(Response response) { + fail("should have failed because of wrong endpoint"); + } + + @Override + public void onFailure(Exception exception) { + assertThat(exception, instanceOf(IllegalArgumentException.class)); + assertEquals("Expected scheme name at index 0: ::http:///", exception.getMessage()); + latch.countDown(); + } + }); + latch.await(); + } + } + + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link #testPerformAsyncWithWrongEndpoint()}. + */ + @Deprecated + public void testPerformAsyncOldStyleWithWrongEndpoint() throws Exception { final CountDownLatch latch = new CountDownLatch(1); try (RestClient restClient = createRestClient()) { restClient.performRequestAsync("GET", "::http:///", new ResponseListener() { @@ -175,6 +231,10 @@ public void testSetHostsWrongArguments() throws IOException { } } + /** + * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testConstructor()}. + */ + @Deprecated public void testNullPath() throws IOException { try (RestClient restClient = createRestClient()) { for (String method : getHttpMethods()) { From 793872492eb95eecd9933c914ea89d73e026a16f Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 19 Apr 2018 15:40:24 -0400 Subject: [PATCH 06/20] WIP --- .../client/HighLevelRequests.java | 266 +++++++++++------- .../client/RestHighLevelClient.java | 6 +- .../CustomRestHighLevelClientTests.java | 19 +- .../client/RestHighLevelClientTests.java | 60 ++-- .../org/elasticsearch/client/Request.java | 59 +++- .../elasticsearch/client/RequestTests.java | 3 + .../RestClientMultipleHostsIntegTests.java | 4 +- .../client/RestClientSingleHostTests.java | 4 +- 8 files changed, 260 insertions(+), 161 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java index 7204f57fefd87..b5f7a4e8d4e06 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java @@ -98,6 +98,7 @@ private HighLevelRequests() { static Request delete(DeleteRequest deleteRequest) { String endpoint = endpoint(deleteRequest.index(), deleteRequest.type(), deleteRequest.id()); + Request request = new Request(HttpDelete.METHOD_NAME, endpoint); Params parameters = Params.builder(); parameters.withRouting(deleteRequest.routing()); @@ -106,62 +107,71 @@ static Request delete(DeleteRequest deleteRequest) { parameters.withVersionType(deleteRequest.versionType()); parameters.withRefreshPolicy(deleteRequest.getRefreshPolicy()); parameters.withWaitForActiveShards(deleteRequest.waitForActiveShards()); - - return new Request(HttpDelete.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request deleteIndex(DeleteIndexRequest deleteIndexRequest) { String endpoint = endpoint(deleteIndexRequest.indices()); + Request request = new Request(HttpDelete.METHOD_NAME, endpoint); Params parameters = Params.builder(); parameters.withTimeout(deleteIndexRequest.timeout()); parameters.withMasterTimeout(deleteIndexRequest.masterNodeTimeout()); parameters.withIndicesOptions(deleteIndexRequest.indicesOptions()); - - return new Request(HttpDelete.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request openIndex(OpenIndexRequest openIndexRequest) { String endpoint = endpoint(openIndexRequest.indices(), "_open"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint); Params parameters = Params.builder(); - parameters.withTimeout(openIndexRequest.timeout()); parameters.withMasterTimeout(openIndexRequest.masterNodeTimeout()); parameters.withWaitForActiveShards(openIndexRequest.waitForActiveShards()); parameters.withIndicesOptions(openIndexRequest.indicesOptions()); - - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request closeIndex(CloseIndexRequest closeIndexRequest) { String endpoint = endpoint(closeIndexRequest.indices(), "_close"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint); + Params parameters = Params.builder(); parameters.withTimeout(closeIndexRequest.timeout()); parameters.withMasterTimeout(closeIndexRequest.masterNodeTimeout()); parameters.withIndicesOptions(closeIndexRequest.indicesOptions()); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request createIndex(CreateIndexRequest createIndexRequest) throws IOException { String endpoint = endpoint(createIndexRequest.indices()); + Request request = new Request(HttpPut.METHOD_NAME, endpoint); Params parameters = Params.builder(); parameters.withTimeout(createIndexRequest.timeout()); parameters.withMasterTimeout(createIndexRequest.masterNodeTimeout()); parameters.withWaitForActiveShards(createIndexRequest.waitForActiveShards()); + request.setParameters(parameters.getParams()); - HttpEntity entity = createEntity(createIndexRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPut.METHOD_NAME, endpoint, parameters.getParams(), entity); + request.setEntity(createEntity(createIndexRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request updateAliases(IndicesAliasesRequest indicesAliasesRequest) throws IOException { + Request request = new Request(HttpPost.METHOD_NAME, "/_aliases"); + Params parameters = Params.builder(); parameters.withTimeout(indicesAliasesRequest.timeout()); parameters.withMasterTimeout(indicesAliasesRequest.masterNodeTimeout()); + request.setParameters(parameters.getParams()); - HttpEntity entity = createEntity(indicesAliasesRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPost.METHOD_NAME, "/_aliases", parameters.getParams(), entity); + request.setEntity(createEntity(indicesAliasesRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request putMapping(PutMappingRequest putMappingRequest) throws IOException { @@ -170,79 +180,91 @@ static Request putMapping(PutMappingRequest putMappingRequest) throws IOExceptio throw new IllegalArgumentException("concreteIndex cannot be set on PutMapping requests made over the REST API"); } - String endpoint = endpoint(putMappingRequest.indices(), "_mapping", putMappingRequest.type()); + Request request = new Request(HttpPut.METHOD_NAME, endpoint(putMappingRequest.indices(), "_mapping", putMappingRequest.type())); Params parameters = Params.builder(); parameters.withTimeout(putMappingRequest.timeout()); parameters.withMasterTimeout(putMappingRequest.masterNodeTimeout()); + request.setParameters(parameters.getParams()); - HttpEntity entity = createEntity(putMappingRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPut.METHOD_NAME, endpoint, parameters.getParams(), entity); + request.setEntity(createEntity(putMappingRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request refresh(RefreshRequest refreshRequest) { String[] indices = refreshRequest.indices() == null ? Strings.EMPTY_ARRAY : refreshRequest.indices(); - String endpoint = endpoint(indices, "_refresh"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_refresh")); + Params parameters = Params.builder(); parameters.withIndicesOptions(refreshRequest.indicesOptions()); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request flush(FlushRequest flushRequest) { String[] indices = flushRequest.indices() == null ? Strings.EMPTY_ARRAY : flushRequest.indices(); - String endpoint = endpoint(indices, "_flush"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_flush")); + Params parameters = Params.builder(); parameters.withIndicesOptions(flushRequest.indicesOptions()); parameters.putParam("wait_if_ongoing", Boolean.toString(flushRequest.waitIfOngoing())); parameters.putParam("force", Boolean.toString(flushRequest.force())); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request forceMerge(ForceMergeRequest forceMergeRequest) { String[] indices = forceMergeRequest.indices() == null ? Strings.EMPTY_ARRAY : forceMergeRequest.indices(); - String endpoint = endpoint(indices, "_forcemerge"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_forcemerge")); + Params parameters = Params.builder(); parameters.withIndicesOptions(forceMergeRequest.indicesOptions()); parameters.putParam("max_num_segments", Integer.toString(forceMergeRequest.maxNumSegments())); parameters.putParam("only_expunge_deletes", Boolean.toString(forceMergeRequest.onlyExpungeDeletes())); parameters.putParam("flush", Boolean.toString(forceMergeRequest.flush())); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request clearCache(ClearIndicesCacheRequest clearIndicesCacheRequest) { String[] indices = clearIndicesCacheRequest.indices() == null ? Strings.EMPTY_ARRAY :clearIndicesCacheRequest.indices(); - String endpoint = endpoint(indices, "_cache/clear"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_cache/clear")); + Params parameters = Params.builder(); parameters.withIndicesOptions(clearIndicesCacheRequest.indicesOptions()); parameters.putParam("query", Boolean.toString(clearIndicesCacheRequest.queryCache())); parameters.putParam("fielddata", Boolean.toString(clearIndicesCacheRequest.fieldDataCache())); parameters.putParam("request", Boolean.toString(clearIndicesCacheRequest.requestCache())); parameters.putParam("fields", String.join(",", clearIndicesCacheRequest.fields())); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), null); + request.setParameters(parameters.getParams()); + return request; } static Request info() { - return new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + return new Request(HttpGet.METHOD_NAME, "/"); } static Request bulk(BulkRequest bulkRequest) throws IOException { + Request request = new Request(HttpPost.METHOD_NAME, "/_bulk"); + Params parameters = Params.builder(); parameters.withTimeout(bulkRequest.timeout()); parameters.withRefreshPolicy(bulkRequest.getRefreshPolicy()); + request.setParameters(parameters.getParams()); // Bulk API only supports newline delimited JSON or Smile. Before executing // the bulk, we need to check that all requests have the same content-type // and this content-type is supported by the Bulk API. XContentType bulkContentType = null; for (int i = 0; i < bulkRequest.numberOfActions(); i++) { - DocWriteRequest request = bulkRequest.requests().get(i); + DocWriteRequest action = bulkRequest.requests().get(i); - DocWriteRequest.OpType opType = request.opType(); + DocWriteRequest.OpType opType = action.opType(); if (opType == DocWriteRequest.OpType.INDEX || opType == DocWriteRequest.OpType.CREATE) { - bulkContentType = enforceSameContentType((IndexRequest) request, bulkContentType); + bulkContentType = enforceSameContentType((IndexRequest) action, bulkContentType); } else if (opType == DocWriteRequest.OpType.UPDATE) { - UpdateRequest updateRequest = (UpdateRequest) request; + UpdateRequest updateRequest = (UpdateRequest) action; if (updateRequest.doc() != null) { bulkContentType = enforceSameContentType(updateRequest.doc(), bulkContentType); } @@ -260,30 +282,30 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { final ContentType requestContentType = createContentType(bulkContentType); ByteArrayOutputStream content = new ByteArrayOutputStream(); - for (DocWriteRequest request : bulkRequest.requests()) { - DocWriteRequest.OpType opType = request.opType(); + for (DocWriteRequest action : bulkRequest.requests()) { + DocWriteRequest.OpType opType = action.opType(); try (XContentBuilder metadata = XContentBuilder.builder(bulkContentType.xContent())) { metadata.startObject(); { metadata.startObject(opType.getLowercase()); - if (Strings.hasLength(request.index())) { - metadata.field("_index", request.index()); + if (Strings.hasLength(action.index())) { + metadata.field("_index", action.index()); } - if (Strings.hasLength(request.type())) { - metadata.field("_type", request.type()); + if (Strings.hasLength(action.type())) { + metadata.field("_type", action.type()); } - if (Strings.hasLength(request.id())) { - metadata.field("_id", request.id()); + if (Strings.hasLength(action.id())) { + metadata.field("_id", action.id()); } - if (Strings.hasLength(request.routing())) { - metadata.field("routing", request.routing()); + if (Strings.hasLength(action.routing())) { + metadata.field("routing", action.routing()); } - if (request.version() != Versions.MATCH_ANY) { - metadata.field("version", request.version()); + if (action.version() != Versions.MATCH_ANY) { + metadata.field("version", action.version()); } - VersionType versionType = request.versionType(); + VersionType versionType = action.versionType(); if (versionType != VersionType.INTERNAL) { if (versionType == VersionType.EXTERNAL) { metadata.field("version_type", "external"); @@ -295,12 +317,12 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { } if (opType == DocWriteRequest.OpType.INDEX || opType == DocWriteRequest.OpType.CREATE) { - IndexRequest indexRequest = (IndexRequest) request; + IndexRequest indexRequest = (IndexRequest) action; if (Strings.hasLength(indexRequest.getPipeline())) { metadata.field("pipeline", indexRequest.getPipeline()); } } else if (opType == DocWriteRequest.OpType.UPDATE) { - UpdateRequest updateRequest = (UpdateRequest) request; + UpdateRequest updateRequest = (UpdateRequest) action; if (updateRequest.retryOnConflict() > 0) { metadata.field("retry_on_conflict", updateRequest.retryOnConflict()); } @@ -319,7 +341,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { BytesRef source = null; if (opType == DocWriteRequest.OpType.INDEX || opType == DocWriteRequest.OpType.CREATE) { - IndexRequest indexRequest = (IndexRequest) request; + IndexRequest indexRequest = (IndexRequest) action; BytesReference indexSource = indexRequest.source(); XContentType indexXContentType = indexRequest.getContentType(); @@ -331,7 +353,7 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { } } } else if (opType == DocWriteRequest.OpType.UPDATE) { - source = XContentHelper.toXContent((UpdateRequest) request, bulkContentType, false).toBytesRef(); + source = XContentHelper.toXContent((UpdateRequest) action, bulkContentType, false).toBytesRef(); } if (source != null) { @@ -339,18 +361,19 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { content.write(separator); } } - - HttpEntity entity = new ByteArrayEntity(content.toByteArray(), 0, content.size(), requestContentType); - return new Request(HttpPost.METHOD_NAME, "/_bulk", parameters.getParams(), entity); + request.setEntity(new ByteArrayEntity(content.toByteArray(), 0, content.size(), requestContentType)); + return request; } static Request exists(GetRequest getRequest) { - Request request = get(getRequest); - return new Request(HttpHead.METHOD_NAME, request.getEndpoint(), request.getParameters(), null); + Request get = get(getRequest); + Request exists = new Request(HttpHead.METHOD_NAME, get.getEndpoint()); + exists.setParameters(get.getParameters()); + return exists; } static Request get(GetRequest getRequest) { - String endpoint = endpoint(getRequest.index(), getRequest.type(), getRequest.id()); + Request request = new Request(HttpGet.METHOD_NAME, endpoint(getRequest.index(), getRequest.type(), getRequest.id())); Params parameters = Params.builder(); parameters.withPreference(getRequest.preference()); @@ -361,24 +384,29 @@ static Request get(GetRequest getRequest) { parameters.withVersion(getRequest.version()); parameters.withVersionType(getRequest.versionType()); parameters.withFetchSourceContext(getRequest.fetchSourceContext()); + request.setParameters(parameters.getParams()); - return new Request(HttpGet.METHOD_NAME, endpoint, parameters.getParams(), null); + return request; } static Request multiGet(MultiGetRequest multiGetRequest) throws IOException { + Request request = new Request(HttpPost.METHOD_NAME, "/_mget"); + Params parameters = Params.builder(); parameters.withPreference(multiGetRequest.preference()); parameters.withRealtime(multiGetRequest.realtime()); parameters.withRefresh(multiGetRequest.refresh()); - HttpEntity entity = createEntity(multiGetRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPost.METHOD_NAME, "/_mget", parameters.getParams(), entity); + request.setParameters(parameters.getParams()); + + request.setEntity(createEntity(multiGetRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request index(IndexRequest indexRequest) { String method = Strings.hasLength(indexRequest.id()) ? HttpPut.METHOD_NAME : HttpPost.METHOD_NAME; - boolean isCreate = (indexRequest.opType() == DocWriteRequest.OpType.CREATE); String endpoint = endpoint(indexRequest.index(), indexRequest.type(), indexRequest.id(), isCreate ? "_create" : null); + Request request = new Request(method, endpoint); Params parameters = Params.builder(); parameters.withRouting(indexRequest.routing()); @@ -388,20 +416,21 @@ static Request index(IndexRequest indexRequest) { parameters.withPipeline(indexRequest.getPipeline()); parameters.withRefreshPolicy(indexRequest.getRefreshPolicy()); parameters.withWaitForActiveShards(indexRequest.waitForActiveShards()); + request.setParameters(parameters.getParams()); BytesRef source = indexRequest.source().toBytesRef(); ContentType contentType = createContentType(indexRequest.getContentType()); - HttpEntity entity = new ByteArrayEntity(source.bytes, source.offset, source.length, contentType); - - return new Request(method, endpoint, parameters.getParams(), entity); + request.setEntity(new ByteArrayEntity(source.bytes, source.offset, source.length, contentType)); + return request; } static Request ping() { - return new Request(HttpHead.METHOD_NAME, "/", Collections.emptyMap(), null); + return new Request(HttpHead.METHOD_NAME, "/"); } static Request update(UpdateRequest updateRequest) throws IOException { String endpoint = endpoint(updateRequest.index(), updateRequest.type(), updateRequest.id(), "_update"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint); Params parameters = Params.builder(); parameters.withRouting(updateRequest.routing()); @@ -413,6 +442,7 @@ static Request update(UpdateRequest updateRequest) throws IOException { parameters.withRetryOnConflict(updateRequest.retryOnConflict()); parameters.withVersion(updateRequest.version()); parameters.withVersionType(updateRequest.versionType()); + request.setParameters(parameters.getParams()); // The Java API allows update requests with different content types // set for the partial document and the upsert document. This client @@ -434,13 +464,13 @@ static Request update(UpdateRequest updateRequest) throws IOException { if (xContentType == null) { xContentType = Requests.INDEX_CONTENT_TYPE; } - - HttpEntity entity = createEntity(updateRequest, xContentType); - return new Request(HttpPost.METHOD_NAME, endpoint, parameters.getParams(), entity); + request.setEntity(createEntity(updateRequest, xContentType)); + return request; } static Request search(SearchRequest searchRequest) throws IOException { - String endpoint = endpoint(searchRequest.indices(), searchRequest.types(), "_search"); + Request request = new Request(HttpPost.METHOD_NAME, endpoint(searchRequest.indices(), searchRequest.types(), "_search")); + Params params = Params.builder(); params.putParam(RestSearchAction.TYPED_KEYS_PARAM, "true"); params.withRouting(searchRequest.routing()); @@ -457,55 +487,68 @@ static Request search(SearchRequest searchRequest) throws IOException { if (searchRequest.scroll() != null) { params.putParam("scroll", searchRequest.scroll().keepAlive()); } - HttpEntity entity = null; + request.setParameters(params.getParams()); + if (searchRequest.source() != null) { - entity = createEntity(searchRequest.source(), REQUEST_BODY_CONTENT_TYPE); + request.setEntity(createEntity(searchRequest.source(), REQUEST_BODY_CONTENT_TYPE)); } - return new Request(HttpPost.METHOD_NAME, endpoint, params.getParams(), entity); + return request; } static Request searchScroll(SearchScrollRequest searchScrollRequest) throws IOException { - HttpEntity entity = createEntity(searchScrollRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPost.METHOD_NAME, "/_search/scroll", Collections.emptyMap(), entity); + Request request = new Request(HttpPost.METHOD_NAME, "/_search/scroll"); + request.setEntity(createEntity(searchScrollRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request clearScroll(ClearScrollRequest clearScrollRequest) throws IOException { - HttpEntity entity = createEntity(clearScrollRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpDelete.METHOD_NAME, "/_search/scroll", Collections.emptyMap(), entity); + Request request = new Request(HttpDelete.METHOD_NAME, "/_search/scroll"); + request.setEntity(createEntity(clearScrollRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request multiSearch(MultiSearchRequest multiSearchRequest) throws IOException { + Request request = new Request(HttpPost.METHOD_NAME, "/_msearch"); + Params params = Params.builder(); params.putParam(RestSearchAction.TYPED_KEYS_PARAM, "true"); if (multiSearchRequest.maxConcurrentSearchRequests() != MultiSearchRequest.MAX_CONCURRENT_SEARCH_REQUESTS_DEFAULT) { params.putParam("max_concurrent_searches", Integer.toString(multiSearchRequest.maxConcurrentSearchRequests())); } + request.setParameters(params.getParams()); + XContent xContent = REQUEST_BODY_CONTENT_TYPE.xContent(); byte[] source = MultiSearchRequest.writeMultiLineFormat(multiSearchRequest, xContent); - HttpEntity entity = new ByteArrayEntity(source, createContentType(xContent.type())); - return new Request(HttpPost.METHOD_NAME, "/_msearch", params.getParams(), entity); + request.setEntity(new ByteArrayEntity(source, createContentType(xContent.type()))); + return request; } static Request existsAlias(GetAliasesRequest getAliasesRequest) { - Params params = Params.builder(); - params.withIndicesOptions(getAliasesRequest.indicesOptions()); - params.withLocal(getAliasesRequest.local()); if ((getAliasesRequest.indices() == null || getAliasesRequest.indices().length == 0) && (getAliasesRequest.aliases() == null || getAliasesRequest.aliases().length == 0)) { throw new IllegalArgumentException("existsAlias requires at least an alias or an index"); } String[] indices = getAliasesRequest.indices() == null ? Strings.EMPTY_ARRAY : getAliasesRequest.indices(); String[] aliases = getAliasesRequest.aliases() == null ? Strings.EMPTY_ARRAY : getAliasesRequest.aliases(); - String endpoint = endpoint(indices, "_alias", aliases); - return new Request(HttpHead.METHOD_NAME, endpoint, params.getParams(), null); + + Request request = new Request(HttpHead.METHOD_NAME, endpoint(indices, "_alias", aliases)); + + Params params = Params.builder(); + params.withIndicesOptions(getAliasesRequest.indicesOptions()); + params.withLocal(getAliasesRequest.local()); + request.setParameters(params.getParams()); + return request; } static Request rankEval(RankEvalRequest rankEvalRequest) throws IOException { - String endpoint = endpoint(rankEvalRequest.indices(), Strings.EMPTY_ARRAY, "_rank_eval"); + Request request = new Request(HttpGet.METHOD_NAME, endpoint(rankEvalRequest.indices(), Strings.EMPTY_ARRAY, "_rank_eval")); + Params params = Params.builder(); params.withIndicesOptions(rankEvalRequest.indicesOptions()); - HttpEntity entity = createEntity(rankEvalRequest.getRankEvalSpec(), REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpGet.METHOD_NAME, endpoint, params.getParams(), entity); + request.setParameters(params.getParams()); + + request.setEntity(createEntity(rankEvalRequest.getRankEvalSpec(), REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request split(ResizeRequest resizeRequest) throws IOException { @@ -523,26 +566,38 @@ static Request shrink(ResizeRequest resizeRequest) throws IOException { } private static Request resize(ResizeRequest resizeRequest) throws IOException { + String endpoint = new EndpointBuilder().addPathPart(resizeRequest.getSourceIndex()) + .addPathPartAsIs("_" + resizeRequest.getResizeType().name().toLowerCase(Locale.ROOT)) + .addPathPart(resizeRequest.getTargetIndexRequest().index()).build(); + Request request = new Request(HttpPut.METHOD_NAME, endpoint); + Params params = Params.builder(); params.withTimeout(resizeRequest.timeout()); params.withMasterTimeout(resizeRequest.masterNodeTimeout()); params.withWaitForActiveShards(resizeRequest.getTargetIndexRequest().waitForActiveShards()); - String endpoint = new EndpointBuilder().addPathPart(resizeRequest.getSourceIndex()) - .addPathPartAsIs("_" + resizeRequest.getResizeType().name().toLowerCase(Locale.ROOT)) - .addPathPart(resizeRequest.getTargetIndexRequest().index()).build(); - HttpEntity entity = createEntity(resizeRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPut.METHOD_NAME, endpoint, params.getParams(), entity); + request.setParameters(params.getParams()); + + request.setEntity(createEntity(resizeRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request clusterPutSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest) throws IOException { + Request request = new Request(HttpPut.METHOD_NAME, "/_cluster/settings"); + Params parameters = Params.builder(); parameters.withTimeout(clusterUpdateSettingsRequest.timeout()); parameters.withMasterTimeout(clusterUpdateSettingsRequest.masterNodeTimeout()); - HttpEntity entity = createEntity(clusterUpdateSettingsRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPut.METHOD_NAME, "/_cluster/settings", parameters.getParams(), entity); + request.setParameters(parameters.getParams()); + + request.setEntity(createEntity(clusterUpdateSettingsRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } static Request rollover(RolloverRequest rolloverRequest) throws IOException { + String endpoint = new EndpointBuilder().addPathPart(rolloverRequest.getAlias()).addPathPartAsIs("_rollover") + .addPathPart(rolloverRequest.getNewIndexName()).build(); + Request request = new Request(HttpPost.METHOD_NAME, endpoint); + Params params = Params.builder(); params.withTimeout(rolloverRequest.timeout()); params.withMasterTimeout(rolloverRequest.masterNodeTimeout()); @@ -550,37 +605,42 @@ static Request rollover(RolloverRequest rolloverRequest) throws IOException { if (rolloverRequest.isDryRun()) { params.putParam("dry_run", Boolean.TRUE.toString()); } - String endpoint = new EndpointBuilder().addPathPart(rolloverRequest.getAlias()).addPathPartAsIs("_rollover") - .addPathPart(rolloverRequest.getNewIndexName()).build(); - HttpEntity entity = createEntity(rolloverRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPost.METHOD_NAME, endpoint, params.getParams(), entity); + request.setParameters(params.getParams()); + + request.setEntity(createEntity(rolloverRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } - static Request indicesExist(GetIndexRequest request) { + static Request indicesExist(GetIndexRequest getIndexRequest) { // this can be called with no indices as argument by transport client, not via REST though - if (request.indices() == null || request.indices().length == 0) { + if (getIndexRequest.indices() == null || getIndexRequest.indices().length == 0) { throw new IllegalArgumentException("indices are mandatory"); } - String endpoint = endpoint(request.indices(), ""); + String endpoint = endpoint(getIndexRequest.indices(), ""); + Request request = new Request(HttpHead.METHOD_NAME, endpoint); + Params params = Params.builder(); - params.withLocal(request.local()); - params.withHuman(request.humanReadable()); - params.withIndicesOptions(request.indicesOptions()); - params.withIncludeDefaults(request.includeDefaults()); - return new Request(HttpHead.METHOD_NAME, endpoint, params.getParams(), null); + params.withLocal(getIndexRequest.local()); + params.withHuman(getIndexRequest.humanReadable()); + params.withIndicesOptions(getIndexRequest.indicesOptions()); + params.withIncludeDefaults(getIndexRequest.includeDefaults()); + request.setParameters(params.getParams()); + return request; } static Request indexPutSettings(UpdateSettingsRequest updateSettingsRequest) throws IOException { + String[] indices = updateSettingsRequest.indices() == null ? Strings.EMPTY_ARRAY : updateSettingsRequest.indices(); + Request request = new Request(HttpPut.METHOD_NAME, endpoint(indices, "_settings")); + Params parameters = Params.builder(); parameters.withTimeout(updateSettingsRequest.timeout()); parameters.withMasterTimeout(updateSettingsRequest.masterNodeTimeout()); parameters.withIndicesOptions(updateSettingsRequest.indicesOptions()); parameters.withPreserveExisting(updateSettingsRequest.isPreserveExisting()); + request.setParameters(parameters.getParams()); - String[] indices = updateSettingsRequest.indices() == null ? Strings.EMPTY_ARRAY : updateSettingsRequest.indices(); - String endpoint = endpoint(indices, "_settings"); - HttpEntity entity = createEntity(updateSettingsRequest, REQUEST_BODY_CONTENT_TYPE); - return new Request(HttpPut.METHOD_NAME, endpoint, parameters.getParams(), entity); + request.setEntity(createEntity(updateSettingsRequest, REQUEST_BODY_CONTENT_TYPE)); + return request; } private static HttpEntity createEntity(ToXContent toXContent, XContentType xContentType) throws IOException { diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 2655aa103510b..a72f1e7b375f5 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -525,9 +525,10 @@ protected final Resp performRequest(Req reques throw validationException; } Request req = requestConverter.apply(request); + req.setHeaders(headers); Response response; try { - response = client.performRequest(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), headers); + response = client.performRequest(req); } catch (ResponseException e) { if (ignores.contains(e.getResponse().getStatusLine().getStatusCode())) { try { @@ -574,9 +575,10 @@ protected final void performRequestAsync(Req r listener.onFailure(e); return; } + req.setHeaders(headers); ResponseListener responseListener = wrapResponseListener(responseConverter, listener, ignores); - client.performRequestAsync(req.getMethod(), req.getEndpoint(), req.getParameters(), req.getEntity(), responseListener, headers); + client.performRequestAsync(req, responseListener); } final ResponseListener wrapResponseListener(CheckedFunction responseConverter, diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/CustomRestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/CustomRestHighLevelClientTests.java index 42496822090fd..617b35c4d40f3 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/CustomRestHighLevelClientTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/CustomRestHighLevelClientTests.java @@ -20,7 +20,6 @@ package org.elasticsearch.client; import org.apache.http.Header; -import org.apache.http.HttpEntity; import org.apache.http.HttpHost; import org.apache.http.ProtocolVersion; import org.apache.http.RequestLine; @@ -52,14 +51,9 @@ import java.util.List; import java.util.stream.Collectors; -import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyMapOf; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.anyVararg; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -79,14 +73,15 @@ public void initClients() throws IOException { final RestClient restClient = mock(RestClient.class); restHighLevelClient = new CustomRestClient(restClient); - doAnswer(mock -> mockPerformRequest((Header) mock.getArguments()[4])) + doAnswer(inv -> mockPerformRequest(((Request) inv.getArguments()[0]).getHeaders()[0])) .when(restClient) - .performRequest(eq(HttpGet.METHOD_NAME), eq(ENDPOINT), anyMapOf(String.class, String.class), anyObject(), anyVararg()); + .performRequest(any(Request.class)); - doAnswer(mock -> mockPerformRequestAsync((Header) mock.getArguments()[5], (ResponseListener) mock.getArguments()[4])) + doAnswer(inv -> mockPerformRequestAsync( + ((Request) inv.getArguments()[0]).getHeaders()[0], + (ResponseListener) inv.getArguments()[1])) .when(restClient) - .performRequestAsync(eq(HttpGet.METHOD_NAME), eq(ENDPOINT), anyMapOf(String.class, String.class), - any(HttpEntity.class), any(ResponseListener.class), anyVararg()); + .performRequestAsync(any(Request.class), any(ResponseListener.class)); } } @@ -193,7 +188,7 @@ void customAndParseAsync(MainRequest mainRequest, ActionListener l } Request toRequest(MainRequest mainRequest) throws IOException { - return new Request(HttpGet.METHOD_NAME, ENDPOINT, emptyMap(), null); + return new Request(HttpGet.METHOD_NAME, ENDPOINT); } MainResponse toResponse(Response response) throws IOException { diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java index 2ed1f38ea2b46..65361dab853e6 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java @@ -94,6 +94,7 @@ import static org.elasticsearch.client.RestClientTestUtil.randomHeaders; import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.hamcrest.CoreMatchers.instanceOf; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyMapOf; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; @@ -134,31 +135,36 @@ public void testPingSuccessful() throws IOException { Header[] headers = randomHeaders(random(), "Header"); Response response = mock(Response.class); when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.OK)); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenReturn(response); + when(restClient.performRequest(any(Request.class))).thenReturn(response); assertTrue(restHighLevelClient.ping(headers)); - verify(restClient).performRequest(eq(HttpHead.METHOD_NAME), eq("/"), eq(Collections.emptyMap()), - isNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); + verifyRequested(new Request(HttpHead.METHOD_NAME, "/"), headers); + } + + private void verifyRequested(Request expected, HttpEntity entity, Header[] headers) throws IOException { + // TODO move these + expected.setEntity(entity); + verifyRequested(expected, headers); + } + + private void verifyRequested(Request expected, Header[] headers) throws IOException { + expected.setHeaders(headers); + verify(restClient).performRequest(expected); } public void testPing404NotFound() throws IOException { Header[] headers = randomHeaders(random(), "Header"); Response response = mock(Response.class); when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.NOT_FOUND)); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenReturn(response); + when(restClient.performRequest(any(Request.class))).thenReturn(response); assertFalse(restHighLevelClient.ping(headers)); - verify(restClient).performRequest(eq(HttpHead.METHOD_NAME), eq("/"), eq(Collections.emptyMap()), - isNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); + verifyRequested(new Request(HttpHead.METHOD_NAME, "/"), headers); } public void testPingSocketTimeout() throws IOException { Header[] headers = randomHeaders(random(), "Header"); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(new SocketTimeoutException()); + when(restClient.performRequest(any(Request.class)).thenThrow(new SocketTimeoutException()); expectThrows(SocketTimeoutException.class, () -> restHighLevelClient.ping(headers)); - verify(restClient).performRequest(eq(HttpHead.METHOD_NAME), eq("/"), eq(Collections.emptyMap()), - isNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); + verifyRequested(restClient, new Request(HttpHead.METHOD_NAME, "/"), headers); } public void testInfo() throws IOException { @@ -336,8 +342,7 @@ public void testParseResponseException() throws IOException { public void testPerformRequestOnSuccess() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); @@ -358,8 +363,7 @@ public void testPerformRequestOnSuccess() throws IOException { public void testPerformRequestOnResponseExceptionWithoutEntity() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); @@ -376,16 +380,14 @@ public void testPerformRequestOnResponseExceptionWithoutEntity() throws IOExcept public void testPerformRequestOnResponseExceptionWithEntity() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); httpResponse.setEntity(new StringEntity("{\"error\":\"test error message\",\"status\":" + restStatus.getStatus() + "}", ContentType.APPLICATION_JSON)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.emptySet())); @@ -396,15 +398,13 @@ public void testPerformRequestOnResponseExceptionWithEntity() throws IOException public void testPerformRequestOnResponseExceptionWithBrokenEntity() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); httpResponse.setEntity(new StringEntity("{\"error\":", ContentType.APPLICATION_JSON)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.emptySet())); @@ -416,8 +416,7 @@ public void testPerformRequestOnResponseExceptionWithBrokenEntity() throws IOExc public void testPerformRequestOnResponseExceptionWithBrokenEntity2() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); httpResponse.setEntity(new StringEntity("{\"status\":" + restStatus.getStatus() + "}", ContentType.APPLICATION_JSON)); @@ -436,8 +435,7 @@ public void testPerformRequestOnResponseExceptionWithBrokenEntity2() throws IOEx public void testPerformRequestOnResponseExceptionWithIgnores() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(RestStatus.NOT_FOUND)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); @@ -450,8 +448,7 @@ public void testPerformRequestOnResponseExceptionWithIgnores() throws IOExceptio public void testPerformRequestOnResponseExceptionWithIgnoresErrorNoBody() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(RestStatus.NOT_FOUND)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); @@ -467,8 +464,7 @@ public void testPerformRequestOnResponseExceptionWithIgnoresErrorNoBody() throws public void testPerformRequestOnResponseExceptionWithIgnoresErrorValidBody() throws IOException { MainRequest mainRequest = new MainRequest(); - CheckedFunction requestConverter = request -> - new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); + CheckedFunction requestConverter = request -> new Request(HttpGet.METHOD_NAME, "/"); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(RestStatus.NOT_FOUND)); httpResponse.setEntity(new StringEntity("{\"error\":\"test error message\",\"status\":404}", ContentType.APPLICATION_JSON)); diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 539611438fe09..44ba9f03fc383 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -22,6 +22,7 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; +import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.Objects; @@ -30,12 +31,13 @@ * Request to Elasticsearch. */ public final class Request { + private static final Header[] NO_HEADERS = new Header[0]; private final String method; private final String endpoint; private Map parameters = Collections.emptyMap(); private HttpEntity entity; - private Header[] headers; + private Header[] headers = NO_HEADERS; private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory = HttpAsyncResponseConsumerFactory.DEFAULT; @@ -119,7 +121,8 @@ public Header[] getHeaders() { * client side. */ public void setHttpAsyncResponseConsumerFactory(HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory) { - this.httpAsyncResponseConsumerFactory = httpAsyncResponseConsumerFactory; + this.httpAsyncResponseConsumerFactory = + Objects.requireNonNull(httpAsyncResponseConsumerFactory, "httpAsyncResponseConsumerFactory cannot be null"); } /** @@ -134,11 +137,51 @@ public HttpAsyncResponseConsumerFactory getHttpAsyncResponseConsumerFactory() { @Override public String toString() { - return "Request{" + - "method='" + method + '\'' + - ", endpoint='" + endpoint + '\'' + - ", params=" + parameters + - ", hasBody=" + (entity != null) + - '}'; + StringBuilder b = new StringBuilder(); + b.append("Request{"); + b.append("method='").append(method).append('\''); + b.append(", endpoint='").append(endpoint).append('\''); + if (false == parameters.isEmpty()) { + b.append(", params=").append(parameters); + } + if (entity != null) { + b.append(", entity=").append(entity); + } + if (headers.length > 0) { + b.append(", headers="); + for (int h = 0; h < headers.length; h++) { + if (h != 0) { + b.append(','); + } + b.append(headers[h].toString()); + } + } + if (httpAsyncResponseConsumerFactory != HttpAsyncResponseConsumerFactory.DEFAULT) { + b.append(", consumerFactory=").append(httpAsyncResponseConsumerFactory); + } + return b.append('}').toString(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null || (obj.getClass() != getClass())) { + return false; + } + if (obj == this) { + return true; + } + + Request other = (Request) obj; + return method.equals(other.method) + && endpoint.equals(other.endpoint) + && parameters.equals(other.parameters) + && Objects.equals(entity, other.entity) + && Arrays.equals(headers, other.headers) + && httpAsyncResponseConsumerFactory.equals(other.httpAsyncResponseConsumerFactory); + } + + @Override + public int hashCode() { + return Objects.hash(method, endpoint, parameters, entity, Arrays.hashCode(headers), httpAsyncResponseConsumerFactory); } } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java index f24e40cadeb65..33ff97c46f93a 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java @@ -110,4 +110,7 @@ public void testSetHeaders() { request.setHeaders(headers); assertArrayEquals(headers, request.getHeaders()); } + + // TODO equals and hashcode + } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientMultipleHostsIntegTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientMultipleHostsIntegTests.java index da5a960c2e84c..180a11b5a0097 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientMultipleHostsIntegTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientMultipleHostsIntegTests.java @@ -143,7 +143,7 @@ public void testSyncRequests() throws IOException { final int statusCode = randomBoolean() ? randomOkStatusCode(getRandom()) : randomErrorNoRetryStatusCode(getRandom()); Response response; try { - response = restClient.performRequest(method, "/" + statusCode); + response = restClient.performRequest(new Request(method, "/" + statusCode)); } catch(ResponseException responseException) { response = responseException.getResponse(); } @@ -161,7 +161,7 @@ public void testAsyncRequests() throws Exception { final String method = RestClientTestUtil.randomHttpMethod(getRandom()); //we don't test status codes that are subject to retries as they interfere with hosts being stopped final int statusCode = randomBoolean() ? randomOkStatusCode(getRandom()) : randomErrorNoRetryStatusCode(getRandom()); - restClient.performRequestAsync(method, "/" + statusCode, new ResponseListener() { + restClient.performRequestAsync(new Request(method, "/" + statusCode), new ResponseListener() { @Override public void onSuccess(Response response) { responses.add(new TestResponse(method, statusCode, response)); diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java index 9b69c41ca7392..a2493fb2f8647 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java @@ -344,13 +344,13 @@ public void testPerformRequestNullParams() throws IOException { restClient.performRequest(method, "/" + statusCode, (Map)null); fail("request should have failed"); } catch(NullPointerException e) { - assertEquals("params must not be null", e.getMessage()); + assertEquals("parameters cannot be null", e.getMessage()); } try { restClient.performRequest(method, "/" + statusCode, null, (HttpEntity)null); fail("request should have failed"); } catch(NullPointerException e) { - assertEquals("params must not be null", e.getMessage()); + assertEquals("parameters cannot be null", e.getMessage()); } } From 9d4b4e3bbb3e24a66b11c15dada80d7837b39d3f Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 19 Apr 2018 16:33:59 -0400 Subject: [PATCH 07/20] Rework and drop some assertions The test looks like it is asserting stuff about the request but that duplicates what is in `HighLevelRequestsTests`. --- .../client/RestHighLevelClientTests.java | 68 +++---------------- 1 file changed, 8 insertions(+), 60 deletions(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java index 65361dab853e6..7a2fe220bc6b9 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java @@ -95,14 +95,6 @@ import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.hamcrest.CoreMatchers.instanceOf; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyMapOf; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.anyVararg; -import static org.mockito.Matchers.argThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isNotNull; -import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -137,18 +129,6 @@ public void testPingSuccessful() throws IOException { when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.OK)); when(restClient.performRequest(any(Request.class))).thenReturn(response); assertTrue(restHighLevelClient.ping(headers)); - verifyRequested(new Request(HttpHead.METHOD_NAME, "/"), headers); - } - - private void verifyRequested(Request expected, HttpEntity entity, Header[] headers) throws IOException { - // TODO move these - expected.setEntity(entity); - verifyRequested(expected, headers); - } - - private void verifyRequested(Request expected, Header[] headers) throws IOException { - expected.setHeaders(headers); - verify(restClient).performRequest(expected); } public void testPing404NotFound() throws IOException { @@ -157,14 +137,12 @@ public void testPing404NotFound() throws IOException { when(response.getStatusLine()).thenReturn(newStatusLine(RestStatus.NOT_FOUND)); when(restClient.performRequest(any(Request.class))).thenReturn(response); assertFalse(restHighLevelClient.ping(headers)); - verifyRequested(new Request(HttpHead.METHOD_NAME, "/"), headers); } public void testPingSocketTimeout() throws IOException { Header[] headers = randomHeaders(random(), "Header"); - when(restClient.performRequest(any(Request.class)).thenThrow(new SocketTimeoutException()); + when(restClient.performRequest(any(Request.class))).thenThrow(new SocketTimeoutException()); expectThrows(SocketTimeoutException.class, () -> restHighLevelClient.ping(headers)); - verifyRequested(restClient, new Request(HttpHead.METHOD_NAME, "/"), headers); } public void testInfo() throws IOException { @@ -174,8 +152,6 @@ public void testInfo() throws IOException { mockResponse(testInfo); MainResponse receivedInfo = restHighLevelClient.info(headers); assertEquals(testInfo, receivedInfo); - verify(restClient).performRequest(eq(HttpGet.METHOD_NAME), eq("/"), eq(Collections.emptyMap()), - isNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); } public void testSearchScroll() throws IOException { @@ -191,8 +167,6 @@ public void testSearchScroll() throws IOException { assertEquals(5, searchResponse.getTotalShards()); assertEquals(5, searchResponse.getSuccessfulShards()); assertEquals(100, searchResponse.getTook().getMillis()); - verify(restClient).performRequest(eq(HttpPost.METHOD_NAME), eq("/_search/scroll"), eq(Collections.emptyMap()), - isNotNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); } public void testClearScroll() throws IOException { @@ -204,8 +178,6 @@ public void testClearScroll() throws IOException { ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, headers); assertEquals(mockClearScrollResponse.isSucceeded(), clearScrollResponse.isSucceeded()); assertEquals(mockClearScrollResponse.getNumFreed(), clearScrollResponse.getNumFreed()); - verify(restClient).performRequest(eq(HttpDelete.METHOD_NAME), eq("/_search/scroll"), eq(Collections.emptyMap()), - isNotNull(HttpEntity.class), argThat(new HeadersVarargMatcher(headers))); } private void mockResponse(ToXContent toXContent) throws IOException { @@ -213,8 +185,7 @@ private void mockResponse(ToXContent toXContent) throws IOException { ContentType contentType = ContentType.parse(HighLevelRequests.REQUEST_BODY_CONTENT_TYPE.mediaType()); String requestBody = toXContent(toXContent, HighLevelRequests.REQUEST_BODY_CONTENT_TYPE, false).utf8ToString(); when(response.getEntity()).thenReturn(new NStringEntity(requestBody, contentType)); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenReturn(response); + when(restClient.performRequest(any(Request.class))).thenReturn(response); } public void testRequestValidation() { @@ -346,8 +317,7 @@ public void testPerformRequestOnSuccess() throws IOException { RestStatus restStatus = randomFrom(RestStatus.values()); HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenReturn(mockResponse); + when(restClient.performRequest(any(Request.class))).thenReturn(mockResponse); { Integer result = restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.emptySet()); @@ -368,8 +338,7 @@ public void testPerformRequestOnResponseExceptionWithoutEntity() throws IOExcept HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(restStatus)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.emptySet())); @@ -422,8 +391,7 @@ public void testPerformRequestOnResponseExceptionWithBrokenEntity2() throws IOEx httpResponse.setEntity(new StringEntity("{\"status\":" + restStatus.getStatus() + "}", ContentType.APPLICATION_JSON)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.emptySet())); @@ -439,8 +407,7 @@ public void testPerformRequestOnResponseExceptionWithIgnores() throws IOExceptio HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(RestStatus.NOT_FOUND)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); //although we got an exception, we turn it into a successful response because the status code was provided among ignores assertEquals(Integer.valueOf(404), restHighLevelClient.performRequest(mainRequest, requestConverter, response -> response.getStatusLine().getStatusCode(), Collections.singleton(404))); @@ -452,8 +419,7 @@ public void testPerformRequestOnResponseExceptionWithIgnoresErrorNoBody() throws HttpResponse httpResponse = new BasicHttpResponse(newStatusLine(RestStatus.NOT_FOUND)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> {throw new IllegalStateException();}, Collections.singleton(404))); @@ -470,8 +436,7 @@ public void testPerformRequestOnResponseExceptionWithIgnoresErrorValidBody() thr ContentType.APPLICATION_JSON)); Response mockResponse = new Response(REQUEST_LINE, new HttpHost("localhost", 9200), httpResponse); ResponseException responseException = new ResponseException(mockResponse); - when(restClient.performRequest(anyString(), anyString(), anyMapOf(String.class, String.class), - anyObject(), anyVararg())).thenThrow(responseException); + when(restClient.performRequest(any(Request.class))).thenThrow(responseException); ElasticsearchException elasticsearchException = expectThrows(ElasticsearchException.class, () -> restHighLevelClient.performRequest(mainRequest, requestConverter, response -> {throw new IllegalStateException();}, Collections.singleton(404))); @@ -692,23 +657,6 @@ public void onFailure(Exception e) { } } - private static class HeadersVarargMatcher extends ArgumentMatcher implements VarargMatcher { - private Header[] expectedHeaders; - - HeadersVarargMatcher(Header... expectedHeaders) { - this.expectedHeaders = expectedHeaders; - } - - @Override - public boolean matches(Object varargArgument) { - if (varargArgument instanceof Header[]) { - Header[] actualHeaders = (Header[]) varargArgument; - return new ArrayEquals(expectedHeaders).matches(actualHeaders); - } - return false; - } - } - private static StatusLine newStatusLine(RestStatus restStatus) { return new BasicStatusLine(HTTP_PROTOCOL, restStatus.getStatus(), restStatus.name()); } From e0788a0b8b0aa514e3200b956df258d1ddeb571b Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 19 Apr 2018 17:12:08 -0400 Subject: [PATCH 08/20] Docs --- .../RestClientDocumentation.java | 135 +++++++----------- docs/java-rest/low-level/usage.asciidoc | 109 +++++--------- 2 files changed, 87 insertions(+), 157 deletions(-) diff --git a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java index 1bad6b5f6d6fd..7425f27e1bfc1 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java +++ b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java @@ -27,7 +27,9 @@ import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.RequestConfig; +import org.apache.http.entity.BasicHttpEntity; import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.impl.nio.reactor.IOReactorConfig; @@ -37,6 +39,7 @@ import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.elasticsearch.client.HttpAsyncResponseConsumerFactory; +import org.elasticsearch.client.Request; import org.elasticsearch.client.Response; import org.elasticsearch.client.ResponseListener; import org.elasticsearch.client.RestClient; @@ -134,107 +137,62 @@ public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpCli } { - //tag::rest-client-verb-endpoint - Response response = restClient.performRequest("GET", "/"); // <1> - //end::rest-client-verb-endpoint + //tag::rest-client-sync + Request request = new Request( + "GET", // <1> + "/"); // <2> + Response response = restClient.performRequest(request); + //end::rest-client-sync } { - //tag::rest-client-headers - Response response = restClient.performRequest("GET", "/", new BasicHeader("header", "value")); - //end::rest-client-headers - } - { - //tag::rest-client-verb-endpoint-params - Map params = Collections.singletonMap("pretty", "true"); - Response response = restClient.performRequest("GET", "/", params); // <1> - //end::rest-client-verb-endpoint-params - } - { - //tag::rest-client-verb-endpoint-params-body - Map params = Collections.emptyMap(); - String jsonString = "{" + - "\"user\":\"kimchy\"," + - "\"postDate\":\"2013-01-30\"," + - "\"message\":\"trying out Elasticsearch\"" + - "}"; - HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON); - Response response = restClient.performRequest("PUT", "/posts/doc/1", params, entity); // <1> - //end::rest-client-verb-endpoint-params-body - } - { - //tag::rest-client-response-consumer - Map params = Collections.emptyMap(); - HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory consumerFactory = - new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024); - Response response = restClient.performRequest("GET", "/posts/_search", params, null, consumerFactory); // <1> - //end::rest-client-response-consumer - } - { - //tag::rest-client-verb-endpoint-async - ResponseListener responseListener = new ResponseListener() { + //tag::rest-client-async + Request request = new Request( + "GET", // <1> + "/"); // <2> + restClient.performRequestAsync(request, new ResponseListener() { @Override public void onSuccess(Response response) { - // <1> + // <3> } @Override public void onFailure(Exception exception) { - // <2> + // <4> } - }; - restClient.performRequestAsync("GET", "/", responseListener); // <3> - //end::rest-client-verb-endpoint-async - - //tag::rest-client-headers-async - Header[] headers = { - new BasicHeader("header1", "value1"), - new BasicHeader("header2", "value2") - }; - restClient.performRequestAsync("GET", "/", responseListener, headers); - //end::rest-client-headers-async - - //tag::rest-client-verb-endpoint-params-async - Map params = Collections.singletonMap("pretty", "true"); - restClient.performRequestAsync("GET", "/", params, responseListener); // <1> - //end::rest-client-verb-endpoint-params-async - - //tag::rest-client-verb-endpoint-params-body-async - String jsonString = "{" + - "\"user\":\"kimchy\"," + - "\"postDate\":\"2013-01-30\"," + - "\"message\":\"trying out Elasticsearch\"" + - "}"; - HttpEntity entity = new NStringEntity(jsonString, ContentType.APPLICATION_JSON); - restClient.performRequestAsync("PUT", "/posts/doc/1", params, entity, responseListener); // <1> - //end::rest-client-verb-endpoint-params-body-async - - //tag::rest-client-response-consumer-async - HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory consumerFactory = - new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024); - restClient.performRequestAsync("GET", "/posts/_search", params, null, consumerFactory, responseListener); // <1> - //end::rest-client-response-consumer-async + }); + //end::rest-client-async } { - //tag::rest-client-response2 - Response response = restClient.performRequest("GET", "/"); - RequestLine requestLine = response.getRequestLine(); // <1> - HttpHost host = response.getHost(); // <2> - int statusCode = response.getStatusLine().getStatusCode(); // <3> - Header[] headers = response.getHeaders(); // <4> - String responseBody = EntityUtils.toString(response.getEntity()); // <5> - //end::rest-client-response2 + Request request = new Request("GET", "/"); + //tag::rest-client-parameters + request.setParameters( + Collections.singletonMap("pretty", "true")); + //end::rest-client-parameters + //tag::rest-client-body + request.setEntity(new StringEntity( + "{\"json\":\"text\"}", + ContentType.APPLICATION_JSON)); + //end::rest-client-body + //tag::rest-client-headers + request.setHeaders( + new BasicHeader("Accept", "text/plain"), + new BasicHeader("Cache-Control", "no-cache")); + //end::rest-client-headers + //tag::rest-client-response-consumer + request.setHttpAsyncResponseConsumerFactory( + new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024)); + //end::rest-client-response-consumer } { HttpEntity[] documents = new HttpEntity[10]; //tag::rest-client-async-example final CountDownLatch latch = new CountDownLatch(documents.length); for (int i = 0; i < documents.length; i++) { + Request request = new Request("PUT", "/posts/doc/" + i); + //let's assume that the documents are stored in an HttpEntity array + request.setEntity(documents[i]); restClient.performRequestAsync( - "PUT", - "/posts/doc/" + i, - Collections.emptyMap(), - //let's assume that the documents are stored in an HttpEntity array - documents[i], + request, new ResponseListener() { @Override public void onSuccess(Response response) { @@ -253,7 +211,16 @@ public void onFailure(Exception exception) { latch.await(); //end::rest-client-async-example } - + { + //tag::rest-client-response2 + Response response = restClient.performRequest("GET", "/"); + RequestLine requestLine = response.getRequestLine(); // <1> + HttpHost host = response.getHost(); // <2> + int statusCode = response.getStatusLine().getStatusCode(); // <3> + Header[] headers = response.getHeaders(); // <4> + String responseBody = EntityUtils.toString(response.getEntity()); // <5> + //end::rest-client-response2 + } } @SuppressWarnings("unused") diff --git a/docs/java-rest/low-level/usage.asciidoc b/docs/java-rest/low-level/usage.asciidoc index db27b886b4178..f31233096c30c 100644 --- a/docs/java-rest/low-level/usage.asciidoc +++ b/docs/java-rest/low-level/usage.asciidoc @@ -218,93 +218,70 @@ http://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/apidocs/org/ [[java-rest-low-usage-requests]] === Performing requests -Once the `RestClient` has been created, requests can be sent by calling one of -the available `performRequest` or `performRequestAsync` method variants. -The `performRequest` methods are synchronous and return the `Response` directly, -meaning that the client will block and wait for a response to be returned. -The `performRequestAsync` variants return `void` and accept an extra -`ResponseListener` as an argument instead, meaning that they are executed -asynchronously. The provided listener will be notified upon request completion -or failure. +Once the `RestClient` has been created, requests can be sent by calling either +`performRequest` or `performRequestAsync`. `performRequest` is synchronous and +will block the calling thread and return the `Response` when the request is +complete. `performRequestAsync` is asynchronous and accepts a `ResponseListener` +argument that it will call with the request is complete or fails. -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint] --------------------------------------------------- -<1> Send a request by providing only the verb and the endpoint, minimum set -of required arguments +This is synchronous: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint-params] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-sync] -------------------------------------------------- -<1> Send a request by providing the verb, the endpoint, and some querystring -parameter +<1> The HTTP method (`GET`, `POST`, `HEAD`, etc) +<2> The endpoint on the server + +And this is asynchronous: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint-params-body] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-async] -------------------------------------------------- -<1> Send a request by providing the verb, the endpoint, optional querystring -parameters and the request body enclosed in an `org.apache.http.HttpEntity` -object +<1> The HTTP method (`GET`, `POST`, `HEAD`, etc) +<2> The endpoint on the server +<3> Handle the response +<4> Handle the failure -IMPORTANT: The `ContentType` specified for the `HttpEntity` is important -because it will be used to set the `Content-Type` header so that Elasticsearch -can properly parse the content. +You can set the request parameters on the request object: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-response-consumer] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-parameters] -------------------------------------------------- -<1> Send a request by providing the verb, the endpoint, optional querystring -parameters, optional request body and the optional factory that is used to -create an http://hc.apache.org/httpcomponents-core-ga/httpcore-nio/apidocs/org/apache/http/nio/protocol/HttpAsyncResponseConsumer.html[`org.apache.http.nio.protocol.HttpAsyncResponseConsumer`] -callback instance per request attempt. Controls how the response body gets -streamed from a non-blocking HTTP connection on the client side. When not -provided, the default implementation is used which buffers the whole response -body in heap memory, up to 100 MB. -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint-async] --------------------------------------------------- -<1> Define what needs to happen when the request is successfully performed -<2> Define what needs to happen when the request fails, meaning whenever -there's a connection error or a response with error status code is returned. -<3> Send an async request by providing only the verb, the endpoint, and the -response listener to be notified once the request is completed, minimum set -of required arguments +You can set the body of the request to any `HttpEntity`: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint-params-async] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-body] -------------------------------------------------- -<1> Send an async request by providing the verb, the endpoint, some querystring -parameter and the response listener to be notified once the request is completed + +IMPORTANT: The `ContentType` specified for the `HttpEntity` is important +because it will be used to set the `Content-Type` header so that Elasticsearch +can properly parse the content. + +And you can set a list of headers to send with the request: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-verb-endpoint-params-body-async] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-headers] -------------------------------------------------- -<1> Send an async request by providing the verb, the endpoint, optional -querystring parameters, the request body enclosed in an -`org.apache.http.HttpEntity` object and the response listener to be -notified once the request is completed + +You can also customize the response consumer used to buffer the asynchronous +responses: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-response-consumer-async] +include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-response-consumer] -------------------------------------------------- -<1> Send an async request by providing the verb, the endpoint, optional -querystring parameters, optional request body and the optional factory that is -used to create an http://hc.apache.org/httpcomponents-core-ga/httpcore-nio/apidocs/org/apache/http/nio/protocol/HttpAsyncResponseConsumer.html[`org.apache.http.nio.protocol.HttpAsyncResponseConsumer`] -callback instance per request attempt. Controls how the response body gets -streamed from a non-blocking HTTP connection on the client side. When not -provided, the default implementation is used which buffers the whole response -body in heap memory, up to 100 MB. -The following is a basic example of how async requests can be sent: +==== Multiple parallel asynchronous actions + +The client is quite happy to execute many actions in parallel. The following +example indexes many documents in parallel. In a real world scenario you'd +probably want to use the `_bulk` API instead, but the example is illustative. ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- @@ -314,19 +291,6 @@ include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-async-examp <2> Handle the returned exception, due to communication error or a response with status code that indicates an error -Each of the above listed method supports sending headers along with the -request through a `Header` varargs argument as in the following examples: - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-headers] --------------------------------------------------- - -["source","java",subs="attributes,callouts,macros"] --------------------------------------------------- -include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-headers-async] --------------------------------------------------- - [[java-rest-low-usage-responses]] === Reading responses @@ -396,4 +360,3 @@ still yields the same response as it did. Enable trace logging for the `tracer` package to have such log lines printed out. Do note that this type of logging is expensive and should not be enabled at all times in production environments, but rather temporarily used only when needed. - From 28bb2a6ee8ec8cef419f32c15a672a6ed88292ce Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 11:40:35 -0400 Subject: [PATCH 09/20] Fixup words --- .../main/java/org/elasticsearch/client/Request.java | 2 +- docs/java-rest/low-level/usage.asciidoc | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 44ba9f03fc383..8b5d8c666771d 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -28,7 +28,7 @@ import java.util.Objects; /** - * Request to Elasticsearch. + * HTTP Request to Elasticsearch. */ public final class Request { private static final Header[] NO_HEADERS = new Header[0]; diff --git a/docs/java-rest/low-level/usage.asciidoc b/docs/java-rest/low-level/usage.asciidoc index f31233096c30c..8f8a8a01736b7 100644 --- a/docs/java-rest/low-level/usage.asciidoc +++ b/docs/java-rest/low-level/usage.asciidoc @@ -221,8 +221,9 @@ http://hc.apache.org/httpcomponents-asyncclient-dev/httpasyncclient/apidocs/org/ Once the `RestClient` has been created, requests can be sent by calling either `performRequest` or `performRequestAsync`. `performRequest` is synchronous and will block the calling thread and return the `Response` when the request is -complete. `performRequestAsync` is asynchronous and accepts a `ResponseListener` -argument that it will call with the request is complete or fails. +successful or throw an exception if it fails. `performRequestAsync` is +asynchronous and accepts a `ResponseListener` argument that it calls with a +`Response` when the request is successful or with an `Exception` if it4 fails. This is synchronous: @@ -270,7 +271,10 @@ include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-headers] -------------------------------------------------- You can also customize the response consumer used to buffer the asynchronous -responses: +responses. The default consumer will buffer up to 100MB of response on the +JVM heap. If the response is larger then the request will fail. You could, +for example, lower the maximum size which might be useful if you are running +in a heap constrained environment: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- From a75ffd2ccdab5de8a344f6c62f2d263d64dd0554 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 12:06:40 -0400 Subject: [PATCH 10/20] Rename to RequestConverters --- .../elasticsearch/client/ClusterClient.java | 4 +- .../elasticsearch/client/IndicesClient.java | 64 +++++----- ...elRequests.java => RequestConverters.java} | 4 +- .../client/RestHighLevelClient.java | 52 ++++---- ...Tests.java => RequestConvertersTests.java} | 114 +++++++++--------- .../client/RestHighLevelClientTests.java | 4 +- .../org/elasticsearch/client/Request.java | 1 + 7 files changed, 122 insertions(+), 121 deletions(-) rename client/rest-high-level/src/main/java/org/elasticsearch/client/{HighLevelRequests.java => RequestConverters.java} (99%) rename client/rest-high-level/src/test/java/org/elasticsearch/client/{HighLevelRequestsTests.java => RequestConvertersTests.java} (95%) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java index 8a5728cf966fe..f3c84db79d65f 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/ClusterClient.java @@ -48,7 +48,7 @@ public final class ClusterClient { */ public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, HighLevelRequests::clusterPutSettings, + return restHighLevelClient.performRequestAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, emptySet(), headers); } @@ -60,7 +60,7 @@ public ClusterUpdateSettingsResponse putSettings(ClusterUpdateSettingsRequest cl */ public void putSettingsAsync(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, HighLevelRequests::clusterPutSettings, + restHighLevelClient.performRequestAsyncAndParseEntity(clusterUpdateSettingsRequest, RequestConverters::clusterPutSettings, ClusterUpdateSettingsResponse::fromXContent, listener, emptySet(), headers); } } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java index 82ce1a7128d40..445fd7c6a99b6 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java @@ -74,7 +74,7 @@ public final class IndicesClient { * Delete Index API on elastic.co */ public DeleteIndexResponse delete(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(deleteIndexRequest, HighLevelRequests::deleteIndex, + return restHighLevelClient.performRequestAndParseEntity(deleteIndexRequest, RequestConverters::deleteIndex, DeleteIndexResponse::fromXContent, emptySet(), headers); } @@ -85,7 +85,7 @@ public DeleteIndexResponse delete(DeleteIndexRequest deleteIndexRequest, Header. * Delete Index API on elastic.co */ public void deleteAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(deleteIndexRequest, HighLevelRequests::deleteIndex, + restHighLevelClient.performRequestAsyncAndParseEntity(deleteIndexRequest, RequestConverters::deleteIndex, DeleteIndexResponse::fromXContent, listener, emptySet(), headers); } @@ -96,7 +96,7 @@ public void deleteAsync(DeleteIndexRequest deleteIndexRequest, ActionListener */ public CreateIndexResponse create(CreateIndexRequest createIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(createIndexRequest, HighLevelRequests::createIndex, + return restHighLevelClient.performRequestAndParseEntity(createIndexRequest, RequestConverters::createIndex, CreateIndexResponse::fromXContent, emptySet(), headers); } @@ -107,7 +107,7 @@ public CreateIndexResponse create(CreateIndexRequest createIndexRequest, Header. * Create Index API on elastic.co */ public void createAsync(CreateIndexRequest createIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(createIndexRequest, HighLevelRequests::createIndex, + restHighLevelClient.performRequestAsyncAndParseEntity(createIndexRequest, RequestConverters::createIndex, CreateIndexResponse::fromXContent, listener, emptySet(), headers); } @@ -118,7 +118,7 @@ public void createAsync(CreateIndexRequest createIndexRequest, ActionListener */ public PutMappingResponse putMapping(PutMappingRequest putMappingRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(putMappingRequest, HighLevelRequests::putMapping, + return restHighLevelClient.performRequestAndParseEntity(putMappingRequest, RequestConverters::putMapping, PutMappingResponse::fromXContent, emptySet(), headers); } @@ -130,7 +130,7 @@ public PutMappingResponse putMapping(PutMappingRequest putMappingRequest, Header */ public void putMappingAsync(PutMappingRequest putMappingRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(putMappingRequest, HighLevelRequests::putMapping, + restHighLevelClient.performRequestAsyncAndParseEntity(putMappingRequest, RequestConverters::putMapping, PutMappingResponse::fromXContent, listener, emptySet(), headers); } @@ -142,7 +142,7 @@ public void putMappingAsync(PutMappingRequest putMappingRequest, ActionListener< * Index Aliases API on elastic.co */ public IndicesAliasesResponse updateAliases(IndicesAliasesRequest indicesAliasesRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(indicesAliasesRequest, HighLevelRequests::updateAliases, + return restHighLevelClient.performRequestAndParseEntity(indicesAliasesRequest, RequestConverters::updateAliases, IndicesAliasesResponse::fromXContent, emptySet(), headers); } @@ -155,7 +155,7 @@ public IndicesAliasesResponse updateAliases(IndicesAliasesRequest indicesAliases */ public void updateAliasesAsync(IndicesAliasesRequest indicesAliasesRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(indicesAliasesRequest, HighLevelRequests::updateAliases, + restHighLevelClient.performRequestAsyncAndParseEntity(indicesAliasesRequest, RequestConverters::updateAliases, IndicesAliasesResponse::fromXContent, listener, emptySet(), headers); } @@ -166,7 +166,7 @@ public void updateAliasesAsync(IndicesAliasesRequest indicesAliasesRequest, Acti * Open Index API on elastic.co */ public OpenIndexResponse open(OpenIndexRequest openIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(openIndexRequest, HighLevelRequests::openIndex, + return restHighLevelClient.performRequestAndParseEntity(openIndexRequest, RequestConverters::openIndex, OpenIndexResponse::fromXContent, emptySet(), headers); } @@ -177,7 +177,7 @@ public OpenIndexResponse open(OpenIndexRequest openIndexRequest, Header... heade * Open Index API on elastic.co */ public void openAsync(OpenIndexRequest openIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(openIndexRequest, HighLevelRequests::openIndex, + restHighLevelClient.performRequestAsyncAndParseEntity(openIndexRequest, RequestConverters::openIndex, OpenIndexResponse::fromXContent, listener, emptySet(), headers); } @@ -188,7 +188,7 @@ public void openAsync(OpenIndexRequest openIndexRequest, ActionListener */ public CloseIndexResponse close(CloseIndexRequest closeIndexRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(closeIndexRequest, HighLevelRequests::closeIndex, + return restHighLevelClient.performRequestAndParseEntity(closeIndexRequest, RequestConverters::closeIndex, CloseIndexResponse::fromXContent, emptySet(), headers); } @@ -199,7 +199,7 @@ public CloseIndexResponse close(CloseIndexRequest closeIndexRequest, Header... h * Close Index API on elastic.co */ public void closeAsync(CloseIndexRequest closeIndexRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(closeIndexRequest, HighLevelRequests::closeIndex, + restHighLevelClient.performRequestAsyncAndParseEntity(closeIndexRequest, RequestConverters::closeIndex, CloseIndexResponse::fromXContent, listener, emptySet(), headers); } @@ -210,7 +210,7 @@ public void closeAsync(CloseIndexRequest closeIndexRequest, ActionListener */ public boolean existsAlias(GetAliasesRequest getAliasesRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequest(getAliasesRequest, HighLevelRequests::existsAlias, + return restHighLevelClient.performRequest(getAliasesRequest, RequestConverters::existsAlias, RestHighLevelClient::convertExistsResponse, emptySet(), headers); } @@ -221,7 +221,7 @@ public boolean existsAlias(GetAliasesRequest getAliasesRequest, Header... header * Indices Aliases API on elastic.co */ public void existsAliasAsync(GetAliasesRequest getAliasesRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsync(getAliasesRequest, HighLevelRequests::existsAlias, + restHighLevelClient.performRequestAsync(getAliasesRequest, RequestConverters::existsAlias, RestHighLevelClient::convertExistsResponse, listener, emptySet(), headers); } @@ -231,7 +231,7 @@ public void existsAliasAsync(GetAliasesRequest getAliasesRequest, ActionListener * See Refresh API on elastic.co */ public RefreshResponse refresh(RefreshRequest refreshRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(refreshRequest, HighLevelRequests::refresh, RefreshResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(refreshRequest, RequestConverters::refresh, RefreshResponse::fromXContent, emptySet(), headers); } @@ -241,7 +241,7 @@ public RefreshResponse refresh(RefreshRequest refreshRequest, Header... headers) * See Refresh API on elastic.co */ public void refreshAsync(RefreshRequest refreshRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(refreshRequest, HighLevelRequests::refresh, RefreshResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(refreshRequest, RequestConverters::refresh, RefreshResponse::fromXContent, listener, emptySet(), headers); } @@ -251,7 +251,7 @@ public void refreshAsync(RefreshRequest refreshRequest, ActionListener Flush API on elastic.co */ public FlushResponse flush(FlushRequest flushRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(flushRequest, HighLevelRequests::flush, FlushResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(flushRequest, RequestConverters::flush, FlushResponse::fromXContent, emptySet(), headers); } @@ -261,7 +261,7 @@ public FlushResponse flush(FlushRequest flushRequest, Header... headers) throws * See Flush API on elastic.co */ public void flushAsync(FlushRequest flushRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(flushRequest, HighLevelRequests::flush, FlushResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(flushRequest, RequestConverters::flush, FlushResponse::fromXContent, listener, emptySet(), headers); } @@ -272,7 +272,7 @@ public void flushAsync(FlushRequest flushRequest, ActionListener * Force Merge API on elastic.co */ public ForceMergeResponse forceMerge(ForceMergeRequest forceMergeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(forceMergeRequest, HighLevelRequests::forceMerge, + return restHighLevelClient.performRequestAndParseEntity(forceMergeRequest, RequestConverters::forceMerge, ForceMergeResponse::fromXContent, emptySet(), headers); } @@ -283,7 +283,7 @@ public ForceMergeResponse forceMerge(ForceMergeRequest forceMergeRequest, Header * Force Merge API on elastic.co */ public void forceMergeAsync(ForceMergeRequest forceMergeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(forceMergeRequest, HighLevelRequests::forceMerge, + restHighLevelClient.performRequestAsyncAndParseEntity(forceMergeRequest, RequestConverters::forceMerge, ForceMergeResponse::fromXContent, listener, emptySet(), headers); } @@ -294,7 +294,7 @@ public void forceMergeAsync(ForceMergeRequest forceMergeRequest, ActionListener< * Clear Cache API on elastic.co */ public ClearIndicesCacheResponse clearCache(ClearIndicesCacheRequest clearIndicesCacheRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(clearIndicesCacheRequest, HighLevelRequests::clearCache, + return restHighLevelClient.performRequestAndParseEntity(clearIndicesCacheRequest, RequestConverters::clearCache, ClearIndicesCacheResponse::fromXContent, emptySet(), headers); } @@ -306,7 +306,7 @@ public ClearIndicesCacheResponse clearCache(ClearIndicesCacheRequest clearIndice */ public void clearCacheAsync(ClearIndicesCacheRequest clearIndicesCacheRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(clearIndicesCacheRequest, HighLevelRequests::clearCache, + restHighLevelClient.performRequestAsyncAndParseEntity(clearIndicesCacheRequest, RequestConverters::clearCache, ClearIndicesCacheResponse::fromXContent, listener, emptySet(), headers); } @@ -319,7 +319,7 @@ public void clearCacheAsync(ClearIndicesCacheRequest clearIndicesCacheRequest, A public boolean exists(GetIndexRequest request, Header... headers) throws IOException { return restHighLevelClient.performRequest( request, - HighLevelRequests::indicesExist, + RequestConverters::indicesExist, RestHighLevelClient::convertExistsResponse, Collections.emptySet(), headers @@ -335,7 +335,7 @@ public boolean exists(GetIndexRequest request, Header... headers) throws IOExcep public void existsAsync(GetIndexRequest request, ActionListener listener, Header... headers) { restHighLevelClient.performRequestAsync( request, - HighLevelRequests::indicesExist, + RequestConverters::indicesExist, RestHighLevelClient::convertExistsResponse, listener, Collections.emptySet(), @@ -350,7 +350,7 @@ public void existsAsync(GetIndexRequest request, ActionListener listene * Shrink Index API on elastic.co */ public ResizeResponse shrink(ResizeRequest resizeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(resizeRequest, HighLevelRequests::shrink, ResizeResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(resizeRequest, RequestConverters::shrink, ResizeResponse::fromXContent, emptySet(), headers); } @@ -361,7 +361,7 @@ public ResizeResponse shrink(ResizeRequest resizeRequest, Header... headers) thr * Shrink Index API on elastic.co */ public void shrinkAsync(ResizeRequest resizeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, HighLevelRequests::shrink, ResizeResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, RequestConverters::shrink, ResizeResponse::fromXContent, listener, emptySet(), headers); } @@ -372,7 +372,7 @@ public void shrinkAsync(ResizeRequest resizeRequest, ActionListener */ public ResizeResponse split(ResizeRequest resizeRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(resizeRequest, HighLevelRequests::split, ResizeResponse::fromXContent, + return restHighLevelClient.performRequestAndParseEntity(resizeRequest, RequestConverters::split, ResizeResponse::fromXContent, emptySet(), headers); } @@ -383,7 +383,7 @@ public ResizeResponse split(ResizeRequest resizeRequest, Header... headers) thro * Split Index API on elastic.co */ public void splitAsync(ResizeRequest resizeRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, HighLevelRequests::split, ResizeResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(resizeRequest, RequestConverters::split, ResizeResponse::fromXContent, listener, emptySet(), headers); } @@ -394,7 +394,7 @@ public void splitAsync(ResizeRequest resizeRequest, ActionListener */ public RolloverResponse rollover(RolloverRequest rolloverRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(rolloverRequest, HighLevelRequests::rollover, + return restHighLevelClient.performRequestAndParseEntity(rolloverRequest, RequestConverters::rollover, RolloverResponse::fromXContent, emptySet(), headers); } @@ -405,7 +405,7 @@ public RolloverResponse rollover(RolloverRequest rolloverRequest, Header... head * Rollover Index API on elastic.co */ public void rolloverAsync(RolloverRequest rolloverRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(rolloverRequest, HighLevelRequests::rollover, RolloverResponse::fromXContent, + restHighLevelClient.performRequestAsyncAndParseEntity(rolloverRequest, RequestConverters::rollover, RolloverResponse::fromXContent, listener, emptySet(), headers); } @@ -416,7 +416,7 @@ public void rolloverAsync(RolloverRequest rolloverRequest, ActionListener */ public UpdateSettingsResponse putSettings(UpdateSettingsRequest updateSettingsRequest, Header... headers) throws IOException { - return restHighLevelClient.performRequestAndParseEntity(updateSettingsRequest, HighLevelRequests::indexPutSettings, + return restHighLevelClient.performRequestAndParseEntity(updateSettingsRequest, RequestConverters::indexPutSettings, UpdateSettingsResponse::fromXContent, emptySet(), headers); } @@ -428,7 +428,7 @@ public UpdateSettingsResponse putSettings(UpdateSettingsRequest updateSettingsRe */ public void putSettingsAsync(UpdateSettingsRequest updateSettingsRequest, ActionListener listener, Header... headers) { - restHighLevelClient.performRequestAsyncAndParseEntity(updateSettingsRequest, HighLevelRequests::indexPutSettings, + restHighLevelClient.performRequestAsyncAndParseEntity(updateSettingsRequest, RequestConverters::indexPutSettings, UpdateSettingsResponse::fromXContent, listener, emptySet(), headers); } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java similarity index 99% rename from client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java rename to client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index b5f7a4e8d4e06..6c4f203f31bbd 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/HighLevelRequests.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -89,10 +89,10 @@ import java.util.Map; import java.util.StringJoiner; -final class HighLevelRequests { +final class RequestConverters { static final XContentType REQUEST_BODY_CONTENT_TYPE = XContentType.JSON; - private HighLevelRequests() { + private RequestConverters() { // Contains only status utility methods } diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index a72f1e7b375f5..9f28cd4c28489 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -256,7 +256,7 @@ public final ClusterClient cluster() { * See Bulk API on elastic.co */ public final BulkResponse bulk(BulkRequest bulkRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(bulkRequest, HighLevelRequests::bulk, BulkResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(bulkRequest, RequestConverters::bulk, BulkResponse::fromXContent, emptySet(), headers); } /** @@ -265,14 +265,14 @@ public final BulkResponse bulk(BulkRequest bulkRequest, Header... headers) throw * See Bulk API on elastic.co */ public final void bulkAsync(BulkRequest bulkRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(bulkRequest, HighLevelRequests::bulk, BulkResponse::fromXContent, listener, emptySet(), headers); + performRequestAsyncAndParseEntity(bulkRequest, RequestConverters::bulk, BulkResponse::fromXContent, listener, emptySet(), headers); } /** * Pings the remote Elasticsearch cluster and returns true if the ping succeeded, false otherwise */ public final boolean ping(Header... headers) throws IOException { - return performRequest(new MainRequest(), (request) -> HighLevelRequests.ping(), RestHighLevelClient::convertExistsResponse, + return performRequest(new MainRequest(), (request) -> RequestConverters.ping(), RestHighLevelClient::convertExistsResponse, emptySet(), headers); } @@ -280,7 +280,7 @@ public final boolean ping(Header... headers) throws IOException { * Get the cluster info otherwise provided when sending an HTTP request to port 9200 */ public final MainResponse info(Header... headers) throws IOException { - return performRequestAndParseEntity(new MainRequest(), (request) -> HighLevelRequests.info(), + return performRequestAndParseEntity(new MainRequest(), (request) -> RequestConverters.info(), MainResponse::fromXContent, emptySet(), headers); } @@ -290,7 +290,7 @@ public final MainResponse info(Header... headers) throws IOException { * See Get API on elastic.co */ public final GetResponse get(GetRequest getRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(getRequest, HighLevelRequests::get, GetResponse::fromXContent, singleton(404), headers); + return performRequestAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, singleton(404), headers); } /** @@ -299,7 +299,7 @@ public final GetResponse get(GetRequest getRequest, Header... headers) throws IO * See Get API on elastic.co */ public final void getAsync(GetRequest getRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(getRequest, HighLevelRequests::get, GetResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(getRequest, RequestConverters::get, GetResponse::fromXContent, listener, singleton(404), headers); } @@ -309,7 +309,7 @@ public final void getAsync(GetRequest getRequest, ActionListener li * See Multi Get API on elastic.co */ public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(multiGetRequest, HighLevelRequests::multiGet, MultiGetResponse::fromXContent, + return performRequestAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent, singleton(404), headers); } @@ -319,7 +319,7 @@ public final MultiGetResponse multiGet(MultiGetRequest multiGetRequest, Header.. * See Multi Get API on elastic.co */ public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(multiGetRequest, HighLevelRequests::multiGet, MultiGetResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(multiGetRequest, RequestConverters::multiGet, MultiGetResponse::fromXContent, listener, singleton(404), headers); } @@ -329,7 +329,7 @@ public final void multiGetAsync(MultiGetRequest multiGetRequest, ActionListener< * See Get API on elastic.co */ public final boolean exists(GetRequest getRequest, Header... headers) throws IOException { - return performRequest(getRequest, HighLevelRequests::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers); + return performRequest(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, emptySet(), headers); } /** @@ -338,7 +338,7 @@ public final boolean exists(GetRequest getRequest, Header... headers) throws IOE * See Get API on elastic.co */ public final void existsAsync(GetRequest getRequest, ActionListener listener, Header... headers) { - performRequestAsync(getRequest, HighLevelRequests::exists, RestHighLevelClient::convertExistsResponse, listener, + performRequestAsync(getRequest, RequestConverters::exists, RestHighLevelClient::convertExistsResponse, listener, emptySet(), headers); } @@ -348,7 +348,7 @@ public final void existsAsync(GetRequest getRequest, ActionListener lis * See Index API on elastic.co */ public final IndexResponse index(IndexRequest indexRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(indexRequest, HighLevelRequests::index, IndexResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, emptySet(), headers); } /** @@ -357,7 +357,7 @@ public final IndexResponse index(IndexRequest indexRequest, Header... headers) t * See Index API on elastic.co */ public final void indexAsync(IndexRequest indexRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(indexRequest, HighLevelRequests::index, IndexResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(indexRequest, RequestConverters::index, IndexResponse::fromXContent, listener, emptySet(), headers); } @@ -367,7 +367,7 @@ public final void indexAsync(IndexRequest indexRequest, ActionListenerUpdate API on elastic.co */ public final UpdateResponse update(UpdateRequest updateRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(updateRequest, HighLevelRequests::update, UpdateResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, emptySet(), headers); } /** @@ -376,7 +376,7 @@ public final UpdateResponse update(UpdateRequest updateRequest, Header... header * See Update API on elastic.co */ public final void updateAsync(UpdateRequest updateRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(updateRequest, HighLevelRequests::update, UpdateResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(updateRequest, RequestConverters::update, UpdateResponse::fromXContent, listener, emptySet(), headers); } @@ -386,7 +386,7 @@ public final void updateAsync(UpdateRequest updateRequest, ActionListenerDelete API on elastic.co */ public final DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(deleteRequest, HighLevelRequests::delete, DeleteResponse::fromXContent, + return performRequestAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent, singleton(404), headers); } @@ -396,7 +396,7 @@ public final DeleteResponse delete(DeleteRequest deleteRequest, Header... header * See Delete API on elastic.co */ public final void deleteAsync(DeleteRequest deleteRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(deleteRequest, HighLevelRequests::delete, DeleteResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(deleteRequest, RequestConverters::delete, DeleteResponse::fromXContent, listener, Collections.singleton(404), headers); } @@ -406,7 +406,7 @@ public final void deleteAsync(DeleteRequest deleteRequest, ActionListenerSearch API on elastic.co */ public final SearchResponse search(SearchRequest searchRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(searchRequest, HighLevelRequests::search, SearchResponse::fromXContent, emptySet(), headers); + return performRequestAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, emptySet(), headers); } /** @@ -415,7 +415,7 @@ public final SearchResponse search(SearchRequest searchRequest, Header... header * See Search API on elastic.co */ public final void searchAsync(SearchRequest searchRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchRequest, HighLevelRequests::search, SearchResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(searchRequest, RequestConverters::search, SearchResponse::fromXContent, listener, emptySet(), headers); } @@ -426,7 +426,7 @@ public final void searchAsync(SearchRequest searchRequest, ActionListener */ public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(multiSearchRequest, HighLevelRequests::multiSearch, MultiSearchResponse::fromXContext, + return performRequestAndParseEntity(multiSearchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext, emptySet(), headers); } @@ -437,7 +437,7 @@ public final MultiSearchResponse multiSearch(MultiSearchRequest multiSearchReque * elastic.co */ public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchRequest, HighLevelRequests::multiSearch, MultiSearchResponse::fromXContext, listener, + performRequestAsyncAndParseEntity(searchRequest, RequestConverters::multiSearch, MultiSearchResponse::fromXContext, listener, emptySet(), headers); } @@ -448,7 +448,7 @@ public final void multiSearchAsync(MultiSearchRequest searchRequest, ActionListe * API on elastic.co */ public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(searchScrollRequest, HighLevelRequests::searchScroll, SearchResponse::fromXContent, + return performRequestAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent, emptySet(), headers); } @@ -460,7 +460,7 @@ public final SearchResponse searchScroll(SearchScrollRequest searchScrollRequest */ public final void searchScrollAsync(SearchScrollRequest searchScrollRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(searchScrollRequest, HighLevelRequests::searchScroll, SearchResponse::fromXContent, + performRequestAsyncAndParseEntity(searchScrollRequest, RequestConverters::searchScroll, SearchResponse::fromXContent, listener, emptySet(), headers); } @@ -471,7 +471,7 @@ public final void searchScrollAsync(SearchScrollRequest searchScrollRequest, * Clear Scroll API on elastic.co */ public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(clearScrollRequest, HighLevelRequests::clearScroll, ClearScrollResponse::fromXContent, + return performRequestAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent, emptySet(), headers); } @@ -483,7 +483,7 @@ public final ClearScrollResponse clearScroll(ClearScrollRequest clearScrollReque */ public final void clearScrollAsync(ClearScrollRequest clearScrollRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(clearScrollRequest, HighLevelRequests::clearScroll, ClearScrollResponse::fromXContent, + performRequestAsyncAndParseEntity(clearScrollRequest, RequestConverters::clearScroll, ClearScrollResponse::fromXContent, listener, emptySet(), headers); } @@ -494,7 +494,7 @@ public final void clearScrollAsync(ClearScrollRequest clearScrollRequest, * on elastic.co */ public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(rankEvalRequest, HighLevelRequests::rankEval, RankEvalResponse::fromXContent, + return performRequestAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent, emptySet(), headers); } @@ -505,7 +505,7 @@ public final RankEvalResponse rankEval(RankEvalRequest rankEvalRequest, Header.. * on elastic.co */ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(rankEvalRequest, HighLevelRequests::rankEval, RankEvalResponse::fromXContent, listener, + performRequestAsyncAndParseEntity(rankEvalRequest, RequestConverters::rankEval, RankEvalResponse::fromXContent, listener, emptySet(), headers); } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java similarity index 95% rename from client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java rename to client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java index e4b171fa318e4..b428016e6dafd 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/HighLevelRequestsTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java @@ -81,8 +81,8 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.client.HighLevelRequests.EndpointBuilder; -import org.elasticsearch.client.HighLevelRequests.Params; +import org.elasticsearch.client.RequestConverters.EndpointBuilder; +import org.elasticsearch.client.RequestConverters.Params; import org.elasticsearch.index.RandomCreateIndexGenerator; import org.elasticsearch.index.VersionType; import org.elasticsearch.index.query.TermQueryBuilder; @@ -121,8 +121,8 @@ import java.util.function.Supplier; import static java.util.Collections.singletonMap; -import static org.elasticsearch.client.HighLevelRequests.REQUEST_BODY_CONTENT_TYPE; -import static org.elasticsearch.client.HighLevelRequests.enforceSameContentType; +import static org.elasticsearch.client.RequestConverters.REQUEST_BODY_CONTENT_TYPE; +import static org.elasticsearch.client.RequestConverters.enforceSameContentType; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomAliases; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomCreateIndexRequest; import static org.elasticsearch.index.RandomCreateIndexGenerator.randomIndexSettings; @@ -132,9 +132,9 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.Matchers.nullValue; -public class HighLevelRequestsTests extends ESTestCase { +public class RequestConvertersTests extends ESTestCase { public void testPing() { - Request request = HighLevelRequests.ping(); + Request request = RequestConverters.ping(); assertEquals("/", request.getEndpoint()); assertEquals(0, request.getParameters().size()); assertNull(request.getEntity()); @@ -142,7 +142,7 @@ public void testPing() { } public void testInfo() { - Request request = HighLevelRequests.info(); + Request request = RequestConverters.info(); assertEquals("/", request.getEndpoint()); assertEquals(0, request.getParameters().size()); assertNull(request.getEntity()); @@ -150,7 +150,7 @@ public void testInfo() { } public void testGet() { - getAndExistsTest(HighLevelRequests::get, HttpGet.METHOD_NAME); + getAndExistsTest(RequestConverters::get, HttpGet.METHOD_NAME); } public void testMultiGet() throws IOException { @@ -196,7 +196,7 @@ public void testMultiGet() throws IOException { multiGetRequest.add(item); } - Request request = HighLevelRequests.multiGet(multiGetRequest); + Request request = RequestConverters.multiGet(multiGetRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_mget", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); @@ -224,7 +224,7 @@ public void testDelete() { } } - Request request = HighLevelRequests.delete(deleteRequest); + Request request = RequestConverters.delete(deleteRequest); assertEquals("/" + index + "/" + type + "/" + id, request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); @@ -232,7 +232,7 @@ public void testDelete() { } public void testExists() { - getAndExistsTest(HighLevelRequests::exists, HttpHead.METHOD_NAME); + getAndExistsTest(RequestConverters::exists, HttpHead.METHOD_NAME); } public void testIndicesExist() { @@ -246,7 +246,7 @@ public void testIndicesExist() { setRandomHumanReadable(getIndexRequest, expectedParams); setRandomIncludeDefaults(getIndexRequest, expectedParams); - final Request request = HighLevelRequests.indicesExist(getIndexRequest); + final Request request = RequestConverters.indicesExist(getIndexRequest); assertEquals(HttpHead.METHOD_NAME, request.getMethod()); assertEquals("/" + String.join(",", indices), request.getEndpoint()); @@ -255,8 +255,8 @@ public void testIndicesExist() { } public void testIndicesExistEmptyIndices() { - expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.indicesExist(new GetIndexRequest())); - expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.indicesExist(new GetIndexRequest().indices((String[])null))); + expectThrows(IllegalArgumentException.class, () -> RequestConverters.indicesExist(new GetIndexRequest())); + expectThrows(IllegalArgumentException.class, () -> RequestConverters.indicesExist(new GetIndexRequest().indices((String[])null))); } private static void getAndExistsTest(Function requestConverter, String method) { @@ -325,7 +325,7 @@ public void testCreateIndex() throws IOException { setRandomMasterTimeout(createIndexRequest, expectedParams); setRandomWaitForActiveShards(createIndexRequest::waitForActiveShards, expectedParams); - Request request = HighLevelRequests.createIndex(createIndexRequest); + Request request = RequestConverters.createIndex(createIndexRequest); assertEquals("/" + createIndexRequest.index(), request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPut.METHOD_NAME, request.getMethod()); @@ -346,7 +346,7 @@ public void testUpdateAliases() throws IOException { setRandomTimeout(indicesAliasesRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); setRandomMasterTimeout(indicesAliasesRequest, expectedParams); - Request request = HighLevelRequests.updateAliases(indicesAliasesRequest); + Request request = RequestConverters.updateAliases(indicesAliasesRequest); assertEquals("/_aliases", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertToXContentBody(indicesAliasesRequest, request.getEntity()); @@ -366,7 +366,7 @@ public void testPutMapping() throws IOException { setRandomTimeout(putMappingRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); setRandomMasterTimeout(putMappingRequest, expectedParams); - Request request = HighLevelRequests.putMapping(putMappingRequest); + Request request = RequestConverters.putMapping(putMappingRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -391,7 +391,7 @@ public void testDeleteIndex() { setRandomIndicesOptions(deleteIndexRequest::indicesOptions, deleteIndexRequest::indicesOptions, expectedParams); - Request request = HighLevelRequests.deleteIndex(deleteIndexRequest); + Request request = RequestConverters.deleteIndex(deleteIndexRequest); assertEquals("/" + String.join(",", indices), request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); @@ -415,7 +415,7 @@ public void testOpenIndex() { setRandomIndicesOptions(openIndexRequest::indicesOptions, openIndexRequest::indicesOptions, expectedParams); setRandomWaitForActiveShards(openIndexRequest::waitForActiveShards, expectedParams); - Request request = HighLevelRequests.openIndex(openIndexRequest); + Request request = RequestConverters.openIndex(openIndexRequest); StringJoiner endpoint = new StringJoiner("/", "/", "").add(String.join(",", indices)).add("_open"); assertThat(endpoint.toString(), equalTo(request.getEndpoint())); assertThat(expectedParams, equalTo(request.getParameters())); @@ -438,7 +438,7 @@ public void testCloseIndex() { setRandomMasterTimeout(closeIndexRequest, expectedParams); setRandomIndicesOptions(closeIndexRequest::indicesOptions, closeIndexRequest::indicesOptions, expectedParams); - Request request = HighLevelRequests.closeIndex(closeIndexRequest); + Request request = RequestConverters.closeIndex(closeIndexRequest); StringJoiner endpoint = new StringJoiner("/", "/", "").add(String.join(",", indices)).add("_close"); assertThat(endpoint.toString(), equalTo(request.getEndpoint())); assertThat(expectedParams, equalTo(request.getParameters())); @@ -506,7 +506,7 @@ public void testIndex() throws IOException { indexRequest.source(builder); } - Request request = HighLevelRequests.index(indexRequest); + Request request = RequestConverters.index(indexRequest); if (indexRequest.opType() == DocWriteRequest.OpType.CREATE) { assertEquals("/" + index + "/" + type + "/" + id + "/_create", request.getEndpoint()); } else if (id != null) { @@ -536,7 +536,7 @@ public void testRefresh() { } Map expectedParams = new HashMap<>(); setRandomIndicesOptions(refreshRequest::indicesOptions, refreshRequest::indicesOptions, expectedParams); - Request request = HighLevelRequests.refresh(refreshRequest); + Request request = RequestConverters.refresh(refreshRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -568,7 +568,7 @@ public void testFlush() { } expectedParams.put("wait_if_ongoing", Boolean.toString(flushRequest.waitIfOngoing())); - Request request = HighLevelRequests.flush(flushRequest); + Request request = RequestConverters.flush(flushRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -605,7 +605,7 @@ public void testForceMerge() { } expectedParams.put("flush", Boolean.toString(forceMergeRequest.flush())); - Request request = HighLevelRequests.forceMerge(forceMergeRequest); + Request request = RequestConverters.forceMerge(forceMergeRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -645,7 +645,7 @@ public void testClearCache() { expectedParams.put("fields", String.join(",", clearIndicesCacheRequest.fields())); } - Request request = HighLevelRequests.clearCache(clearIndicesCacheRequest); + Request request = RequestConverters.clearCache(clearIndicesCacheRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -718,7 +718,7 @@ public void testUpdate() throws IOException { randomizeFetchSourceContextParams(updateRequest::fetchSource, expectedParams); } - Request request = HighLevelRequests.update(updateRequest); + Request request = RequestConverters.update(updateRequest); assertEquals("/" + index + "/" + type + "/" + id + "/_update", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); @@ -755,7 +755,7 @@ public void testUpdateWithDifferentContentTypes() { UpdateRequest updateRequest = new UpdateRequest(); updateRequest.doc(new IndexRequest().source(singletonMap("field", "doc"), XContentType.JSON)); updateRequest.upsert(new IndexRequest().source(singletonMap("field", "upsert"), XContentType.YAML)); - HighLevelRequests.update(updateRequest); + RequestConverters.update(updateRequest); }); assertEquals("Update request cannot have different content types for doc [JSON] and upsert [YAML] documents", exception.getMessage()); @@ -823,7 +823,7 @@ public void testBulk() throws IOException { bulkRequest.add(docWriteRequest); } - Request request = HighLevelRequests.bulk(bulkRequest); + Request request = RequestConverters.bulk(bulkRequest); assertEquals("/_bulk", request.getEndpoint()); assertEquals(expectedParams, request.getParameters()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); @@ -878,7 +878,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new UpdateRequest("index", "type", "1").script(mockScript("test"))); bulkRequest.add(new DeleteRequest("index", "type", "2")); - Request request = HighLevelRequests.bulk(bulkRequest); + Request request = RequestConverters.bulk(bulkRequest); assertEquals(XContentType.JSON.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { @@ -888,7 +888,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new IndexRequest("index", "type", "0").source(singletonMap("field", "value"), xContentType)); bulkRequest.add(new DeleteRequest("index", "type", "2")); - Request request = HighLevelRequests.bulk(bulkRequest); + Request request = RequestConverters.bulk(bulkRequest); assertEquals(xContentType.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { @@ -900,14 +900,14 @@ public void testBulkWithDifferentContentTypes() throws IOException { updateRequest.upsert(new IndexRequest().source(singletonMap("field", "value"), xContentType)); } - Request request = HighLevelRequests.bulk(new BulkRequest().add(updateRequest)); + Request request = RequestConverters.bulk(new BulkRequest().add(updateRequest)); assertEquals(xContentType.mediaTypeWithoutParameters(), request.getEntity().getContentType().getValue()); } { BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new IndexRequest("index", "type", "0").source(singletonMap("field", "value"), XContentType.SMILE)); bulkRequest.add(new IndexRequest("index", "type", "1").source(singletonMap("field", "value"), XContentType.JSON)); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> RequestConverters.bulk(bulkRequest)); assertEquals("Mismatching content-type found for request with content-type [JSON], " + "previous requests have content-type [SMILE]", exception.getMessage()); } @@ -921,7 +921,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { .doc(new IndexRequest().source(singletonMap("field", "value"), XContentType.JSON)) .upsert(new IndexRequest().source(singletonMap("field", "value"), XContentType.SMILE)) ); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> RequestConverters.bulk(bulkRequest)); assertEquals("Mismatching content-type found for request with content-type [SMILE], " + "previous requests have content-type [JSON]", exception.getMessage()); } @@ -934,7 +934,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { bulkRequest.add(new DeleteRequest("index", "type", "3")); bulkRequest.add(new IndexRequest("index", "type", "4").source(singletonMap("field", "value"), XContentType.JSON)); bulkRequest.add(new IndexRequest("index", "type", "1").source(singletonMap("field", "value"), xContentType)); - IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.bulk(bulkRequest)); + IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () -> RequestConverters.bulk(bulkRequest)); assertEquals("Unsupported content-type found for request with content-type [" + xContentType + "], only JSON and SMILE are supported", exception.getMessage()); } @@ -942,7 +942,7 @@ public void testBulkWithDifferentContentTypes() throws IOException { public void testSearchNullSource() throws IOException { SearchRequest searchRequest = new SearchRequest(); - Request request = HighLevelRequests.search(searchRequest); + Request request = RequestConverters.search(searchRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_search", request.getEndpoint()); assertNull(request.getEntity()); @@ -1037,7 +1037,7 @@ public void testSearch() throws Exception { searchRequest.source(searchSourceBuilder); } - Request request = HighLevelRequests.search(searchRequest); + Request request = RequestConverters.search(searchRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -1091,7 +1091,7 @@ public void testMultiSearch() throws IOException { expectedParams.put("max_concurrent_searches", Integer.toString(multiSearchRequest.maxConcurrentSearchRequests())); } - Request request = HighLevelRequests.multiSearch(multiSearchRequest); + Request request = RequestConverters.multiSearch(multiSearchRequest); assertEquals("/_msearch", request.getEndpoint()); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals(expectedParams, request.getParameters()); @@ -1116,7 +1116,7 @@ public void testSearchScroll() throws IOException { if (randomBoolean()) { searchScrollRequest.scroll(randomPositiveTimeValue()); } - Request request = HighLevelRequests.searchScroll(searchScrollRequest); + Request request = RequestConverters.searchScroll(searchScrollRequest); assertEquals(HttpPost.METHOD_NAME, request.getMethod()); assertEquals("/_search/scroll", request.getEndpoint()); assertEquals(0, request.getParameters().size()); @@ -1130,7 +1130,7 @@ public void testClearScroll() throws IOException { for (int i = 0; i < numScrolls; i++) { clearScrollRequest.addScrollId(randomAlphaOfLengthBetween(5, 10)); } - Request request = HighLevelRequests.clearScroll(clearScrollRequest); + Request request = RequestConverters.clearScroll(clearScrollRequest); assertEquals(HttpDelete.METHOD_NAME, request.getMethod()); assertEquals("/_search/scroll", request.getEndpoint()); assertEquals(0, request.getParameters().size()); @@ -1155,7 +1155,7 @@ public void testExistsAlias() { setRandomLocal(getAliasesRequest, expectedParams); setRandomIndicesOptions(getAliasesRequest::indicesOptions, getAliasesRequest::indicesOptions, expectedParams); - Request request = HighLevelRequests.existsAlias(getAliasesRequest); + Request request = RequestConverters.existsAlias(getAliasesRequest); StringJoiner expectedEndpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { expectedEndpoint.add(String.join(",", indices)); @@ -1174,14 +1174,14 @@ public void testExistsAliasNoAliasNoIndex() { { GetAliasesRequest getAliasesRequest = new GetAliasesRequest(); IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> - HighLevelRequests.existsAlias(getAliasesRequest)); + RequestConverters.existsAlias(getAliasesRequest)); assertEquals("existsAlias requires at least an alias or an index", iae.getMessage()); } { GetAliasesRequest getAliasesRequest = new GetAliasesRequest((String[])null); getAliasesRequest.indices((String[])null); IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> - HighLevelRequests.existsAlias(getAliasesRequest)); + RequestConverters.existsAlias(getAliasesRequest)); assertEquals("existsAlias requires at least an alias or an index", iae.getMessage()); } } @@ -1195,7 +1195,7 @@ public void testRankEval() throws Exception { Map expectedParams = new HashMap<>(); setRandomIndicesOptions(rankEvalRequest::indicesOptions, rankEvalRequest::indicesOptions, expectedParams); - Request request = HighLevelRequests.rankEval(rankEvalRequest); + Request request = RequestConverters.rankEval(rankEvalRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); String index = String.join(",", indices); if (Strings.hasLength(index)) { @@ -1210,25 +1210,25 @@ public void testRankEval() throws Exception { } public void testSplit() throws IOException { - resizeTest(ResizeType.SPLIT, HighLevelRequests::split); + resizeTest(ResizeType.SPLIT, RequestConverters::split); } public void testSplitWrongResizeType() { ResizeRequest resizeRequest = new ResizeRequest("target", "source"); resizeRequest.setResizeType(ResizeType.SHRINK); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.split(resizeRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> RequestConverters.split(resizeRequest)); assertEquals("Wrong resize type [SHRINK] for indices split request", iae.getMessage()); } public void testShrinkWrongResizeType() { ResizeRequest resizeRequest = new ResizeRequest("target", "source"); resizeRequest.setResizeType(ResizeType.SPLIT); - IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> HighLevelRequests.shrink(resizeRequest)); + IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, () -> RequestConverters.shrink(resizeRequest)); assertEquals("Wrong resize type [SPLIT] for indices shrink request", iae.getMessage()); } public void testShrink() throws IOException { - resizeTest(ResizeType.SHRINK, HighLevelRequests::shrink); + resizeTest(ResizeType.SHRINK, RequestConverters::shrink); } private static void resizeTest(ResizeType resizeType, CheckedFunction function) @@ -1267,7 +1267,7 @@ public void testClusterPutSettings() throws IOException { setRandomMasterTimeout(request, expectedParams); setRandomTimeout(request::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); - Request expectedRequest = HighLevelRequests.clusterPutSettings(request); + Request expectedRequest = RequestConverters.clusterPutSettings(request); assertEquals("/_cluster/settings", expectedRequest.getEndpoint()); assertEquals(HttpPut.METHOD_NAME, expectedRequest.getMethod()); assertEquals(expectedParams, expectedRequest.getParameters()); @@ -1300,7 +1300,7 @@ public void testRollover() throws IOException { } setRandomWaitForActiveShards(rolloverRequest.getCreateIndexRequest()::waitForActiveShards, expectedParams); - Request request = HighLevelRequests.rollover(rolloverRequest); + Request request = RequestConverters.rollover(rolloverRequest); if (rolloverRequest.getNewIndexName() == null) { assertEquals("/" + rolloverRequest.getAlias() + "/_rollover", request.getEndpoint()); } else { @@ -1325,7 +1325,7 @@ public void testIndexPutSettings() throws IOException { } } - Request request = HighLevelRequests.indexPutSettings(updateSettingsRequest); + Request request = RequestConverters.indexPutSettings(updateSettingsRequest); StringJoiner endpoint = new StringJoiner("/", "/", ""); if (indices != null && indices.length > 0) { endpoint.add(String.join(",", indices)); @@ -1467,19 +1467,19 @@ public void testEndpointBuilderEncodeParts() { } public void testEndpoint() { - assertEquals("/index/type/id", HighLevelRequests.endpoint("index", "type", "id")); - assertEquals("/index/type/id/_endpoint", HighLevelRequests.endpoint("index", "type", "id", "_endpoint")); - assertEquals("/index1,index2", HighLevelRequests.endpoint(new String[]{"index1", "index2"})); - assertEquals("/index1,index2/_endpoint", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, "_endpoint")); - assertEquals("/index1,index2/type1,type2/_endpoint", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, + assertEquals("/index/type/id", RequestConverters.endpoint("index", "type", "id")); + assertEquals("/index/type/id/_endpoint", RequestConverters.endpoint("index", "type", "id", "_endpoint")); + assertEquals("/index1,index2", RequestConverters.endpoint(new String[]{"index1", "index2"})); + assertEquals("/index1,index2/_endpoint", RequestConverters.endpoint(new String[]{"index1", "index2"}, "_endpoint")); + assertEquals("/index1,index2/type1,type2/_endpoint", RequestConverters.endpoint(new String[]{"index1", "index2"}, new String[]{"type1", "type2"}, "_endpoint")); - assertEquals("/index1,index2/_endpoint/suffix1,suffix2", HighLevelRequests.endpoint(new String[]{"index1", "index2"}, + assertEquals("/index1,index2/_endpoint/suffix1,suffix2", RequestConverters.endpoint(new String[]{"index1", "index2"}, "_endpoint", new String[]{"suffix1", "suffix2"})); } public void testCreateContentType() { final XContentType xContentType = randomFrom(XContentType.values()); - assertEquals(xContentType.mediaTypeWithoutParameters(), HighLevelRequests.createContentType(xContentType).getMimeType()); + assertEquals(xContentType.mediaTypeWithoutParameters(), RequestConverters.createContentType(xContentType).getMimeType()); } public void testEnforceSameContentType() { diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java index 7a2fe220bc6b9..5ca9b05f73adf 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RestHighLevelClientTests.java @@ -182,8 +182,8 @@ public void testClearScroll() throws IOException { private void mockResponse(ToXContent toXContent) throws IOException { Response response = mock(Response.class); - ContentType contentType = ContentType.parse(HighLevelRequests.REQUEST_BODY_CONTENT_TYPE.mediaType()); - String requestBody = toXContent(toXContent, HighLevelRequests.REQUEST_BODY_CONTENT_TYPE, false).utf8ToString(); + ContentType contentType = ContentType.parse(RequestConverters.REQUEST_BODY_CONTENT_TYPE.mediaType()); + String requestBody = toXContent(toXContent, RequestConverters.REQUEST_BODY_CONTENT_TYPE, false).utf8ToString(); when(response.getEntity()).thenReturn(new NStringEntity(requestBody, contentType)); when(restClient.performRequest(any(Request.class))).thenReturn(response); } diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 8b5d8c666771d..448e188c124e1 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -21,6 +21,7 @@ import org.apache.http.Header; import org.apache.http.HttpEntity; +import org.apache.http.nio.protocol.HttpAsyncResponseConsumer; import java.util.Arrays; import java.util.Collections; From 3987664c35dcdfffc85bb9e8942be6bf253cc24e Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 13:25:43 -0400 Subject: [PATCH 11/20] Make parameters final and make clients add to it --- .../client/RequestConverters.java | 99 +++++++------------ .../client/RequestConvertersTests.java | 28 ------ .../org/elasticsearch/client/Request.java | 28 ++++-- .../org/elasticsearch/client/RestClient.java | 24 +++-- .../elasticsearch/client/RequestTests.java | 35 +++++-- .../client/RestClientSingleHostTests.java | 18 ++-- .../RestClientDocumentation.java | 3 +- docs/java-rest/low-level/usage.asciidoc | 2 +- 8 files changed, 108 insertions(+), 129 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index 6c4f203f31bbd..b88b220d94d97 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -100,14 +100,13 @@ static Request delete(DeleteRequest deleteRequest) { String endpoint = endpoint(deleteRequest.index(), deleteRequest.type(), deleteRequest.id()); Request request = new Request(HttpDelete.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withRouting(deleteRequest.routing()); parameters.withTimeout(deleteRequest.timeout()); parameters.withVersion(deleteRequest.version()); parameters.withVersionType(deleteRequest.versionType()); parameters.withRefreshPolicy(deleteRequest.getRefreshPolicy()); parameters.withWaitForActiveShards(deleteRequest.waitForActiveShards()); - request.setParameters(parameters.getParams()); return request; } @@ -115,11 +114,10 @@ static Request deleteIndex(DeleteIndexRequest deleteIndexRequest) { String endpoint = endpoint(deleteIndexRequest.indices()); Request request = new Request(HttpDelete.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(deleteIndexRequest.timeout()); parameters.withMasterTimeout(deleteIndexRequest.masterNodeTimeout()); parameters.withIndicesOptions(deleteIndexRequest.indicesOptions()); - request.setParameters(parameters.getParams()); return request; } @@ -127,12 +125,11 @@ static Request openIndex(OpenIndexRequest openIndexRequest) { String endpoint = endpoint(openIndexRequest.indices(), "_open"); Request request = new Request(HttpPost.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(openIndexRequest.timeout()); parameters.withMasterTimeout(openIndexRequest.masterNodeTimeout()); parameters.withWaitForActiveShards(openIndexRequest.waitForActiveShards()); parameters.withIndicesOptions(openIndexRequest.indicesOptions()); - request.setParameters(parameters.getParams()); return request; } @@ -140,11 +137,10 @@ static Request closeIndex(CloseIndexRequest closeIndexRequest) { String endpoint = endpoint(closeIndexRequest.indices(), "_close"); Request request = new Request(HttpPost.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(closeIndexRequest.timeout()); parameters.withMasterTimeout(closeIndexRequest.masterNodeTimeout()); parameters.withIndicesOptions(closeIndexRequest.indicesOptions()); - request.setParameters(parameters.getParams()); return request; } @@ -152,11 +148,10 @@ static Request createIndex(CreateIndexRequest createIndexRequest) throws IOExcep String endpoint = endpoint(createIndexRequest.indices()); Request request = new Request(HttpPut.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(createIndexRequest.timeout()); parameters.withMasterTimeout(createIndexRequest.masterNodeTimeout()); parameters.withWaitForActiveShards(createIndexRequest.waitForActiveShards()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(createIndexRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -165,10 +160,9 @@ static Request createIndex(CreateIndexRequest createIndexRequest) throws IOExcep static Request updateAliases(IndicesAliasesRequest indicesAliasesRequest) throws IOException { Request request = new Request(HttpPost.METHOD_NAME, "/_aliases"); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(indicesAliasesRequest.timeout()); parameters.withMasterTimeout(indicesAliasesRequest.masterNodeTimeout()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(indicesAliasesRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -182,10 +176,9 @@ static Request putMapping(PutMappingRequest putMappingRequest) throws IOExceptio Request request = new Request(HttpPut.METHOD_NAME, endpoint(putMappingRequest.indices(), "_mapping", putMappingRequest.type())); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(putMappingRequest.timeout()); parameters.withMasterTimeout(putMappingRequest.masterNodeTimeout()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(putMappingRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -195,9 +188,8 @@ static Request refresh(RefreshRequest refreshRequest) { String[] indices = refreshRequest.indices() == null ? Strings.EMPTY_ARRAY : refreshRequest.indices(); Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_refresh")); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withIndicesOptions(refreshRequest.indicesOptions()); - request.setParameters(parameters.getParams()); return request; } @@ -205,11 +197,10 @@ static Request flush(FlushRequest flushRequest) { String[] indices = flushRequest.indices() == null ? Strings.EMPTY_ARRAY : flushRequest.indices(); Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_flush")); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withIndicesOptions(flushRequest.indicesOptions()); parameters.putParam("wait_if_ongoing", Boolean.toString(flushRequest.waitIfOngoing())); parameters.putParam("force", Boolean.toString(flushRequest.force())); - request.setParameters(parameters.getParams()); return request; } @@ -217,12 +208,11 @@ static Request forceMerge(ForceMergeRequest forceMergeRequest) { String[] indices = forceMergeRequest.indices() == null ? Strings.EMPTY_ARRAY : forceMergeRequest.indices(); Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_forcemerge")); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withIndicesOptions(forceMergeRequest.indicesOptions()); parameters.putParam("max_num_segments", Integer.toString(forceMergeRequest.maxNumSegments())); parameters.putParam("only_expunge_deletes", Boolean.toString(forceMergeRequest.onlyExpungeDeletes())); parameters.putParam("flush", Boolean.toString(forceMergeRequest.flush())); - request.setParameters(parameters.getParams()); return request; } @@ -230,13 +220,12 @@ static Request clearCache(ClearIndicesCacheRequest clearIndicesCacheRequest) { String[] indices = clearIndicesCacheRequest.indices() == null ? Strings.EMPTY_ARRAY :clearIndicesCacheRequest.indices(); Request request = new Request(HttpPost.METHOD_NAME, endpoint(indices, "_cache/clear")); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withIndicesOptions(clearIndicesCacheRequest.indicesOptions()); parameters.putParam("query", Boolean.toString(clearIndicesCacheRequest.queryCache())); parameters.putParam("fielddata", Boolean.toString(clearIndicesCacheRequest.fieldDataCache())); parameters.putParam("request", Boolean.toString(clearIndicesCacheRequest.requestCache())); parameters.putParam("fields", String.join(",", clearIndicesCacheRequest.fields())); - request.setParameters(parameters.getParams()); return request; } @@ -247,10 +236,9 @@ static Request info() { static Request bulk(BulkRequest bulkRequest) throws IOException { Request request = new Request(HttpPost.METHOD_NAME, "/_bulk"); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(bulkRequest.timeout()); parameters.withRefreshPolicy(bulkRequest.getRefreshPolicy()); - request.setParameters(parameters.getParams()); // Bulk API only supports newline delimited JSON or Smile. Before executing // the bulk, we need to check that all requests have the same content-type @@ -368,14 +356,13 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { static Request exists(GetRequest getRequest) { Request get = get(getRequest); Request exists = new Request(HttpHead.METHOD_NAME, get.getEndpoint()); - exists.setParameters(get.getParameters()); return exists; } static Request get(GetRequest getRequest) { Request request = new Request(HttpGet.METHOD_NAME, endpoint(getRequest.index(), getRequest.type(), getRequest.id())); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withPreference(getRequest.preference()); parameters.withRouting(getRequest.routing()); parameters.withRefresh(getRequest.refresh()); @@ -384,7 +371,6 @@ static Request get(GetRequest getRequest) { parameters.withVersion(getRequest.version()); parameters.withVersionType(getRequest.versionType()); parameters.withFetchSourceContext(getRequest.fetchSourceContext()); - request.setParameters(parameters.getParams()); return request; } @@ -392,11 +378,10 @@ static Request get(GetRequest getRequest) { static Request multiGet(MultiGetRequest multiGetRequest) throws IOException { Request request = new Request(HttpPost.METHOD_NAME, "/_mget"); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withPreference(multiGetRequest.preference()); parameters.withRealtime(multiGetRequest.realtime()); parameters.withRefresh(multiGetRequest.refresh()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(multiGetRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -408,7 +393,7 @@ static Request index(IndexRequest indexRequest) { String endpoint = endpoint(indexRequest.index(), indexRequest.type(), indexRequest.id(), isCreate ? "_create" : null); Request request = new Request(method, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withRouting(indexRequest.routing()); parameters.withTimeout(indexRequest.timeout()); parameters.withVersion(indexRequest.version()); @@ -416,7 +401,6 @@ static Request index(IndexRequest indexRequest) { parameters.withPipeline(indexRequest.getPipeline()); parameters.withRefreshPolicy(indexRequest.getRefreshPolicy()); parameters.withWaitForActiveShards(indexRequest.waitForActiveShards()); - request.setParameters(parameters.getParams()); BytesRef source = indexRequest.source().toBytesRef(); ContentType contentType = createContentType(indexRequest.getContentType()); @@ -432,7 +416,7 @@ static Request update(UpdateRequest updateRequest) throws IOException { String endpoint = endpoint(updateRequest.index(), updateRequest.type(), updateRequest.id(), "_update"); Request request = new Request(HttpPost.METHOD_NAME, endpoint); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withRouting(updateRequest.routing()); parameters.withTimeout(updateRequest.timeout()); parameters.withRefreshPolicy(updateRequest.getRefreshPolicy()); @@ -442,7 +426,6 @@ static Request update(UpdateRequest updateRequest) throws IOException { parameters.withRetryOnConflict(updateRequest.retryOnConflict()); parameters.withVersion(updateRequest.version()); parameters.withVersionType(updateRequest.versionType()); - request.setParameters(parameters.getParams()); // The Java API allows update requests with different content types // set for the partial document and the upsert document. This client @@ -471,7 +454,7 @@ static Request update(UpdateRequest updateRequest) throws IOException { static Request search(SearchRequest searchRequest) throws IOException { Request request = new Request(HttpPost.METHOD_NAME, endpoint(searchRequest.indices(), searchRequest.types(), "_search")); - Params params = Params.builder(); + Params params = new Params(request); params.putParam(RestSearchAction.TYPED_KEYS_PARAM, "true"); params.withRouting(searchRequest.routing()); params.withPreference(searchRequest.preference()); @@ -487,7 +470,6 @@ static Request search(SearchRequest searchRequest) throws IOException { if (searchRequest.scroll() != null) { params.putParam("scroll", searchRequest.scroll().keepAlive()); } - request.setParameters(params.getParams()); if (searchRequest.source() != null) { request.setEntity(createEntity(searchRequest.source(), REQUEST_BODY_CONTENT_TYPE)); @@ -510,12 +492,11 @@ static Request clearScroll(ClearScrollRequest clearScrollRequest) throws IOExcep static Request multiSearch(MultiSearchRequest multiSearchRequest) throws IOException { Request request = new Request(HttpPost.METHOD_NAME, "/_msearch"); - Params params = Params.builder(); + Params params = new Params(request); params.putParam(RestSearchAction.TYPED_KEYS_PARAM, "true"); if (multiSearchRequest.maxConcurrentSearchRequests() != MultiSearchRequest.MAX_CONCURRENT_SEARCH_REQUESTS_DEFAULT) { params.putParam("max_concurrent_searches", Integer.toString(multiSearchRequest.maxConcurrentSearchRequests())); } - request.setParameters(params.getParams()); XContent xContent = REQUEST_BODY_CONTENT_TYPE.xContent(); byte[] source = MultiSearchRequest.writeMultiLineFormat(multiSearchRequest, xContent); @@ -533,19 +514,17 @@ static Request existsAlias(GetAliasesRequest getAliasesRequest) { Request request = new Request(HttpHead.METHOD_NAME, endpoint(indices, "_alias", aliases)); - Params params = Params.builder(); + Params params = new Params(request); params.withIndicesOptions(getAliasesRequest.indicesOptions()); params.withLocal(getAliasesRequest.local()); - request.setParameters(params.getParams()); return request; } static Request rankEval(RankEvalRequest rankEvalRequest) throws IOException { Request request = new Request(HttpGet.METHOD_NAME, endpoint(rankEvalRequest.indices(), Strings.EMPTY_ARRAY, "_rank_eval")); - Params params = Params.builder(); + Params params = new Params(request); params.withIndicesOptions(rankEvalRequest.indicesOptions()); - request.setParameters(params.getParams()); request.setEntity(createEntity(rankEvalRequest.getRankEvalSpec(), REQUEST_BODY_CONTENT_TYPE)); return request; @@ -571,11 +550,10 @@ private static Request resize(ResizeRequest resizeRequest) throws IOException { .addPathPart(resizeRequest.getTargetIndexRequest().index()).build(); Request request = new Request(HttpPut.METHOD_NAME, endpoint); - Params params = Params.builder(); + Params params = new Params(request); params.withTimeout(resizeRequest.timeout()); params.withMasterTimeout(resizeRequest.masterNodeTimeout()); params.withWaitForActiveShards(resizeRequest.getTargetIndexRequest().waitForActiveShards()); - request.setParameters(params.getParams()); request.setEntity(createEntity(resizeRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -584,10 +562,9 @@ private static Request resize(ResizeRequest resizeRequest) throws IOException { static Request clusterPutSettings(ClusterUpdateSettingsRequest clusterUpdateSettingsRequest) throws IOException { Request request = new Request(HttpPut.METHOD_NAME, "/_cluster/settings"); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(clusterUpdateSettingsRequest.timeout()); parameters.withMasterTimeout(clusterUpdateSettingsRequest.masterNodeTimeout()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(clusterUpdateSettingsRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -598,14 +575,13 @@ static Request rollover(RolloverRequest rolloverRequest) throws IOException { .addPathPart(rolloverRequest.getNewIndexName()).build(); Request request = new Request(HttpPost.METHOD_NAME, endpoint); - Params params = Params.builder(); + Params params = new Params(request); params.withTimeout(rolloverRequest.timeout()); params.withMasterTimeout(rolloverRequest.masterNodeTimeout()); params.withWaitForActiveShards(rolloverRequest.getCreateIndexRequest().waitForActiveShards()); if (rolloverRequest.isDryRun()) { params.putParam("dry_run", Boolean.TRUE.toString()); } - request.setParameters(params.getParams()); request.setEntity(createEntity(rolloverRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -619,12 +595,11 @@ static Request indicesExist(GetIndexRequest getIndexRequest) { String endpoint = endpoint(getIndexRequest.indices(), ""); Request request = new Request(HttpHead.METHOD_NAME, endpoint); - Params params = Params.builder(); + Params params = new Params(request); params.withLocal(getIndexRequest.local()); params.withHuman(getIndexRequest.humanReadable()); params.withIndicesOptions(getIndexRequest.indicesOptions()); params.withIncludeDefaults(getIndexRequest.includeDefaults()); - request.setParameters(params.getParams()); return request; } @@ -632,12 +607,11 @@ static Request indexPutSettings(UpdateSettingsRequest updateSettingsRequest) thr String[] indices = updateSettingsRequest.indices() == null ? Strings.EMPTY_ARRAY : updateSettingsRequest.indices(); Request request = new Request(HttpPut.METHOD_NAME, endpoint(indices, "_settings")); - Params parameters = Params.builder(); + Params parameters = new Params(request); parameters.withTimeout(updateSettingsRequest.timeout()); parameters.withMasterTimeout(updateSettingsRequest.masterNodeTimeout()); parameters.withIndicesOptions(updateSettingsRequest.indicesOptions()); parameters.withPreserveExisting(updateSettingsRequest.isPreserveExisting()); - request.setParameters(parameters.getParams()); request.setEntity(createEntity(updateSettingsRequest, REQUEST_BODY_CONTENT_TYPE)); return request; @@ -689,20 +663,21 @@ public static ContentType createContentType(final XContentType xContentType) { return ContentType.create(xContentType.mediaTypeWithoutParameters(), (Charset) null); } + /** - * Utility class to build request's parameters map and centralize all parameter names. + * Utility class to help with common parameter names and patterns. Wraps + * a {@link Request} and adds the parameters to it directly. */ static class Params { - private final Map params = new HashMap<>(); + private final Request request; - private Params() { + Params(Request request) { + this.request = request; } - Params putParam(String key, String value) { + Params putParam(String name, String value) { if (Strings.hasLength(value)) { - if (params.putIfAbsent(key, value) != null) { - throw new IllegalArgumentException("Request parameter [" + key + "] is already registered"); - } + request.addParameter(name, value); } return this; } @@ -866,14 +841,6 @@ Params withPreserveExisting(boolean preserveExisting) { } return this; } - - Map getParams() { - return Collections.unmodifiableMap(params); - } - - static Params builder() { - return new Params(); - } } /** diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java index b428016e6dafd..048b499208e8c 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java @@ -1343,34 +1343,6 @@ private static void assertToXContentBody(ToXContent expectedBody, HttpEntity act assertEquals(expectedBytes, new BytesArray(EntityUtils.toByteArray(actualEntity))); } - public void testParams() { - final int nbParams = randomIntBetween(0, 10); - Params params = Params.builder(); - Map expectedParams = new HashMap<>(); - for (int i = 0; i < nbParams; i++) { - String paramName = "p_" + i; - String paramValue = randomAlphaOfLength(5); - params.putParam(paramName, paramValue); - expectedParams.put(paramName, paramValue); - } - - Map requestParams = params.getParams(); - assertEquals(nbParams, requestParams.size()); - assertEquals(expectedParams, requestParams); - } - - public void testParamsNoDuplicates() { - Params params = Params.builder(); - params.putParam("test", "1"); - - IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> params.putParam("test", "2")); - assertEquals("Request parameter [test] is already registered", e.getMessage()); - - Map requestParams = params.getParams(); - assertEquals(1L, requestParams.size()); - assertEquals("1", requestParams.values().iterator().next()); - } - public void testEndpointBuilder() { { EndpointBuilder endpointBuilder = new EndpointBuilder(); diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 448e188c124e1..8817d1e92419f 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -24,10 +24,12 @@ import org.apache.http.nio.protocol.HttpAsyncResponseConsumer; import java.util.Arrays; -import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Objects; +import static java.util.Collections.unmodifiableMap; + /** * HTTP Request to Elasticsearch. */ @@ -35,8 +37,8 @@ public final class Request { private static final Header[] NO_HEADERS = new Header[0]; private final String method; private final String endpoint; + private final Map parameters = new HashMap<>(); - private Map parameters = Collections.emptyMap(); private HttpEntity entity; private Header[] headers = NO_HEADERS; private HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory = @@ -67,18 +69,28 @@ public String getEndpoint() { } /** - * Set the query string parameters. Polite users will not manipulate the - * Map after setting it. + * Add a query string parameter. + * @throws IllegalArgumentException if a parameter with that name has already been set */ - public void setParameters(Map parameters) { - this.parameters = Objects.requireNonNull(parameters, "parameters cannot be null");; + public void addParameter(String name, String value) { + Objects.requireNonNull(name, "url parameter name cannot be null"); + Objects.requireNonNull(value, "url parameter value cannot be null"); + // .putIfAbsent(name, value) except we are in Java 7 which doesn't have that. + String oldValue = parameters.get(name); + if (oldValue == null) { + parameters.put(name, value); + } else { + throw new IllegalArgumentException("url parameter [" + name + "] has already been set to [" + oldValue + "]"); + } } /** - * Query string parameters. + * Query string parameters. The returned map cannot be modifed but calls + * to {@link #addParameter(String, String)} are viewable live in the map + * but changes are not synchronized. */ public Map getParameters() { - return parameters; + return unmodifiableMap(parameters); } /** diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index 805baf8051285..b0034f64fa28c 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -236,7 +236,7 @@ public Response performRequest(String method, String endpoint, Header... headers @Deprecated public Response performRequest(String method, String endpoint, Map params, Header... headers) throws IOException { Request request = new Request(method, endpoint); - request.setParameters(params); + addParameters(request, params); request.setHeaders(headers); return performRequest(request); } @@ -262,7 +262,7 @@ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, Header... headers) throws IOException { Request request = new Request(method, endpoint); - request.setParameters(params); + addParameters(request, params); request.setEntity(entity); request.setHeaders(headers); return performRequest(request); @@ -302,7 +302,7 @@ public Response performRequest(String method, String endpoint, Map requestParams = new HashMap<>(request.getParameters()); //ignore is a special parameter supported by the clients, shouldn't be sent to es String ignoreString = requestParams.remove("ignore"); @@ -877,4 +876,15 @@ private static class HostTuple { this.authCache = authCache; } } + + /** + * Add all parameters from a map to a {@link Request}. This only exists + * to support methods that exist for backwards compatibility. + */ + private void addParameters(Request request, Map parameters) { + Objects.requireNonNull(parameters, "parameters cannot be null"); + for (Map.Entry entry : parameters.entrySet()) { + request.addParameter(entry.getKey(), entry.getValue()); + } + } } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java index 33ff97c46f93a..9897ba69501ae 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.client; +import java.util.HashMap; import java.util.Map; import org.apache.http.Header; @@ -27,7 +28,6 @@ import org.apache.http.entity.StringEntity; import org.apache.http.message.BasicHeader; -import static java.util.Collections.singletonMap; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -56,21 +56,42 @@ public void testConstructor() { assertEquals(endpoint, request.getEndpoint()); } - public void testSetParameters() { + public void testAddParameters() { final String method = randomFrom(new String[] {"GET", "PUT", "POST", "HEAD", "DELETE"}); final String endpoint = randomAsciiLettersOfLengthBetween(1, 10); - final Map parameters = singletonMap(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5)); - + int parametersCount = between(1, 3); + final Map parameters = new HashMap<>(parametersCount); + while (parameters.size() < parametersCount) { + parameters.put(randomAsciiLettersOfLength(5), randomAsciiLettersOfLength(5)); + } Request request = new Request(method, endpoint); + + try { + request.addParameter(null, "value"); + fail("expected failure"); + } catch (NullPointerException e) { + assertEquals("url parameter name cannot be null", e.getMessage()); + } try { - request.setParameters(null); + request.addParameter("name", null); fail("expected failure"); } catch (NullPointerException e) { - assertEquals("parameters cannot be null", e.getMessage()); + assertEquals("url parameter value cannot be null", e.getMessage()); } - request.setParameters(parameters); + for (Map.Entry entry : parameters.entrySet()) { + request.addParameter(entry.getKey(), entry.getValue()); + } assertEquals(parameters, request.getParameters()); + + // Test that adding a duplicate parameter fails + request.addParameter("name", "first_value"); + try { + request.addParameter("name", "second_value"); + fail("expected failure"); + } catch (IllegalArgumentException e) { + assertEquals("url parameter [name] has already been set to [first_value]", e.getMessage()); + } } public void testSetEntity() { diff --git a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java index a2493fb2f8647..2d419b213d686 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RestClientSingleHostTests.java @@ -62,6 +62,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; @@ -337,7 +338,7 @@ public void tesPerformRequestOldStyleNullHeaders() throws IOException { * @deprecated will remove method in 7.0 but needs tests until then. Replaced by {@link RequestTests#testSetParameters()}. */ @Deprecated - public void testPerformRequestNullParams() throws IOException { + public void testPerformRequestOldStyleWithNullParams() throws IOException { String method = randomHttpMethod(getRandom()); int statusCode = randomStatusCode(getRandom()); try { @@ -379,15 +380,13 @@ private HttpUriRequest performRandomRequest(String method) throws Exception { String uriAsString = "/" + randomStatusCode(getRandom()); Request request = new Request(method, uriAsString); URIBuilder uriBuilder = new URIBuilder(uriAsString); - Map params = new HashMap<>(); - boolean hasParams = randomBoolean(); - if (hasParams) { + if (randomBoolean()) { int numParams = randomIntBetween(1, 3); for (int i = 0; i < numParams; i++) { - String paramKey = "param-" + i; - String paramValue = randomAsciiAlphanumOfLengthBetween(3, 10); - params.put(paramKey, paramValue); - uriBuilder.addParameter(paramKey, paramValue); + String name = "param-" + i; + String value = randomAsciiAlphanumOfLengthBetween(3, 10); + request.addParameter(name, value); + uriBuilder.addParameter(name, value); } } if (randomBoolean()) { @@ -396,9 +395,8 @@ private HttpUriRequest performRandomRequest(String method) throws Exception { if (randomBoolean()) { ignore += "," + Integer.toString(randomFrom(RestClientTestUtil.getAllErrorStatusCodes())); } - params.put("ignore", ignore); + request.addParameter("ignore", ignore); } - request.setParameters(params); URI uri = uriBuilder.build(); HttpUriRequest expectedRequest; diff --git a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java index 7425f27e1bfc1..aa89a7d76ab26 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java +++ b/client/rest/src/test/java/org/elasticsearch/client/documentation/RestClientDocumentation.java @@ -165,8 +165,7 @@ public void onFailure(Exception exception) { { Request request = new Request("GET", "/"); //tag::rest-client-parameters - request.setParameters( - Collections.singletonMap("pretty", "true")); + request.addParameter("pretty", "true"); //end::rest-client-parameters //tag::rest-client-body request.setEntity(new StringEntity( diff --git a/docs/java-rest/low-level/usage.asciidoc b/docs/java-rest/low-level/usage.asciidoc index 8f8a8a01736b7..5ffc4332a7681 100644 --- a/docs/java-rest/low-level/usage.asciidoc +++ b/docs/java-rest/low-level/usage.asciidoc @@ -245,7 +245,7 @@ include-tagged::{doc-tests}/RestClientDocumentation.java[rest-client-async] <3> Handle the response <4> Handle the failure -You can set the request parameters on the request object: +You can add request parameters to the request object: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- From 7ba95170ff73cc5bb895490e931fd424680f35e8 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 13:37:55 -0400 Subject: [PATCH 12/20] Cleanup --- .../java/org/elasticsearch/client/RequestConverters.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index b88b220d94d97..d766531ce9a25 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -354,12 +354,14 @@ static Request bulk(BulkRequest bulkRequest) throws IOException { } static Request exists(GetRequest getRequest) { - Request get = get(getRequest); - Request exists = new Request(HttpHead.METHOD_NAME, get.getEndpoint()); - return exists; + return getStyleRequest(HttpHead.METHOD_NAME, getRequest); } static Request get(GetRequest getRequest) { + return getStyleRequest(HttpGet.METHOD_NAME, getRequest); + } + + private static Request getStyleRequest(String method, GetRequest getRequest) { Request request = new Request(HttpGet.METHOD_NAME, endpoint(getRequest.index(), getRequest.type(), getRequest.id())); Params parameters = new Params(request); @@ -663,7 +665,6 @@ public static ContentType createContentType(final XContentType xContentType) { return ContentType.create(xContentType.mediaTypeWithoutParameters(), (Charset) null); } - /** * Utility class to help with common parameter names and patterns. Wraps * a {@link Request} and adds the parameters to it directly. From 8f8bba05043c47553c3447c9e3d3a65511078148 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 13:41:58 -0400 Subject: [PATCH 13/20] Update merged code --- .../java/org/elasticsearch/client/RequestConverters.java | 9 ++++----- .../org/elasticsearch/client/RestHighLevelClient.java | 4 ++-- .../org/elasticsearch/client/RequestConvertersTests.java | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index 70768297c8972..db6fa0bb6018a 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -525,13 +525,12 @@ static Request existsAlias(GetAliasesRequest getAliasesRequest) { } static Request fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest) { - Params params = Params.builder(); + Request request = new Request(HttpGet.METHOD_NAME, endpoint(fieldCapabilitiesRequest.indices(), "_field_caps")); + + Params params = new Params(request); params.withFields(fieldCapabilitiesRequest.fields()); params.withIndicesOptions(fieldCapabilitiesRequest.indicesOptions()); - - String[] indices = fieldCapabilitiesRequest.indices(); - String endpoint = endpoint(indices, "_field_caps"); - return new Request(HttpGet.METHOD_NAME, endpoint, params.getParams(), null); + return request; } static Request rankEval(RankEvalRequest rankEvalRequest) throws IOException { diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java index 8451a3ba1a446..9de8a748dadca 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java @@ -519,7 +519,7 @@ public final void rankEvalAsync(RankEvalRequest rankEvalRequest, ActionListener< */ public final FieldCapabilitiesResponse fieldCaps(FieldCapabilitiesRequest fieldCapabilitiesRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(fieldCapabilitiesRequest, Request::fieldCaps, + return performRequestAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, FieldCapabilitiesResponse::fromXContent, emptySet(), headers); } @@ -532,7 +532,7 @@ public final FieldCapabilitiesResponse fieldCaps(FieldCapabilitiesRequest fieldC public final void fieldCapsAsync(FieldCapabilitiesRequest fieldCapabilitiesRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(fieldCapabilitiesRequest, Request::fieldCaps, + performRequestAsyncAndParseEntity(fieldCapabilitiesRequest, RequestConverters::fieldCaps, FieldCapabilitiesResponse::fromXContent, listener, emptySet(), headers); } diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java index f20c24464796c..3f9428a3aea0d 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestConvertersTests.java @@ -1207,7 +1207,7 @@ public void testFieldCaps() { fieldCapabilitiesRequest::indicesOptions, indicesOptionsParams); - Request request = Request.fieldCaps(fieldCapabilitiesRequest); + Request request = RequestConverters.fieldCaps(fieldCapabilitiesRequest); // Verify that the resulting REST request looks as expected. StringJoiner endpoint = new StringJoiner("/", "/", ""); From 72bcab644c88aec99e3d57fb5a296c2d7b2a76bc Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 13:56:34 -0400 Subject: [PATCH 14/20] Ooops --- .../main/java/org/elasticsearch/client/RequestConverters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java index db6fa0bb6018a..69611809d11a4 100644 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/RequestConverters.java @@ -364,7 +364,7 @@ static Request get(GetRequest getRequest) { } private static Request getStyleRequest(String method, GetRequest getRequest) { - Request request = new Request(HttpGet.METHOD_NAME, endpoint(getRequest.index(), getRequest.type(), getRequest.id())); + Request request = new Request(method, endpoint(getRequest.index(), getRequest.type(), getRequest.id())); Params parameters = new Params(request); parameters.withPreference(getRequest.preference()); From ed2975bdc44dd8cbb6716de584e4e35a25f94d69 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Thu, 26 Apr 2018 18:54:08 -0400 Subject: [PATCH 15/20] Woops, null has to work --- .../java/org/elasticsearch/client/Request.java | 14 ++++++++------ .../org/elasticsearch/client/RequestTests.java | 18 +++++++++--------- .../reindex/remote/RemoteRequestBuilders.java | 6 +++++- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 8817d1e92419f..5f9d4acb232f5 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -70,17 +70,19 @@ public String getEndpoint() { /** * Add a query string parameter. - * @throws IllegalArgumentException if a parameter with that name has already been set + * @param name the name of the url parameter. Must not be null. + * @param value the value of the url url parameter. If {@code null} then + * the parameter is sent as {@code name} rather than {@code name=value} + * @throws IllegalArgumentException if a parameter with that name has + * already been set */ public void addParameter(String name, String value) { Objects.requireNonNull(name, "url parameter name cannot be null"); - Objects.requireNonNull(value, "url parameter value cannot be null"); // .putIfAbsent(name, value) except we are in Java 7 which doesn't have that. - String oldValue = parameters.get(name); - if (oldValue == null) { - parameters.put(name, value); + if (parameters.containsKey(name)) { + throw new IllegalArgumentException("url parameter [" + name + "] has already been set to [" + parameters.get(name) + "]"); } else { - throw new IllegalArgumentException("url parameter [" + name + "] has already been set to [" + oldValue + "]"); + parameters.put(name, value); } } diff --git a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java index 9897ba69501ae..98fcf8421ae6a 100644 --- a/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest/src/test/java/org/elasticsearch/client/RequestTests.java @@ -72,25 +72,25 @@ public void testAddParameters() { } catch (NullPointerException e) { assertEquals("url parameter name cannot be null", e.getMessage()); } - try { - request.addParameter("name", null); - fail("expected failure"); - } catch (NullPointerException e) { - assertEquals("url parameter value cannot be null", e.getMessage()); - } for (Map.Entry entry : parameters.entrySet()) { request.addParameter(entry.getKey(), entry.getValue()); } assertEquals(parameters, request.getParameters()); + // Test that adding parameters with a null value is ok. + request.addParameter("is_null", null); + parameters.put("is_null", null); + assertEquals(parameters, request.getParameters()); + // Test that adding a duplicate parameter fails - request.addParameter("name", "first_value"); + String firstValue = randomBoolean() ? null : "value"; + request.addParameter("name", firstValue); try { - request.addParameter("name", "second_value"); + request.addParameter("name", randomBoolean() ? firstValue : "second_value"); fail("expected failure"); } catch (IllegalArgumentException e) { - assertEquals("url parameter [name] has already been set to [first_value]", e.getMessage()); + assertEquals("url parameter [name] has already been set to [" + firstValue + "]", e.getMessage()); } } diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteRequestBuilders.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteRequestBuilders.java index 3f6f4bcbc4fe3..063a0ad31f38e 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteRequestBuilders.java +++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/remote/RemoteRequestBuilders.java @@ -79,7 +79,11 @@ static Map initialSearchParams(SearchRequest searchRequest, Vers } params.put("size", Integer.toString(searchRequest.source().size())); if (searchRequest.source().version() == null || searchRequest.source().version() == true) { - // false is the only value that makes it false. Null defaults to true.... + /* + * Passing `null` here just add the `version` request parameter + * without any value. This way of requesting the version works + * for all supported versions of Elasticsearch. + */ params.put("version", null); } if (searchRequest.source().sorts() != null) { From 2b2c75ebf1addebff5333fda7bb5048ef2aeb35d Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 30 Apr 2018 11:44:50 -0400 Subject: [PATCH 16/20] changelog --- docs/CHANGELOG.asciidoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index b46799d7a8edf..c23b468502224 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -37,6 +37,9 @@ written to by an older Elasticsearch after writing to it with a newer Elasticsea === New Features +<> ({pull}29623[#29623]) + === Enhancements === Bug Fixes @@ -46,5 +49,3 @@ Do not ignore request analysis/similarity settings on index resize operations wh === Regressions === Known Issues - - From b4b07b6349df7d94ad3451a80deab59c1398ad38 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 30 Apr 2018 11:45:30 -0400 Subject: [PATCH 17/20] Drop deprecation. We'll deprecate in a followup --- .../org/elasticsearch/client/RestClient.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index b0034f64fa28c..5479de82f3146 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -210,9 +210,7 @@ public void performRequestAsync(Request request, ResponseListener responseListen * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error - * @deprecated Prefer {@link #performRequest(Request)} */ - @Deprecated public Response performRequest(String method, String endpoint, Header... headers) throws IOException { Request request = new Request(method, endpoint); request.setHeaders(headers); @@ -231,9 +229,7 @@ public Response performRequest(String method, String endpoint, Header... headers * @throws IOException in case of a problem or the connection was aborted * @throws ClientProtocolException in case of an http protocol error * @throws ResponseException in case Elasticsearch responded with a status code that indicated an error - * @deprecated Prefer {@link #performRequest(Request)} */ - @Deprecated public Response performRequest(String method, String endpoint, Map params, Header... headers) throws IOException { Request request = new Request(method, endpoint); addParameters(request, params); @@ -256,9 +252,7 @@ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, Header... headers) throws IOException { Request request = new Request(method, endpoint); @@ -295,9 +289,7 @@ public Response performRequest(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, Header... headers) throws IOException { @@ -318,9 +310,7 @@ public Response performRequest(String method, String endpoint, Map params, ResponseListener responseListener, Header... headers) { Request request; @@ -373,9 +361,7 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, ResponseListener responseListener, Header... headers) { Request request; @@ -408,9 +394,7 @@ public void performRequestAsync(String method, String endpoint, Map params, HttpEntity entity, HttpAsyncResponseConsumerFactory httpAsyncResponseConsumerFactory, ResponseListener responseListener, Header... headers) { From c1cc93a6da2343ed8fcb3a7c02bfb53b45e11f44 Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 30 Apr 2018 11:47:16 -0400 Subject: [PATCH 18/20] Cleanup --- .../src/main/java/org/elasticsearch/client/Request.java | 6 +++--- .../src/main/java/org/elasticsearch/client/RestClient.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/rest/src/main/java/org/elasticsearch/client/Request.java b/client/rest/src/main/java/org/elasticsearch/client/Request.java index 5f9d4acb232f5..bf0012339fb41 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest/src/main/java/org/elasticsearch/client/Request.java @@ -87,9 +87,9 @@ public void addParameter(String name, String value) { } /** - * Query string parameters. The returned map cannot be modifed but calls - * to {@link #addParameter(String, String)} are viewable live in the map - * but changes are not synchronized. + * Query string parameters. The returned map is an unmodifiable view of the + * map in the request so calls to {@link #addParameter(String, String)} + * will change it. */ public Map getParameters() { return unmodifiableMap(parameters); diff --git a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java index 5479de82f3146..1d4036c210308 100644 --- a/client/rest/src/main/java/org/elasticsearch/client/RestClient.java +++ b/client/rest/src/main/java/org/elasticsearch/client/RestClient.java @@ -865,7 +865,7 @@ private static class HostTuple { * Add all parameters from a map to a {@link Request}. This only exists * to support methods that exist for backwards compatibility. */ - private void addParameters(Request request, Map parameters) { + private static void addParameters(Request request, Map parameters) { Objects.requireNonNull(parameters, "parameters cannot be null"); for (Map.Entry entry : parameters.entrySet()) { request.addParameter(entry.getKey(), entry.getValue()); From e61fb39064b0aebac136dfcfea924f947333e50b Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Mon, 30 Apr 2018 15:59:50 -0400 Subject: [PATCH 19/20] Fix changelog --- docs/CHANGELOG.asciidoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index c23b468502224..92ff72c1c3615 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -37,8 +37,8 @@ written to by an older Elasticsearch after writing to it with a newer Elasticsea === New Features -<> ({pull}29623[#29623]) +Added new "Request" object flavored request methods. Prefer these instead of the +multi-argument versions. ({pull}29623[#29623]) === Enhancements From cd2c786499966804d8dec51cdf0ced20e35cfc1d Mon Sep 17 00:00:00 2001 From: Nik Everett Date: Tue, 1 May 2018 14:30:49 -0400 Subject: [PATCH 20/20] Fixup changelog --- docs/CHANGELOG.asciidoc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 147bfd99dd9ab..c35f94949161a 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -60,14 +60,15 @@ written to by an older Elasticsearch after writing to it with a newer Elasticsea //[float] //=== New Features -Added new "Request" object flavored request methods. Prefer these instead of the -multi-argument versions. ({pull}29623[#29623]) - [float] === Enhancements <> ({pull}30255[#30255]) +Added new "Request" object flavored request methods. Prefer these instead of the +multi-argument versions. ({pull}29623[#29623]) + + [float] === Bug Fixes