From e0345a868851dc5d3f0185f1a83363ef7ff2ab67 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Sun, 15 Oct 2017 22:04:31 +0100 Subject: [PATCH 01/13] Added Delete Index support to high-level REST client --- .../org/elasticsearch/client/Request.java | 17 ++++++ .../client/RestHighLevelClient.java | 24 +++++++- .../elasticsearch/client/IndexAdminIT.java | 56 +++++++++++++++++++ .../delete/DeleteRepositoryResponse.java | 2 +- .../indices/delete/DeleteIndexResponse.java | 33 +++++++++++ .../support/master/AcknowledgedResponse.java | 46 ++++++++++++++- 6 files changed, 175 insertions(+), 3 deletions(-) mode change 100644 => 100755 client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java mode change 100644 => 100755 client/rest-high-level/src/main/java/org/elasticsearch/client/RestHighLevelClient.java create mode 100755 client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java mode change 100644 => 100755 core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java mode change 100644 => 100755 core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java mode change 100644 => 100755 core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java 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/Request.java old mode 100644 new mode 100755 index 7a95553c3c003..683fb3b263810 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java @@ -29,6 +29,7 @@ import org.apache.http.entity.ContentType; import org.apache.lucene.util.BytesRef; import org.elasticsearch.action.DocWriteRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.get.GetRequest; @@ -123,6 +124,17 @@ static Request delete(DeleteRequest deleteRequest) { return new Request(HttpDelete.METHOD_NAME, endpoint, parameters.getParams(), null); } + + static Request deleteIndex(DeleteIndexRequest deleteIndexRequest) { + String endpoint = endpoint(deleteIndexRequest.indices(), ""); + + Params parameters = Params.builder(); + parameters.withTimeout(deleteIndexRequest.timeout()); + parameters.withIndicesOptions(deleteIndexRequest.indicesOptions()); + + return new Request(HttpDelete.METHOD_NAME, endpoint, parameters.getParams(), null); + } + static Request info() { return new Request(HttpGet.METHOD_NAME, "/", Collections.emptyMap(), null); } @@ -378,6 +390,11 @@ static String endpoint(String[] indices, String[] types, String endpoint) { return endpoint(String.join(",", indices), String.join(",", types), endpoint); } + + static String endpoint(String[] indices, String endpoint) { + return endpoint(String.join(",", indices), endpoint); + } + /** * Utility method to build request's endpoint. */ 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 old mode 100644 new mode 100755 index 25697abb82edf..dff8cd3b2af3b --- 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 @@ -26,6 +26,8 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; import org.elasticsearch.action.ActionRequestValidationException; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; @@ -328,7 +330,7 @@ public void updateAsync(UpdateRequest updateRequest, ActionListener * See Delete API on elastic.co */ public DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException { @@ -346,6 +348,26 @@ public void deleteAsync(DeleteRequest deleteRequest, ActionListener + * See Delete API on elastic.co + */ + public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { + return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, Collections.singleton(404), + headers); + } + + /** + * Asynchronously deletes an index using the Delete Index api + *

+ * See Delete API on elastic.co + */ + public void deleteIndexAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { + performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, listener, Collections.singleton(404), + headers); + } + /** * Executes a search using the Search api * diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java new file mode 100755 index 0000000000000..c9c72b8c3e418 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java @@ -0,0 +1,56 @@ +/* + * 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.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.rest.RestStatus; + +import java.io.IOException; +import java.util.Collections; + +public class IndexAdminIT extends ESRestHighLevelClientTestCase { + + public void testDeleteIndex_ifIndexExists() throws IOException { + // Testing existing index is deleted + GetRequest getRequest = new GetRequest("test_index", "type", "id"); + highLevelClient().index(new IndexRequest("test_index", "type", "id").source(Collections.singletonMap("foo", "bar"))); + + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test_index"); + DeleteIndexResponse deleteIndexResponse = execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); + assertTrue(deleteIndexResponse.isAcknowledged()); + + ElasticsearchException exception = expectThrows(ElasticsearchException.class, + () -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync)); + assertEquals(RestStatus.NOT_FOUND, exception.status()); + } + + public void testDeleteIndex_ifIndexNotExists() throws IOException { + // Testing error on non-existing index + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("non_existent_index"); + + ElasticsearchException exception = expectThrows(ElasticsearchException.class, + () -> execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync)); + assertEquals(RestStatus.NOT_FOUND, exception.status()); + } +} diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java old mode 100644 new mode 100755 index b83c8158c4f7a..4e9c248530932 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java @@ -22,6 +22,7 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; @@ -48,5 +49,4 @@ public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); writeAcknowledged(out); } - } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java old mode 100644 new mode 100755 index 509686d364902..ed5a94401476f --- a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java @@ -22,9 +22,12 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; +import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; + /** * A response for a delete index action. */ @@ -48,4 +51,34 @@ public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); writeAcknowledged(out); } + + public static DeleteIndexResponse fromXContent(XContentParser parser) throws IOException { + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); + + DeleteIndexResponse.Builder context = new DeleteIndexResponse.Builder(); + while (parser.nextToken() != XContentParser.Token.END_OBJECT) { + parseXContentFields(parser, context); + } + return context.build(); + } + + /** + * Parse the current token and update the parsing context appropriately. + */ + private static void parseXContentFields(XContentParser parser, DeleteIndexResponse.Builder context) throws IOException { + AcknowledgedResponse.parseInnerToXContent(parser, context); + } + + /** + * Builder class for {@link DeleteIndexResponse}. This builder is usually used during xcontent parsing to + * temporarily store the parsed values, then the {@link AcknowledgedResponse.Builder#build()} method is called to + * instantiate the {@link DeleteIndexResponse}. + */ + public static class Builder extends AcknowledgedResponse.Builder { + + @Override + public DeleteIndexResponse build() { + return new DeleteIndexResponse(acknowledged); + } + } } diff --git a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java old mode 100644 new mode 100755 index cdac96a7a7975..caa5dc1e392eb --- a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -21,14 +21,21 @@ import org.elasticsearch.action.ActionResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; +import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; + /** * Abstract class that allows to mark action responses that support acknowledgements. * Facilitates consistency across different api. */ -public abstract class AcknowledgedResponse extends ActionResponse { +public abstract class AcknowledgedResponse extends ActionResponse implements ToXContentObject { + + private static final String ACKNOWLEDGED = "acknowledged"; private boolean acknowledged; @@ -61,4 +68,41 @@ protected void readAcknowledged(StreamInput in) throws IOException { protected void writeAcknowledged(StreamOutput out) throws IOException { out.writeBoolean(acknowledged); } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + builder.field("acknowledged", acknowledged); + builder.endObject(); + return builder; + } + + protected static void parseInnerToXContent(XContentParser parser, AcknowledgedResponse.Builder context) throws IOException { + XContentParser.Token token = parser.currentToken(); + ensureExpectedToken(XContentParser.Token.FIELD_NAME, token, parser::getTokenLocation); + + String currentFieldName = parser.currentName(); + token = parser.nextToken(); + + if (token.isValue()) { + if (ACKNOWLEDGED.equals(currentFieldName)) { + context.setAcknowledged(parser.booleanValue()); + } + } + } + + public abstract static class Builder { + + protected boolean acknowledged = false; + + public boolean isAcknowledged() { + return acknowledged; + } + + public void setAcknowledged(boolean acknowledged) { + this.acknowledged = acknowledged; + } + + public abstract AcknowledgedResponse build(); + } } From 1540e930ae55849c5c4ca6dc93b9d6f9ff4286f3 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Mon, 16 Oct 2017 12:08:43 +0100 Subject: [PATCH 02/13] Fixed code style --- .../org/elasticsearch/client/RestHighLevelClient.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 dff8cd3b2af3b..8a34814f506ad 100755 --- 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 @@ -330,7 +330,7 @@ public void updateAsync(UpdateRequest updateRequest, ActionListener + * * See Delete API on elastic.co */ public DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) throws IOException { @@ -354,8 +354,8 @@ public void deleteAsync(DeleteRequest deleteRequest, ActionListenerDelete API on elastic.co */ public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, Collections.singleton(404), - headers); + return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, + Collections.singleton(404), headers); } /** @@ -364,8 +364,8 @@ public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, He * See Delete API on elastic.co */ public void deleteIndexAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, listener, Collections.singleton(404), - headers); + performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, listener, + Collections.singleton(404), headers); } /** From c8e35a6ec3d0a2916b590d768a5055ebbf8c25d9 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Mon, 16 Oct 2017 12:20:53 +0100 Subject: [PATCH 03/13] Fixed remaining checkstyle errors --- .../src/test/java/org/elasticsearch/client/IndexAdminIT.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java index c9c72b8c3e418..3b0b31a12309c 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java @@ -37,7 +37,8 @@ public void testDeleteIndex_ifIndexExists() throws IOException { highLevelClient().index(new IndexRequest("test_index", "type", "id").source(Collections.singletonMap("foo", "bar"))); DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test_index"); - DeleteIndexResponse deleteIndexResponse = execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); + DeleteIndexResponse deleteIndexResponse = + execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); assertTrue(deleteIndexResponse.isAcknowledged()); ElasticsearchException exception = expectThrows(ElasticsearchException.class, From 77a99397128e28782695816487c33ea9966abe48 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Sun, 22 Oct 2017 13:51:08 +0100 Subject: [PATCH 04/13] Review mark-ups --- .../org/elasticsearch/client/Request.java | 7 +- .../client/RestHighLevelClient.java | 12 ++- .../elasticsearch/client/IndexAdminIT.java | 57 ----------- .../elasticsearch/client/IndicesClientIT.java | 68 +++++++++++++ .../elasticsearch/client/RequestTests.java | 61 ++++++++++++ .../delete/DeleteRepositoryResponse.java | 2 +- .../support/master/AcknowledgedResponse.java | 16 +-- .../delete/DeleteIndexResponseTests.java | 99 +++++++++++++++++++ 8 files changed, 246 insertions(+), 76 deletions(-) delete mode 100755 client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java create mode 100755 client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java mode change 100644 => 100755 client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java create mode 100755 core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java 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/Request.java index 683fb3b263810..f77828755e44f 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java @@ -124,12 +124,12 @@ static Request delete(DeleteRequest deleteRequest) { return new Request(HttpDelete.METHOD_NAME, endpoint, parameters.getParams(), null); } - static Request deleteIndex(DeleteIndexRequest deleteIndexRequest) { String endpoint = endpoint(deleteIndexRequest.indices(), ""); 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); @@ -390,7 +390,6 @@ static String endpoint(String[] indices, String[] types, String endpoint) { return endpoint(String.join(",", indices), String.join(",", types), endpoint); } - static String endpoint(String[] indices, String endpoint) { return endpoint(String.join(",", indices), endpoint); } @@ -466,6 +465,10 @@ Params withFetchSourceContext(FetchSourceContext fetchSourceContext) { return this; } + Params withMasterTimeout(TimeValue masterTimeout) { + return putParam("master_timeout", masterTimeout); + } + Params withParent(String parent) { return putParam("parent", parent); } 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 8a34814f506ad..8e243a9ccf09a 100755 --- 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 @@ -351,21 +351,23 @@ public void deleteAsync(DeleteRequest deleteRequest, ActionListener - * See Delete API on elastic.co + * See + * Delete Index API on elastic.co */ public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, - Collections.singleton(404), headers); + return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, emptySet(), + headers); } /** * Asynchronously deletes an index using the Delete Index api *

- * See Delete API on elastic.co + * See + * Delete Index API on elastic.co */ public void deleteIndexAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, listener, - Collections.singleton(404), headers); + emptySet(), headers); } /** diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java deleted file mode 100755 index 3b0b31a12309c..0000000000000 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndexAdminIT.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.elasticsearch.ElasticsearchException; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.rest.RestStatus; - -import java.io.IOException; -import java.util.Collections; - -public class IndexAdminIT extends ESRestHighLevelClientTestCase { - - public void testDeleteIndex_ifIndexExists() throws IOException { - // Testing existing index is deleted - GetRequest getRequest = new GetRequest("test_index", "type", "id"); - highLevelClient().index(new IndexRequest("test_index", "type", "id").source(Collections.singletonMap("foo", "bar"))); - - DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test_index"); - DeleteIndexResponse deleteIndexResponse = - execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); - assertTrue(deleteIndexResponse.isAcknowledged()); - - ElasticsearchException exception = expectThrows(ElasticsearchException.class, - () -> execute(getRequest, highLevelClient()::get, highLevelClient()::getAsync)); - assertEquals(RestStatus.NOT_FOUND, exception.status()); - } - - public void testDeleteIndex_ifIndexNotExists() throws IOException { - // Testing error on non-existing index - DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("non_existent_index"); - - ElasticsearchException exception = expectThrows(ElasticsearchException.class, - () -> execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync)); - assertEquals(RestStatus.NOT_FOUND, exception.status()); - } -} diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java new file mode 100755 index 0000000000000..0168ccdbd1084 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java @@ -0,0 +1,68 @@ +/* + * 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.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; +import org.elasticsearch.rest.RestStatus; + +import java.io.IOException; + +public class IndicesClientIT extends ESRestHighLevelClientTestCase { + + public void testDeleteIndex() throws IOException { + { + // Delete index if exists + String indexName = "test_index"; + createIndex(indexName); + + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName); + DeleteIndexResponse deleteIndexResponse = + execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); + assertTrue(deleteIndexResponse.isAcknowledged()); + + assertFalse(indexExists(indexName)); + } + { + // Return 404 if index doesn't exist + String nonExistentIndex = "non_existent_index"; + assertFalse(indexExists(nonExistentIndex)); + + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(nonExistentIndex); + + ElasticsearchException exception = expectThrows(ElasticsearchException.class, + () -> execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync)); + assertEquals(RestStatus.NOT_FOUND, exception.status()); + } + } + + private void createIndex(String index) throws IOException { + Response response = client().performRequest("PUT", "/" + index); + + assertEquals(200, response.getStatusLine().getStatusCode()); + } + + private boolean indexExists(String index) throws IOException { + Response response = client().performRequest("HEAD", "/" + index); + + return response.getStatusLine().getStatusCode() == 200; + } +} 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/RequestTests.java old mode 100644 new mode 100755 index 8f52eb37fe95d..0be884e59927c --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -25,6 +25,7 @@ import org.apache.http.entity.StringEntity; import org.apache.http.util.EntityUtils; import org.elasticsearch.action.DocWriteRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkShardRequest; import org.elasticsearch.action.delete.DeleteRequest; @@ -36,6 +37,8 @@ import org.elasticsearch.action.search.SearchType; import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.WriteRequest; +import org.elasticsearch.action.support.master.AcknowledgedRequest; +import org.elasticsearch.action.support.master.MasterNodeRequest; import org.elasticsearch.action.support.replication.ReplicatedWriteRequest; import org.elasticsearch.action.support.replication.ReplicationRequest; import org.elasticsearch.action.update.UpdateRequest; @@ -240,6 +243,44 @@ private static void getAndExistsTest(Function requestConver assertEquals(method, request.getMethod()); } + public void testDeleteIndex() throws IOException { + DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(); + + int numIndices = randomIntBetween(0, 5); + String[] indices = new String[numIndices]; + for (int i = 0; i < numIndices; i++) { + indices[i] = "index-" + randomAlphaOfLengthBetween(2, 5); + } + deleteIndexRequest.indices(indices); + + Map expectedParams = new HashMap<>(); + + setRandomTimeout(deleteIndexRequest, expectedParams); + setRandomMasterTimeout(deleteIndexRequest, expectedParams); + + if (randomBoolean()) { + deleteIndexRequest.indicesOptions(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), + randomBoolean())); + } + expectedParams.put("ignore_unavailable", Boolean.toString(deleteIndexRequest.indicesOptions().ignoreUnavailable())); + expectedParams.put("allow_no_indices", Boolean.toString(deleteIndexRequest.indicesOptions().allowNoIndices())); + if (deleteIndexRequest.indicesOptions().expandWildcardsOpen() && deleteIndexRequest.indicesOptions().expandWildcardsClosed()) { + expectedParams.put("expand_wildcards", "open,closed"); + } else if (deleteIndexRequest.indicesOptions().expandWildcardsOpen()) { + expectedParams.put("expand_wildcards", "open"); + } else if (deleteIndexRequest.indicesOptions().expandWildcardsClosed()) { + expectedParams.put("expand_wildcards", "closed"); + } else { + expectedParams.put("expand_wildcards", "none"); + } + + Request request = Request.deleteIndex(deleteIndexRequest); + assertEquals("/" + String.join(",", indices), request.getEndpoint()); + assertEquals(expectedParams, request.getParameters()); + assertEquals("DELETE", request.getMethod()); + assertNull(request.getEntity()); + } + public void testIndex() throws IOException { String index = randomAlphaOfLengthBetween(3, 10); String type = randomAlphaOfLengthBetween(3, 10); @@ -903,6 +944,26 @@ private static void randomizeFetchSourceContextParams(Consumer request, Map expectedParams) { + if (randomBoolean()) { + String timeout = randomTimeValue(); + request.timeout(timeout); + expectedParams.put("timeout", timeout); + } else { + expectedParams.put("timeout", AcknowledgedRequest.DEFAULT_ACK_TIMEOUT.getStringRep()); + } + } + + private static void setRandomMasterTimeout(MasterNodeRequest request, Map expectedParams) { + if (randomBoolean()) { + String masterTimeout = randomTimeValue(); + request.masterNodeTimeout(masterTimeout); + expectedParams.put("master_timeout", masterTimeout); + } else { + expectedParams.put("master_timeout", MasterNodeRequest.DEFAULT_MASTER_NODE_TIMEOUT.getStringRep()); + } + } + private static void setRandomTimeout(ReplicationRequest request, Map expectedParams) { if (randomBoolean()) { String timeout = randomTimeValue(); diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java index 4e9c248530932..b83c8158c4f7a 100755 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/delete/DeleteRepositoryResponse.java @@ -22,7 +22,6 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; @@ -49,4 +48,5 @@ public void writeTo(StreamOutput out) throws IOException { super.writeTo(out); writeAcknowledged(out); } + } diff --git a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java index caa5dc1e392eb..fac8a708581a9 100755 --- a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -21,8 +21,6 @@ import org.elasticsearch.action.ActionResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.xcontent.ToXContentObject; -import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; @@ -33,7 +31,7 @@ * Abstract class that allows to mark action responses that support acknowledgements. * Facilitates consistency across different api. */ -public abstract class AcknowledgedResponse extends ActionResponse implements ToXContentObject { +public abstract class AcknowledgedResponse extends ActionResponse { private static final String ACKNOWLEDGED = "acknowledged"; @@ -69,14 +67,6 @@ protected void writeAcknowledged(StreamOutput out) throws IOException { out.writeBoolean(acknowledged); } - @Override - public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { - builder.startObject(); - builder.field("acknowledged", acknowledged); - builder.endObject(); - return builder; - } - protected static void parseInnerToXContent(XContentParser parser, AcknowledgedResponse.Builder context) throws IOException { XContentParser.Token token = parser.currentToken(); ensureExpectedToken(XContentParser.Token.FIELD_NAME, token, parser::getTokenLocation); @@ -88,6 +78,10 @@ protected static void parseInnerToXContent(XContentParser parser, AcknowledgedRe if (ACKNOWLEDGED.equals(currentFieldName)) { context.setAcknowledged(parser.booleanValue()); } + } else if (token == XContentParser.Token.START_OBJECT) { + parser.skipChildren(); // skip potential inner objects for forward compatibility + } else if (token == XContentParser.Token.START_ARRAY) { + parser.skipChildren(); // skip potential inner arrays for forward compatibility } } diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java new file mode 100755 index 0000000000000..121edf1103a46 --- /dev/null +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java @@ -0,0 +1,99 @@ +/* + * 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.action.admin.indices.delete; + +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.collect.Tuple; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.test.ESTestCase; + +import java.io.IOException; + +import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; + +public class DeleteIndexResponseTests extends ESTestCase { + + public void testFromXContent() throws IOException { + doFromXContentTestWithRandomFields(false); + } + + /** + * This test adds random fields and objects to the xContent rendered out to + * ensure we can parse it back to be forward compatible with additions to + * the xContent + */ + public void testFromXContentWithRandomFields() throws IOException { + doFromXContentTestWithRandomFields(true); + } + + private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { + boolean humanReadable = randomBoolean(); + final XContentType xContentType = randomFrom(XContentType.values()); + + final Tuple tuple = randomDeleteIndexResponse(xContentType, humanReadable); + XContentBuilder deleteIndexResponseXContent = tuple.v1(); + DeleteIndexResponse expectedDeleteIndexResponse = tuple.v2(); + + BytesReference originalBytes = deleteIndexResponseXContent.bytes(); + + BytesReference mutated; + if (addRandomFields) { + mutated = insertRandomFields(xContentType, originalBytes, null, random()); + } else { + mutated = originalBytes; + } + DeleteIndexResponse parsedDeleteIndexResponse; + try (XContentParser parser = createParser(xContentType.xContent(), mutated)) { + parsedDeleteIndexResponse = DeleteIndexResponse.fromXContent(parser); + assertNull(parser.nextToken()); + } + + // We can't use equals() to compare the original and the parsed delete response + // because the random delete response can contain shard failures with exceptions, + // and those exceptions are not parsed back with the same types. + assertEquals(expectedDeleteIndexResponse.isAcknowledged(), parsedDeleteIndexResponse.isAcknowledged()); + } + + /** + * Returns a tuple of an {@link XContentBuilder} {@link DeleteIndexResponse}. + *

+ * The left element is the actual {@link XContentBuilder} to serialize while the right element is the + * expected {@link DeleteIndexResponse} after parsing. + */ + public static Tuple randomDeleteIndexResponse( + XContentType xContentType, boolean humanReadable) throws IOException { + + boolean acknowledged = randomBoolean(); + + XContentBuilder builder = XContentFactory.contentBuilder(xContentType); + builder.humanReadable(humanReadable); + builder.startObject(); + builder.field("acknowledged", acknowledged); + builder.endObject(); + + DeleteIndexResponse expected = new DeleteIndexResponse(acknowledged); + + return Tuple.tuple(builder, expected); + } + +} From a18662fefab70ffcf275d16ee9894ce0238de844 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Sun, 22 Oct 2017 14:21:58 +0100 Subject: [PATCH 05/13] Exctracted IndicesClient from RestHighLevelClient; Added CreateIndexResponse fromXContent method --- .../elasticsearch/client/IndicesClient.java | 63 +++++++++++++++ .../client/RestHighLevelClient.java | 33 +++----- .../elasticsearch/client/IndicesClientIT.java | 4 +- .../indices/create/CreateIndexResponse.java | 23 ++++++ .../indices/delete/DeleteIndexResponse.java | 32 ++------ .../support/master/AcknowledgedResponse.java | 41 ++-------- .../create/CreateIndexResponseTests.java | 78 +++++++++++++++++++ .../delete/DeleteIndexResponseTests.java | 6 +- 8 files changed, 189 insertions(+), 91 deletions(-) create mode 100644 client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java 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 new file mode 100644 index 0000000000000..6ba9ce46d449c --- /dev/null +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/IndicesClient.java @@ -0,0 +1,63 @@ +/* + * 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.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; + +import java.io.IOException; +import java.util.Collections; + +/** + * A wrapper for the {@link RestHighLevelClient} that provides method for the Indices api + * + * See Indices API on elastic.co + */ +public class IndicesClient { + private final RestHighLevelClient restHighLevelClient; + + public IndicesClient(RestHighLevelClient restHighLevelClient) { + this.restHighLevelClient = restHighLevelClient; + } + + /** + * Deletes an index using the Delete Index api + *

+ * See + * Delete Index API on elastic.co + */ + public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { + return restHighLevelClient.performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, + Collections.emptySet(), headers); + } + + /** + * Asynchronously deletes an index using the Delete Index api + *

+ * See + * Delete Index API on elastic.co + */ + public void deleteIndexAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { + restHighLevelClient.performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, + listener, Collections.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 8e243a9ccf09a..5bd45fe6ec250 100755 --- 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 @@ -26,8 +26,6 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequest; import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; -import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; @@ -222,6 +220,15 @@ public final void close() throws IOException { doClose.accept(client); } + /** + * Provides an {@link IndicesClient} which can be used to access the Indices api. + * + * See Indices API on elastic.co + */ + public IndicesClient indices() { + return new IndicesClient(this); + } + /** * Executes a bulk request using the Bulk API * @@ -348,28 +355,6 @@ public void deleteAsync(DeleteRequest deleteRequest, ActionListener - * See - * Delete Index API on elastic.co - */ - public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, Header... headers) throws IOException { - return performRequestAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, emptySet(), - headers); - } - - /** - * Asynchronously deletes an index using the Delete Index api - *

- * See - * Delete Index API on elastic.co - */ - public void deleteIndexAsync(DeleteIndexRequest deleteIndexRequest, ActionListener listener, Header... headers) { - performRequestAsyncAndParseEntity(deleteIndexRequest, Request::deleteIndex, DeleteIndexResponse::fromXContent, listener, - emptySet(), headers); - } - /** * Executes a search using the Search api * diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java index 0168ccdbd1084..af9436632e3b4 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java @@ -36,7 +36,7 @@ public void testDeleteIndex() throws IOException { DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName); DeleteIndexResponse deleteIndexResponse = - execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync); + execute(deleteIndexRequest, highLevelClient().indices()::deleteIndex, highLevelClient().indices()::deleteIndexAsync); assertTrue(deleteIndexResponse.isAcknowledged()); assertFalse(indexExists(indexName)); @@ -49,7 +49,7 @@ public void testDeleteIndex() throws IOException { DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(nonExistentIndex); ElasticsearchException exception = expectThrows(ElasticsearchException.class, - () -> execute(deleteIndexRequest, highLevelClient()::deleteIndex, highLevelClient()::deleteIndexAsync)); + () -> execute(deleteIndexRequest, highLevelClient().indices()::deleteIndex, highLevelClient().indices()::deleteIndexAsync)); assertEquals(RestStatus.NOT_FOUND, exception.status()); } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java index 7d948e7137ebf..d077e4143d840 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java @@ -21,12 +21,18 @@ import org.elasticsearch.Version; import org.elasticsearch.action.support.master.AcknowledgedResponse; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ObjectParser; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; +import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg; + /** * A response for a create index action. */ @@ -82,4 +88,21 @@ public void addCustomFields(XContentBuilder builder) throws IOException { builder.field("shards_acknowledged", isShardsAcked()); builder.field("index", index()); } + + public static CreateIndexResponse fromXContent(XContentParser parser) throws IOException { + return PARSER.apply(parser, null); + } + + private static final ParseField SHARDS_ACKNOWLEDGED = new ParseField("shards_acknowledged"); + private static final ParseField INDEX = new ParseField("index"); + + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("create_index", + true, a -> new CreateIndexResponse((boolean) a[0], (boolean) a[1], (String) a[2])); + + static { + declareAcknowledgedField(PARSER); + PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), SHARDS_ACKNOWLEDGED, + ObjectParser.ValueType.BOOLEAN); + PARSER.declareField(constructorArg(), (parser, context) -> parser.text(), INDEX, ObjectParser.ValueType.STRING); + } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java index ed5a94401476f..8ad1be0018a83 100755 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java @@ -22,12 +22,11 @@ import org.elasticsearch.action.support.master.AcknowledgedResponse; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.ConstructingObjectParser; import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; -import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; - /** * A response for a delete index action. */ @@ -53,32 +52,13 @@ public void writeTo(StreamOutput out) throws IOException { } public static DeleteIndexResponse fromXContent(XContentParser parser) throws IOException { - ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); - - DeleteIndexResponse.Builder context = new DeleteIndexResponse.Builder(); - while (parser.nextToken() != XContentParser.Token.END_OBJECT) { - parseXContentFields(parser, context); - } - return context.build(); - } - - /** - * Parse the current token and update the parsing context appropriately. - */ - private static void parseXContentFields(XContentParser parser, DeleteIndexResponse.Builder context) throws IOException { - AcknowledgedResponse.parseInnerToXContent(parser, context); + return PARSER.apply(parser, null); } - /** - * Builder class for {@link DeleteIndexResponse}. This builder is usually used during xcontent parsing to - * temporarily store the parsed values, then the {@link AcknowledgedResponse.Builder#build()} method is called to - * instantiate the {@link DeleteIndexResponse}. - */ - public static class Builder extends AcknowledgedResponse.Builder { + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("delete_index", + true, a -> new DeleteIndexResponse((boolean) a[0])); - @Override - public DeleteIndexResponse build() { - return new DeleteIndexResponse(acknowledged); - } + static { + declareAcknowledgedField(PARSER); } } diff --git a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java index fac8a708581a9..8568762214b92 100755 --- a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -19,13 +19,15 @@ package org.elasticsearch.action.support.master; import org.elasticsearch.action.ActionResponse; +import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; -import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ObjectParser; import java.io.IOException; -import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; +import static org.elasticsearch.common.xcontent.ConstructingObjectParser.constructorArg; /** * Abstract class that allows to mark action responses that support acknowledgements. @@ -33,8 +35,6 @@ */ public abstract class AcknowledgedResponse extends ActionResponse { - private static final String ACKNOWLEDGED = "acknowledged"; - private boolean acknowledged; protected AcknowledgedResponse() { @@ -67,36 +67,9 @@ protected void writeAcknowledged(StreamOutput out) throws IOException { out.writeBoolean(acknowledged); } - protected static void parseInnerToXContent(XContentParser parser, AcknowledgedResponse.Builder context) throws IOException { - XContentParser.Token token = parser.currentToken(); - ensureExpectedToken(XContentParser.Token.FIELD_NAME, token, parser::getTokenLocation); - - String currentFieldName = parser.currentName(); - token = parser.nextToken(); - - if (token.isValue()) { - if (ACKNOWLEDGED.equals(currentFieldName)) { - context.setAcknowledged(parser.booleanValue()); - } - } else if (token == XContentParser.Token.START_OBJECT) { - parser.skipChildren(); // skip potential inner objects for forward compatibility - } else if (token == XContentParser.Token.START_ARRAY) { - parser.skipChildren(); // skip potential inner arrays for forward compatibility - } - } - - public abstract static class Builder { - - protected boolean acknowledged = false; - - public boolean isAcknowledged() { - return acknowledged; - } - - public void setAcknowledged(boolean acknowledged) { - this.acknowledged = acknowledged; - } + protected static final ParseField ACKNOWLEDGED = new ParseField("acknowledged"); - public abstract AcknowledgedResponse build(); + protected static void declareAcknowledgedField(ConstructingObjectParser PARSER) { + PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), ACKNOWLEDGED, ObjectParser.ValueType.BOOLEAN); } } diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java index 588659335e499..514341a445bc8 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java @@ -20,12 +20,20 @@ package org.elasticsearch.action.admin.indices.create; import org.elasticsearch.Version; +import org.elasticsearch.common.bytes.BytesReference; +import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; import java.io.IOException; +import static org.elasticsearch.test.XContentTestUtils.insertRandomFields; + public class CreateIndexResponseTests extends ESTestCase { public void testSerialization() throws IOException { @@ -62,4 +70,74 @@ public void testSerializationWithOldVersion() throws IOException { } } } + + public void testFromXContent() throws IOException { + doFromXContentTestWithRandomFields(false); + } + + /** + * This test adds random fields and objects to the xContent rendered out to + * ensure we can parse it back to be forward compatible with additions to + * the xContent + */ + public void testFromXContentWithRandomFields() throws IOException { + doFromXContentTestWithRandomFields(true); + } + + private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { + boolean humanReadable = randomBoolean(); + final XContentType xContentType = randomFrom(XContentType.values()); + + final Tuple tuple = randomCreateIndexResponse(xContentType, humanReadable); + XContentBuilder CreateIndexResponseXContent = tuple.v1(); + CreateIndexResponse expectedCreateIndexResponse = tuple.v2(); + + BytesReference originalBytes = CreateIndexResponseXContent.bytes(); + + BytesReference mutated; + if (addRandomFields) { + mutated = insertRandomFields(xContentType, originalBytes, null, random()); + } else { + mutated = originalBytes; + } + CreateIndexResponse parsedCreateIndexResponse; + try (XContentParser parser = createParser(xContentType.xContent(), mutated)) { + parsedCreateIndexResponse = CreateIndexResponse.fromXContent(parser); + assertNull(parser.nextToken()); + } + + asserCreateIndexResponse(expectedCreateIndexResponse, parsedCreateIndexResponse); + } + + public static void asserCreateIndexResponse(CreateIndexResponse expected, CreateIndexResponse actual) { + assertEquals(expected.index(), actual.index()); + assertEquals(expected.isShardsAcked(), actual.isShardsAcked()); + assertEquals(expected.isAcknowledged(), actual.isAcknowledged()); + } + + /** + * Returns a tuple of an {@link XContentBuilder} and a {@link CreateIndexResponse}. + *

+ * The left element is the actual {@link XContentBuilder} to serialize while the right element is the + * expected {@link CreateIndexResponse} after parsing. + */ + public static Tuple randomCreateIndexResponse( + XContentType xContentType, boolean humanReadable) throws IOException { + + boolean acknowledged = randomBoolean(); + boolean shardsAcked = acknowledged && randomBoolean(); + String index = randomAlphaOfLength(5); + + XContentBuilder builder = XContentFactory.contentBuilder(xContentType); + builder.humanReadable(humanReadable); + builder.startObject(); + builder.field("acknowledged", acknowledged); + builder.field("shards_acknowledged", shardsAcked); + builder.field("index", index); + builder.endObject(); + + CreateIndexResponse expected = new CreateIndexResponse(acknowledged, shardsAcked, index); + + return Tuple.tuple(builder, expected); + } } diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java index 121edf1103a46..1b30c172ae7c0 100755 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java @@ -68,14 +68,11 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws assertNull(parser.nextToken()); } - // We can't use equals() to compare the original and the parsed delete response - // because the random delete response can contain shard failures with exceptions, - // and those exceptions are not parsed back with the same types. assertEquals(expectedDeleteIndexResponse.isAcknowledged(), parsedDeleteIndexResponse.isAcknowledged()); } /** - * Returns a tuple of an {@link XContentBuilder} {@link DeleteIndexResponse}. + * Returns a tuple of an {@link XContentBuilder} and a {@link DeleteIndexResponse}. *

* The left element is the actual {@link XContentBuilder} to serialize while the right element is the * expected {@link DeleteIndexResponse} after parsing. @@ -95,5 +92,4 @@ public static Tuple randomDeleteIndexRespo return Tuple.tuple(builder, expected); } - } From a03b7591f35264561910913eb78be4b515442876 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Sun, 22 Oct 2017 16:34:08 +0100 Subject: [PATCH 06/13] Fixed typos --- .../src/main/java/org/elasticsearch/client/IndicesClient.java | 2 +- .../java/org/elasticsearch/client/RestHighLevelClient.java | 2 +- .../action/admin/indices/create/CreateIndexResponseTests.java | 4 ++-- 3 files changed, 4 insertions(+), 4 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 6ba9ce46d449c..d60fcff7258b9 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 @@ -28,7 +28,7 @@ import java.util.Collections; /** - * A wrapper for the {@link RestHighLevelClient} that provides method for the Indices api + * A wrapper for the {@link RestHighLevelClient} that provides methods for accessing the Indices API. * * See Indices API on elastic.co */ 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 5bd45fe6ec250..c8cb0ff33975f 100755 --- 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 @@ -221,7 +221,7 @@ public final void close() throws IOException { } /** - * Provides an {@link IndicesClient} which can be used to access the Indices api. + * Provides an {@link IndicesClient} which can be used to access the Indices API. * * See Indices API on elastic.co */ diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java index 514341a445bc8..7ad0d8589d985 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java @@ -106,10 +106,10 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws assertNull(parser.nextToken()); } - asserCreateIndexResponse(expectedCreateIndexResponse, parsedCreateIndexResponse); + assertCreateIndexResponse(expectedCreateIndexResponse, parsedCreateIndexResponse); } - public static void asserCreateIndexResponse(CreateIndexResponse expected, CreateIndexResponse actual) { + public static void assertCreateIndexResponse(CreateIndexResponse expected, CreateIndexResponse actual) { assertEquals(expected.index(), actual.index()); assertEquals(expected.isShardsAcked(), actual.isShardsAcked()); assertEquals(expected.isAcknowledged(), actual.isAcknowledged()); From 30319eac079503cab9bbf46865772ceca043932a Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Sun, 22 Oct 2017 19:39:46 +0100 Subject: [PATCH 07/13] Added Delete Index docs --- .../IndicesClientDocumentationIT.java | 116 ++++++++++++++++++ .../high-level/apis/deleteindex.asciidoc | 78 ++++++++++++ .../high-level/supported-apis.asciidoc | 3 + 3 files changed, 197 insertions(+) create mode 100644 client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java create mode 100644 docs/java-rest/high-level/apis/deleteindex.asciidoc diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java new file mode 100644 index 0000000000000..0fafa1f6a3bb0 --- /dev/null +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java @@ -0,0 +1,116 @@ +/* + * 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.documentation; + +import org.elasticsearch.ElasticsearchException; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; +import org.elasticsearch.action.support.IndicesOptions; +import org.elasticsearch.client.ESRestHighLevelClientTestCase; +import org.elasticsearch.client.Response; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.common.unit.TimeValue; +import org.elasticsearch.rest.RestStatus; + +import java.io.IOException; + +/** + * This class is used to generate the Java Indices API documentation. + * You need to wrap your code between two tags like: + * // tag::example[] + * // end::example[] + * + * Where example is your tag name. + * + * Then in the documentation, you can extract what is between tag and end tags with + * ["source","java",subs="attributes,callouts,macros"] + * -------------------------------------------------- + * include-tagged::{doc-tests}/CRUDDocumentationIT.java[example] + * -------------------------------------------------- + */ +public class IndicesClientDocumentationIT extends ESRestHighLevelClientTestCase { + + public void testDeleteIndex() throws IOException { + RestHighLevelClient client = highLevelClient(); + + { + Response createIndexResponse = client().performRequest("PUT", "/posts"); + assertEquals(200, createIndexResponse.getStatusLine().getStatusCode()); + } + + { + // tag::delete-index-request + DeleteIndexRequest request = new DeleteIndexRequest("posts"); // <1> + // end::delete-index-request + + // tag::delete-index-execute + DeleteIndexResponse deleteIndexResponse = client.indices().deleteIndex(request); + // end::delete-index-execute + assertTrue(deleteIndexResponse.isAcknowledged()); + + // tag::delete-index-response + boolean acknowledged = deleteIndexResponse.isAcknowledged(); + // end::delete-index-response + + // tag::delete-index-execute-async + client.indices().deleteIndexAsync(request, new ActionListener() { + @Override + public void onResponse(DeleteIndexResponse deleteIndexResponse) { + // <1> + } + + @Override + public void onFailure(Exception e) { + // <2> + } + }); + // end::delete-index-execute-async + } + + { + DeleteIndexRequest request = new DeleteIndexRequest("posts"); + // tag::delete-index-request-timeout + request.timeout(TimeValue.timeValueMinutes(2)); // <1> + request.timeout("2m"); // <2> + // end::delete-index-request-timeout + // tag::delete-index-request-masterTimeout + request.masterNodeTimeout(TimeValue.timeValueMinutes(1)); // <1> + request.timeout("1m"); // <2> + // end::delete-index-request-masterTimeout + // tag::delete-index-request-indicesOptions + request.indicesOptions(IndicesOptions.lenientExpandOpen()); // <1> + // end::delete-index-request-indicesOptions + } + + { + // tag::delete-index-notfound + try { + DeleteIndexRequest request = new DeleteIndexRequest("does_not_exist"); + DeleteIndexResponse deleteIndexResponse = client.indices().deleteIndex(request); + } catch (ElasticsearchException exception) { + if (exception.status() == RestStatus.NOT_FOUND) { + // <1> + } + } + // end::delete-index-notfound + } + } +} diff --git a/docs/java-rest/high-level/apis/deleteindex.asciidoc b/docs/java-rest/high-level/apis/deleteindex.asciidoc new file mode 100644 index 0000000000000..72d2451cb3783 --- /dev/null +++ b/docs/java-rest/high-level/apis/deleteindex.asciidoc @@ -0,0 +1,78 @@ +[[java-rest-high-document-delete-index]] +=== Delete Index API + +[[java-rest-high-document-delete-index-request]] +==== Delete Index Request + +A `DeleteIndexRequest` requires an 'index' argument: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-request] +-------------------------------------------------- +<1> Index + +==== Optional arguments +The following arguments can optionally be provided: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-request-timeout] +-------------------------------------------------- +<1> Timeout to wait for primary shard to become available as a `TimeValue` +<2> Timeout to wait for primary shard to become available as a `String` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-request-masterTimeout] +-------------------------------------------------- +<1> Timeout to connect to the master node as a `TimeValue` +<2> Timeout to connect to the master node as a `String` + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-request-indicesOptions] +-------------------------------------------------- +<1> Setting `IndicesOptions` controls how unavailable indices are resolved and +how wildcard expressions are expanded + +[[java-rest-high-document-delete-index-sync]] +==== Synchronous Execution + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-execute] +-------------------------------------------------- + +[[java-rest-high-document-delete-index-async]] +==== Asynchronous Execution + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-execute-async] +-------------------------------------------------- +<1> Called when the execution is successfully completed. The response is +provided as an argument +<2> Called in case of failure. The raised exception is provided as an argument + +[[java-rest-high-document-delete-index-response]] +==== Delete Response + +The returned `DeleteResponse` allows to retrieve information about the executed + operation as follows: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-response] +-------------------------------------------------- + +If the index was not found, an `ElasticsearchException` will be thrown: + +If there is a version conflict, an `ElasticsearchException` will +be thrown: + +["source","java",subs="attributes,callouts,macros"] +-------------------------------------------------- +include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-notfound] +-------------------------------------------------- +<1> Do something if the index to be deleted was not found diff --git a/docs/java-rest/high-level/supported-apis.asciidoc b/docs/java-rest/high-level/supported-apis.asciidoc index 51411ea9fcaf0..9e902e1715766 100644 --- a/docs/java-rest/high-level/supported-apis.asciidoc +++ b/docs/java-rest/high-level/supported-apis.asciidoc @@ -3,6 +3,9 @@ The Java High Level REST Client supports the following APIs: +Indices APIs:: +* <> + Single document APIs:: * <> * <> From 7261ac9e10fa076a1ce8f5326468ad8c0ab6c3bd Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Mon, 23 Oct 2017 21:23:18 +0100 Subject: [PATCH 08/13] Added Delete Index docs; review mark-ups --- .../elasticsearch/client/IndicesClient.java | 8 +-- .../org/elasticsearch/client/Request.java | 6 +-- .../client/RestHighLevelClient.java | 22 ++++---- .../elasticsearch/client/IndicesClientIT.java | 8 +-- .../indices/create/CreateIndexResponse.java | 45 ++++++++++------ .../indices/delete/DeleteIndexResponse.java | 26 ++++++--- .../support/master/AcknowledgedResponse.java | 16 ++++-- .../elasticsearch/index/get/GetResult.java | 2 +- .../rest/action/AcknowledgedRestListener.java | 1 + .../create/CreateIndexResponseTests.java | 54 +++++++------------ .../delete/DeleteIndexResponseTests.java | 44 ++++++--------- .../high-level/apis/deleteindex.asciidoc | 15 +++--- docs/java-rest/high-level/apis/index.asciidoc | 1 + 13 files changed, 125 insertions(+), 123 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 d60fcff7258b9..2cc1d4849d5a8 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 @@ -30,9 +30,9 @@ /** * A wrapper for the {@link RestHighLevelClient} that provides methods for accessing the Indices API. * - * See Indices API on elastic.co + * See Indices API on elastic.co */ -public class IndicesClient { +public final class IndicesClient { private final RestHighLevelClient restHighLevelClient; public IndicesClient(RestHighLevelClient restHighLevelClient) { @@ -40,7 +40,7 @@ public IndicesClient(RestHighLevelClient restHighLevelClient) { } /** - * Deletes an index using the Delete Index api + * Deletes an index using the Delete Index API *

* See * Delete Index API on elastic.co @@ -51,7 +51,7 @@ public DeleteIndexResponse deleteIndex(DeleteIndexRequest deleteIndexRequest, He } /** - * Asynchronously deletes an index using the Delete Index api + * Asynchronously deletes an index using the Delete Index API *

* See * Delete Index API on elastic.co 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/Request.java index f77828755e44f..4da68e98e2db9 100755 --- a/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java +++ b/client/rest-high-level/src/main/java/org/elasticsearch/client/Request.java @@ -125,7 +125,7 @@ static Request delete(DeleteRequest deleteRequest) { } static Request deleteIndex(DeleteIndexRequest deleteIndexRequest) { - String endpoint = endpoint(deleteIndexRequest.indices(), ""); + String endpoint = endpoint(deleteIndexRequest.indices(), Strings.EMPTY_ARRAY, ""); Params parameters = Params.builder(); parameters.withTimeout(deleteIndexRequest.timeout()); @@ -390,10 +390,6 @@ static String endpoint(String[] indices, String[] types, String endpoint) { return endpoint(String.join(",", indices), String.join(",", types), endpoint); } - static String endpoint(String[] indices, String endpoint) { - return endpoint(String.join(",", indices), endpoint); - } - /** * Utility method to build request's endpoint. */ 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 c8cb0ff33975f..bc3538930d3d0 100755 --- 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 @@ -176,6 +176,8 @@ public class RestHighLevelClient implements Closeable { private final NamedXContentRegistry registry; private final CheckedConsumer doClose; + private final IndicesClient indicesClient = new IndicesClient(this); + /** * Creates a {@link RestHighLevelClient} given the low level {@link RestClientBuilder} that allows to build the * {@link RestClient} to be used to perform requests. @@ -223,10 +225,10 @@ public final void close() throws IOException { /** * Provides an {@link IndicesClient} which can be used to access the Indices API. * - * See Indices API on elastic.co + * See Indices API on elastic.co */ public IndicesClient indices() { - return new IndicesClient(this); + return indicesClient; } /** @@ -336,7 +338,7 @@ public void updateAsync(UpdateRequest updateRequest, ActionListenerDelete API on elastic.co */ @@ -346,7 +348,7 @@ public DeleteResponse delete(DeleteRequest deleteRequest, Header... headers) thr } /** - * Asynchronously deletes a document by id using the Delete api + * Asynchronously deletes a document by id using the Delete API * * See Delete API on elastic.co */ @@ -356,7 +358,7 @@ public void deleteAsync(DeleteRequest deleteRequest, ActionListenerSearch API on elastic.co */ @@ -365,7 +367,7 @@ public SearchResponse search(SearchRequest searchRequest, Header... headers) thr } /** - * Asynchronously executes a search using the Search api + * Asynchronously executes a search using the Search API * * See Search API on elastic.co */ @@ -374,7 +376,7 @@ public void searchAsync(SearchRequest searchRequest, ActionListenerSearch Scroll * API on elastic.co @@ -384,7 +386,7 @@ public SearchResponse searchScroll(SearchScrollRequest searchScrollRequest, Head } /** - * Asynchronously executes a search using the Search Scroll api + * Asynchronously executes a search using the Search Scroll API * * See Search Scroll * API on elastic.co @@ -395,7 +397,7 @@ public void searchScrollAsync(SearchScrollRequest searchScrollRequest, ActionLis } /** - * Clears one or more scroll ids using the Clear Scroll api + * Clears one or more scroll ids using the Clear Scroll API * * See * Clear Scroll API on elastic.co @@ -406,7 +408,7 @@ public ClearScrollResponse clearScroll(ClearScrollRequest clearScrollRequest, He } /** - * Asynchronously clears one or more scroll ids using the Clear Scroll api + * Asynchronously clears one or more scroll ids using the Clear Scroll API * * See * Clear Scroll API on elastic.co diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java index af9436632e3b4..4045e565288e5 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/IndicesClientIT.java @@ -54,14 +54,14 @@ public void testDeleteIndex() throws IOException { } } - private void createIndex(String index) throws IOException { - Response response = client().performRequest("PUT", "/" + index); + private static void createIndex(String index) throws IOException { + Response response = client().performRequest("PUT", index); assertEquals(200, response.getStatusLine().getStatusCode()); } - private boolean indexExists(String index) throws IOException { - Response response = client().performRequest("HEAD", "/" + index); + private static boolean indexExists(String index) throws IOException { + Response response = client().performRequest("HEAD", index); return response.getStatusLine().getStatusCode() == 200; } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java index d077e4143d840..b770c11c6ab03 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponse.java @@ -26,6 +26,7 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ConstructingObjectParser; import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; @@ -36,7 +37,23 @@ /** * A response for a create index action. */ -public class CreateIndexResponse extends AcknowledgedResponse { +public class CreateIndexResponse extends AcknowledgedResponse implements ToXContentObject { + + private static final String SHARDS_ACKNOWLEDGED = "shards_acknowledged"; + private static final String INDEX = "index"; + + private static final ParseField SHARDS_ACKNOWLEDGED_PARSER = new ParseField(SHARDS_ACKNOWLEDGED); + private static final ParseField INDEX_PARSER = new ParseField(INDEX); + + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("create_index", + true, args -> new CreateIndexResponse((boolean) args[0], (boolean) args[1], (String) args[2])); + + static { + declareAcknowledgedField(PARSER); + PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), SHARDS_ACKNOWLEDGED_PARSER, + ObjectParser.ValueType.BOOLEAN); + PARSER.declareField(constructorArg(), (parser, context) -> parser.text(), INDEX_PARSER, ObjectParser.ValueType.STRING); + } private boolean shardsAcked; private String index; @@ -85,24 +102,20 @@ public String index() { } public void addCustomFields(XContentBuilder builder) throws IOException { - builder.field("shards_acknowledged", isShardsAcked()); - builder.field("index", index()); + builder.field(SHARDS_ACKNOWLEDGED, isShardsAcked()); + builder.field(INDEX, index()); } - public static CreateIndexResponse fromXContent(XContentParser parser) throws IOException { - return PARSER.apply(parser, null); + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + addAcknowledgedField(builder); + addCustomFields(builder); + builder.endObject(); + return builder; } - private static final ParseField SHARDS_ACKNOWLEDGED = new ParseField("shards_acknowledged"); - private static final ParseField INDEX = new ParseField("index"); - - private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("create_index", - true, a -> new CreateIndexResponse((boolean) a[0], (boolean) a[1], (String) a[2])); - - static { - declareAcknowledgedField(PARSER); - PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), SHARDS_ACKNOWLEDGED, - ObjectParser.ValueType.BOOLEAN); - PARSER.declareField(constructorArg(), (parser, context) -> parser.text(), INDEX, ObjectParser.ValueType.STRING); + public static CreateIndexResponse fromXContent(XContentParser parser) throws IOException { + return PARSER.apply(parser, null); } } diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java index 8ad1be0018a83..8217668e2177d 100755 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponse.java @@ -23,6 +23,8 @@ import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ConstructingObjectParser; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import java.io.IOException; @@ -30,7 +32,14 @@ /** * A response for a delete index action. */ -public class DeleteIndexResponse extends AcknowledgedResponse { +public class DeleteIndexResponse extends AcknowledgedResponse implements ToXContentObject { + + private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("delete_index", + true, args -> new DeleteIndexResponse((boolean) args[0])); + + static { + declareAcknowledgedField(PARSER); + } DeleteIndexResponse() { } @@ -51,14 +60,15 @@ public void writeTo(StreamOutput out) throws IOException { writeAcknowledged(out); } - public static DeleteIndexResponse fromXContent(XContentParser parser) throws IOException { - return PARSER.apply(parser, null); + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + builder.startObject(); + addAcknowledgedField(builder); + builder.endObject(); + return builder; } - private static final ConstructingObjectParser PARSER = new ConstructingObjectParser<>("delete_index", - true, a -> new DeleteIndexResponse((boolean) a[0])); - - static { - declareAcknowledgedField(PARSER); + public static DeleteIndexResponse fromXContent(XContentParser parser) throws IOException { + return PARSER.apply(parser, null); } } diff --git a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java index 8568762214b92..e4467964722c6 100755 --- a/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java +++ b/core/src/main/java/org/elasticsearch/action/support/master/AcknowledgedResponse.java @@ -24,6 +24,8 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ConstructingObjectParser; import org.elasticsearch.common.xcontent.ObjectParser; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; @@ -35,6 +37,14 @@ */ public abstract class AcknowledgedResponse extends ActionResponse { + private static final String ACKNOWLEDGED = "acknowledged"; + private static final ParseField ACKNOWLEDGED_PARSER = new ParseField(ACKNOWLEDGED); + + protected static void declareAcknowledgedField(ConstructingObjectParser PARSER) { + PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), ACKNOWLEDGED_PARSER, + ObjectParser.ValueType.BOOLEAN); + } + private boolean acknowledged; protected AcknowledgedResponse() { @@ -67,9 +77,7 @@ protected void writeAcknowledged(StreamOutput out) throws IOException { out.writeBoolean(acknowledged); } - protected static final ParseField ACKNOWLEDGED = new ParseField("acknowledged"); - - protected static void declareAcknowledgedField(ConstructingObjectParser PARSER) { - PARSER.declareField(constructorArg(), (parser, context) -> parser.booleanValue(), ACKNOWLEDGED, ObjectParser.ValueType.BOOLEAN); + protected void addAcknowledgedField(XContentBuilder builder) throws IOException { + builder.field(ACKNOWLEDGED, isAcknowledged()); } } diff --git a/core/src/main/java/org/elasticsearch/index/get/GetResult.java b/core/src/main/java/org/elasticsearch/index/get/GetResult.java index a47bb8be89e37..75e283b4191b1 100644 --- a/core/src/main/java/org/elasticsearch/index/get/GetResult.java +++ b/core/src/main/java/org/elasticsearch/index/get/GetResult.java @@ -82,7 +82,7 @@ public GetResult(String index, String type, String id, long version, boolean exi } /** - * Does the document exists. + * Does the document exist. */ public boolean isExists() { return exists; diff --git a/core/src/main/java/org/elasticsearch/rest/action/AcknowledgedRestListener.java b/core/src/main/java/org/elasticsearch/rest/action/AcknowledgedRestListener.java index e12329f93a395..9f08c43fa0f3f 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/AcknowledgedRestListener.java +++ b/core/src/main/java/org/elasticsearch/rest/action/AcknowledgedRestListener.java @@ -36,6 +36,7 @@ public AcknowledgedRestListener(RestChannel channel) { @Override public RestResponse buildResponse(T response, XContentBuilder builder) throws Exception { + // TODO - Once AcknowledgedResponse implements ToXContent, this method should be updated to call response.toXContent. builder.startObject() .field(Fields.ACKNOWLEDGED, response.isAcknowledged()); addCustomFields(builder, response); diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java index 7ad0d8589d985..b0fdae9ca62b9 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexResponseTests.java @@ -20,12 +20,11 @@ package org.elasticsearch.action.admin.indices.create; import org.elasticsearch.Version; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.collect.Tuple; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; @@ -71,7 +70,13 @@ public void testSerializationWithOldVersion() throws IOException { } } - public void testFromXContent() throws IOException { + public void testToXContent() { + CreateIndexResponse response = new CreateIndexResponse(true, false, "index_name"); + String output = Strings.toString(response); + assertEquals("{\"acknowledged\":true,\"shards_acknowledged\":false,\"index\":\"index_name\"}", output); + } + + public void testToAndFromXContent() throws IOException { doFromXContentTestWithRandomFields(false); } @@ -85,14 +90,12 @@ public void testFromXContentWithRandomFields() throws IOException { } private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { - boolean humanReadable = randomBoolean(); - final XContentType xContentType = randomFrom(XContentType.values()); - final Tuple tuple = randomCreateIndexResponse(xContentType, humanReadable); - XContentBuilder CreateIndexResponseXContent = tuple.v1(); - CreateIndexResponse expectedCreateIndexResponse = tuple.v2(); + final CreateIndexResponse createIndexResponse = createTestItem(); - BytesReference originalBytes = CreateIndexResponseXContent.bytes(); + boolean humanReadable = randomBoolean(); + final XContentType xContentType = randomFrom(XContentType.values()); + BytesReference originalBytes = toShuffledXContent(createIndexResponse, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); BytesReference mutated; if (addRandomFields) { @@ -106,38 +109,19 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws assertNull(parser.nextToken()); } - assertCreateIndexResponse(expectedCreateIndexResponse, parsedCreateIndexResponse); - } - - public static void assertCreateIndexResponse(CreateIndexResponse expected, CreateIndexResponse actual) { - assertEquals(expected.index(), actual.index()); - assertEquals(expected.isShardsAcked(), actual.isShardsAcked()); - assertEquals(expected.isAcknowledged(), actual.isAcknowledged()); + assertEquals(createIndexResponse.index(), parsedCreateIndexResponse.index()); + assertEquals(createIndexResponse.isShardsAcked(), parsedCreateIndexResponse.isShardsAcked()); + assertEquals(createIndexResponse.isAcknowledged(), parsedCreateIndexResponse.isAcknowledged()); } /** - * Returns a tuple of an {@link XContentBuilder} and a {@link CreateIndexResponse}. - *

- * The left element is the actual {@link XContentBuilder} to serialize while the right element is the - * expected {@link CreateIndexResponse} after parsing. + * Returns a random {@link CreateIndexResponse}. */ - public static Tuple randomCreateIndexResponse( - XContentType xContentType, boolean humanReadable) throws IOException { - + private static CreateIndexResponse createTestItem() throws IOException { boolean acknowledged = randomBoolean(); boolean shardsAcked = acknowledged && randomBoolean(); String index = randomAlphaOfLength(5); - XContentBuilder builder = XContentFactory.contentBuilder(xContentType); - builder.humanReadable(humanReadable); - builder.startObject(); - builder.field("acknowledged", acknowledged); - builder.field("shards_acknowledged", shardsAcked); - builder.field("index", index); - builder.endObject(); - - CreateIndexResponse expected = new CreateIndexResponse(acknowledged, shardsAcked, index); - - return Tuple.tuple(builder, expected); + return new CreateIndexResponse(acknowledged, shardsAcked, index); } } diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java index 1b30c172ae7c0..4e036319ad95e 100755 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexResponseTests.java @@ -19,10 +19,9 @@ package org.elasticsearch.action.admin.indices.delete; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.bytes.BytesReference; -import org.elasticsearch.common.collect.Tuple; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.test.ESTestCase; @@ -33,7 +32,13 @@ public class DeleteIndexResponseTests extends ESTestCase { - public void testFromXContent() throws IOException { + public void testToXContent() { + DeleteIndexResponse response = new DeleteIndexResponse(true); + String output = Strings.toString(response); + assertEquals("{\"acknowledged\":true}", output); + } + + public void testToAndFromXContent() throws IOException { doFromXContentTestWithRandomFields(false); } @@ -47,14 +52,12 @@ public void testFromXContentWithRandomFields() throws IOException { } private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws IOException { - boolean humanReadable = randomBoolean(); - final XContentType xContentType = randomFrom(XContentType.values()); - final Tuple tuple = randomDeleteIndexResponse(xContentType, humanReadable); - XContentBuilder deleteIndexResponseXContent = tuple.v1(); - DeleteIndexResponse expectedDeleteIndexResponse = tuple.v2(); + final DeleteIndexResponse deleteIndexResponse = createTestItem(); - BytesReference originalBytes = deleteIndexResponseXContent.bytes(); + boolean humanReadable = randomBoolean(); + final XContentType xContentType = randomFrom(XContentType.values()); + BytesReference originalBytes = toShuffledXContent(deleteIndexResponse, xContentType, ToXContent.EMPTY_PARAMS, humanReadable); BytesReference mutated; if (addRandomFields) { @@ -68,28 +71,15 @@ private void doFromXContentTestWithRandomFields(boolean addRandomFields) throws assertNull(parser.nextToken()); } - assertEquals(expectedDeleteIndexResponse.isAcknowledged(), parsedDeleteIndexResponse.isAcknowledged()); + assertEquals(deleteIndexResponse.isAcknowledged(), parsedDeleteIndexResponse.isAcknowledged()); } /** - * Returns a tuple of an {@link XContentBuilder} and a {@link DeleteIndexResponse}. - *

- * The left element is the actual {@link XContentBuilder} to serialize while the right element is the - * expected {@link DeleteIndexResponse} after parsing. + * Returns a random {@link DeleteIndexResponse}. */ - public static Tuple randomDeleteIndexResponse( - XContentType xContentType, boolean humanReadable) throws IOException { - + private static DeleteIndexResponse createTestItem() throws IOException { boolean acknowledged = randomBoolean(); - XContentBuilder builder = XContentFactory.contentBuilder(xContentType); - builder.humanReadable(humanReadable); - builder.startObject(); - builder.field("acknowledged", acknowledged); - builder.endObject(); - - DeleteIndexResponse expected = new DeleteIndexResponse(acknowledged); - - return Tuple.tuple(builder, expected); + return new DeleteIndexResponse(acknowledged); } } diff --git a/docs/java-rest/high-level/apis/deleteindex.asciidoc b/docs/java-rest/high-level/apis/deleteindex.asciidoc index 72d2451cb3783..70b8159853f58 100644 --- a/docs/java-rest/high-level/apis/deleteindex.asciidoc +++ b/docs/java-rest/high-level/apis/deleteindex.asciidoc @@ -1,10 +1,10 @@ -[[java-rest-high-document-delete-index]] +[[java-rest-high-delete-index]] === Delete Index API -[[java-rest-high-document-delete-index-request]] +[[java-rest-high-delete-index-request]] ==== Delete Index Request -A `DeleteIndexRequest` requires an 'index' argument: +A `DeleteIndexRequest` requires an `index` argument: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- @@ -36,7 +36,7 @@ include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-reque <1> Setting `IndicesOptions` controls how unavailable indices are resolved and how wildcard expressions are expanded -[[java-rest-high-document-delete-index-sync]] +[[java-rest-high-delete-index-sync]] ==== Synchronous Execution ["source","java",subs="attributes,callouts,macros"] @@ -44,7 +44,7 @@ how wildcard expressions are expanded include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-execute] -------------------------------------------------- -[[java-rest-high-document-delete-index-async]] +[[java-rest-high-delete-index-async]] ==== Asynchronous Execution ["source","java",subs="attributes,callouts,macros"] @@ -55,7 +55,7 @@ include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-execu provided as an argument <2> Called in case of failure. The raised exception is provided as an argument -[[java-rest-high-document-delete-index-response]] +[[java-rest-high-delete-index-response]] ==== Delete Response The returned `DeleteResponse` allows to retrieve information about the executed @@ -68,9 +68,6 @@ include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-respo If the index was not found, an `ElasticsearchException` will be thrown: -If there is a version conflict, an `ElasticsearchException` will -be thrown: - ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-notfound] diff --git a/docs/java-rest/high-level/apis/index.asciidoc b/docs/java-rest/high-level/apis/index.asciidoc index b4dcf7e9d8037..2b3777892a368 100644 --- a/docs/java-rest/high-level/apis/index.asciidoc +++ b/docs/java-rest/high-level/apis/index.asciidoc @@ -1,4 +1,5 @@ include::_index.asciidoc[] +include::deleteindex.asciidoc[] include::get.asciidoc[] include::delete.asciidoc[] include::update.asciidoc[] From 1fe19fed33e1551c897a7d36026788c93f1aafc1 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Tue, 24 Oct 2017 09:37:45 +0100 Subject: [PATCH 09/13] Use lambdas in RequestTests --- .../elasticsearch/client/RequestTests.java | 77 ++++++++----------- 1 file changed, 32 insertions(+), 45 deletions(-) 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/RequestTests.java index 0be884e59927c..bc75f99663790 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -47,6 +47,7 @@ import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.lucene.uid.Versions; +import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentHelper; @@ -77,6 +78,7 @@ import java.util.StringJoiner; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Supplier; import static java.util.Collections.singletonMap; import static org.elasticsearch.client.Request.enforceSameContentType; @@ -142,7 +144,7 @@ public void testDelete() throws IOException { Map expectedParams = new HashMap<>(); - setRandomTimeout(deleteRequest, expectedParams); + setRandomTimeout(deleteRequest::timeout, ReplicationRequest.DEFAULT_TIMEOUT, expectedParams); setRandomRefreshPolicy(deleteRequest, expectedParams); setRandomVersion(deleteRequest, expectedParams); setRandomVersionType(deleteRequest, expectedParams); @@ -255,24 +257,10 @@ public void testDeleteIndex() throws IOException { Map expectedParams = new HashMap<>(); - setRandomTimeout(deleteIndexRequest, expectedParams); + setRandomTimeout(deleteIndexRequest::timeout, AcknowledgedRequest.DEFAULT_ACK_TIMEOUT, expectedParams); setRandomMasterTimeout(deleteIndexRequest, expectedParams); - if (randomBoolean()) { - deleteIndexRequest.indicesOptions(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), - randomBoolean())); - } - expectedParams.put("ignore_unavailable", Boolean.toString(deleteIndexRequest.indicesOptions().ignoreUnavailable())); - expectedParams.put("allow_no_indices", Boolean.toString(deleteIndexRequest.indicesOptions().allowNoIndices())); - if (deleteIndexRequest.indicesOptions().expandWildcardsOpen() && deleteIndexRequest.indicesOptions().expandWildcardsClosed()) { - expectedParams.put("expand_wildcards", "open,closed"); - } else if (deleteIndexRequest.indicesOptions().expandWildcardsOpen()) { - expectedParams.put("expand_wildcards", "open"); - } else if (deleteIndexRequest.indicesOptions().expandWildcardsClosed()) { - expectedParams.put("expand_wildcards", "closed"); - } else { - expectedParams.put("expand_wildcards", "none"); - } + setRandomIndicesOptions(deleteIndexRequest::indicesOptions, deleteIndexRequest::indicesOptions, expectedParams); Request request = Request.deleteIndex(deleteIndexRequest); assertEquals("/" + String.join(",", indices), request.getEndpoint()); @@ -281,6 +269,8 @@ public void testDeleteIndex() throws IOException { assertNull(request.getEntity()); } + + public void testIndex() throws IOException { String index = randomAlphaOfLengthBetween(3, 10); String type = randomAlphaOfLengthBetween(3, 10); @@ -299,7 +289,7 @@ public void testIndex() throws IOException { } } - setRandomTimeout(indexRequest, expectedParams); + setRandomTimeout(indexRequest::timeout, ReplicationRequest.DEFAULT_TIMEOUT, expectedParams); setRandomRefreshPolicy(indexRequest, expectedParams); // There is some logic around _create endpoint and version/version type @@ -719,20 +709,7 @@ public void testSearch() throws Exception { expectedParams.put("scroll", searchRequest.scroll().keepAlive().getStringRep()); } - if (randomBoolean()) { - searchRequest.indicesOptions(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean())); - } - expectedParams.put("ignore_unavailable", Boolean.toString(searchRequest.indicesOptions().ignoreUnavailable())); - expectedParams.put("allow_no_indices", Boolean.toString(searchRequest.indicesOptions().allowNoIndices())); - if (searchRequest.indicesOptions().expandWildcardsOpen() && searchRequest.indicesOptions().expandWildcardsClosed()) { - expectedParams.put("expand_wildcards", "open,closed"); - } else if (searchRequest.indicesOptions().expandWildcardsOpen()) { - expectedParams.put("expand_wildcards", "open"); - } else if (searchRequest.indicesOptions().expandWildcardsClosed()) { - expectedParams.put("expand_wildcards", "closed"); - } else { - expectedParams.put("expand_wildcards", "none"); - } + setRandomIndicesOptions(searchRequest::indicesOptions, searchRequest::indicesOptions, expectedParams); SearchSourceBuilder searchSourceBuilder = null; if (frequently()) { @@ -944,13 +921,33 @@ private static void randomizeFetchSourceContextParams(Consumer request, Map expectedParams) { + private static void setRandomIndicesOptions(Function setter, Supplier getter, + Map expectedParams) { + + if (randomBoolean()) { + setter.apply(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), + randomBoolean())); + } + expectedParams.put("ignore_unavailable", Boolean.toString(getter.get().ignoreUnavailable())); + expectedParams.put("allow_no_indices", Boolean.toString(getter.get().allowNoIndices())); + if (getter.get().expandWildcardsOpen() && getter.get().expandWildcardsClosed()) { + expectedParams.put("expand_wildcards", "open,closed"); + } else if (getter.get().expandWildcardsOpen()) { + expectedParams.put("expand_wildcards", "open"); + } else if (getter.get().expandWildcardsClosed()) { + expectedParams.put("expand_wildcards", "closed"); + } else { + expectedParams.put("expand_wildcards", "none"); + } + } + + private static void setRandomTimeout(Function setter, TimeValue defaultTimeout, Map expectedParams) { if (randomBoolean()) { String timeout = randomTimeValue(); - request.timeout(timeout); + setter.apply(timeout); expectedParams.put("timeout", timeout); } else { - expectedParams.put("timeout", AcknowledgedRequest.DEFAULT_ACK_TIMEOUT.getStringRep()); + expectedParams.put("timeout", defaultTimeout.getStringRep()); } } @@ -964,16 +961,6 @@ private static void setRandomMasterTimeout(MasterNodeRequest request, Map request, Map expectedParams) { - if (randomBoolean()) { - String timeout = randomTimeValue(); - request.timeout(timeout); - expectedParams.put("timeout", timeout); - } else { - expectedParams.put("timeout", ReplicationRequest.DEFAULT_TIMEOUT.getStringRep()); - } - } - private static void setRandomRefreshPolicy(ReplicatedWriteRequest request, Map expectedParams) { if (randomBoolean()) { WriteRequest.RefreshPolicy refreshPolicy = randomFrom(WriteRequest.RefreshPolicy.values()); From ec05d37cc211c02e251e1cf15a4f778f63924343 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Tue, 24 Oct 2017 12:37:39 +0100 Subject: [PATCH 10/13] Mark-ups --- .../test/java/org/elasticsearch/client/RequestTests.java | 2 -- .../documentation/IndicesClientDocumentationIT.java | 2 +- docs/java-rest/high-level/apis/deleteindex.asciidoc | 9 +++++---- docs/java-rest/high-level/apis/index.asciidoc | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) 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/RequestTests.java index bc75f99663790..3ef91b296441a 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -269,8 +269,6 @@ public void testDeleteIndex() throws IOException { assertNull(request.getEntity()); } - - public void testIndex() throws IOException { String index = randomAlphaOfLengthBetween(3, 10); String type = randomAlphaOfLengthBetween(3, 10); diff --git a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java index 0fafa1f6a3bb0..e866fb92aae67 100644 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/documentation/IndicesClientDocumentationIT.java @@ -67,7 +67,7 @@ public void testDeleteIndex() throws IOException { assertTrue(deleteIndexResponse.isAcknowledged()); // tag::delete-index-response - boolean acknowledged = deleteIndexResponse.isAcknowledged(); + boolean acknowledged = deleteIndexResponse.isAcknowledged(); // <1> // end::delete-index-response // tag::delete-index-execute-async diff --git a/docs/java-rest/high-level/apis/deleteindex.asciidoc b/docs/java-rest/high-level/apis/deleteindex.asciidoc index 70b8159853f58..3c0627de49a92 100644 --- a/docs/java-rest/high-level/apis/deleteindex.asciidoc +++ b/docs/java-rest/high-level/apis/deleteindex.asciidoc @@ -19,8 +19,8 @@ The following arguments can optionally be provided: -------------------------------------------------- include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-request-timeout] -------------------------------------------------- -<1> Timeout to wait for primary shard to become available as a `TimeValue` -<2> Timeout to wait for primary shard to become available as a `String` +<1> Timeout to wait for the all the nodes to acknowledge the index deletion as a `TimeValue` +<2> Timeout to wait for the all the nodes to acknowledge the index deletion as a `String` ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- @@ -56,15 +56,16 @@ provided as an argument <2> Called in case of failure. The raised exception is provided as an argument [[java-rest-high-delete-index-response]] -==== Delete Response +==== Delete Index Response -The returned `DeleteResponse` allows to retrieve information about the executed +The returned `DeleteIndexResponse` allows to retrieve information about the executed operation as follows: ["source","java",subs="attributes,callouts,macros"] -------------------------------------------------- include-tagged::{doc-tests}/IndicesClientDocumentationIT.java[delete-index-response] -------------------------------------------------- +<1> Indicates whether all of the nodes have acknowledged the request or not If the index was not found, an `ElasticsearchException` will be thrown: diff --git a/docs/java-rest/high-level/apis/index.asciidoc b/docs/java-rest/high-level/apis/index.asciidoc index 2b3777892a368..993951b5ae7f5 100644 --- a/docs/java-rest/high-level/apis/index.asciidoc +++ b/docs/java-rest/high-level/apis/index.asciidoc @@ -1,5 +1,5 @@ -include::_index.asciidoc[] include::deleteindex.asciidoc[] +include::_index.asciidoc[] include::get.asciidoc[] include::delete.asciidoc[] include::update.asciidoc[] From 63ba5b5d927a2f5c40a6cbdd080159805324da58 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Tue, 24 Oct 2017 18:39:40 +0100 Subject: [PATCH 11/13] Simplify lambda --- .../test/java/org/elasticsearch/client/RequestTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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/RequestTests.java index 3ef91b296441a..4045dba300ae4 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -919,11 +919,11 @@ private static void randomizeFetchSourceContextParams(Consumer void setRandomIndicesOptions(Function setter, Supplier getter, - Map expectedParams) { + private static void setRandomIndicesOptions(Consumer setter, Supplier getter, + Map expectedParams) { if (randomBoolean()) { - setter.apply(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), + setter.accept(IndicesOptions.fromOptions(randomBoolean(), randomBoolean(), randomBoolean(), randomBoolean())); } expectedParams.put("ignore_unavailable", Boolean.toString(getter.get().ignoreUnavailable())); From afdcb40b8fa26271ace88752f77a509036e94ac9 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Tue, 24 Oct 2017 19:02:42 +0100 Subject: [PATCH 12/13] Simplified lambda --- .../src/test/java/org/elasticsearch/client/RequestTests.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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/RequestTests.java index 4045dba300ae4..cd7c90b64dd09 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -939,10 +939,10 @@ private static void setRandomIndicesOptions(Consumer setter, Sup } } - private static void setRandomTimeout(Function setter, TimeValue defaultTimeout, Map expectedParams) { + private static void setRandomTimeout(Consumer setter, TimeValue defaultTimeout, Map expectedParams) { if (randomBoolean()) { String timeout = randomTimeValue(); - setter.apply(timeout); + setter.accept(timeout); expectedParams.put("timeout", timeout); } else { expectedParams.put("timeout", defaultTimeout.getStringRep()); From c8620a99aa5bfeffb91bfe2fc2d20f1e90bdfcf9 Mon Sep 17 00:00:00 2001 From: Catalin Ursachi Date: Wed, 25 Oct 2017 13:00:43 +0100 Subject: [PATCH 13/13] Deleted redundant type parameter --- .../src/test/java/org/elasticsearch/client/RequestTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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/RequestTests.java index cd7c90b64dd09..3be250d513d21 100755 --- a/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java +++ b/client/rest-high-level/src/test/java/org/elasticsearch/client/RequestTests.java @@ -939,7 +939,7 @@ private static void setRandomIndicesOptions(Consumer setter, Sup } } - private static void setRandomTimeout(Consumer setter, TimeValue defaultTimeout, Map expectedParams) { + private static void setRandomTimeout(Consumer setter, TimeValue defaultTimeout, Map expectedParams) { if (randomBoolean()) { String timeout = randomTimeValue(); setter.accept(timeout);